From e239bb690aa9c78c2878572f272fb12da7888faf Mon Sep 17 00:00:00 2001 From: Adrian Leonhard Date: Tue, 31 Mar 2020 21:57:37 +0200 Subject: [PATCH] init v2.0.2 . --- .gitignore | 92 + .vscode/launch.json | 27 + .vscode/settings.json | 14 + CONTRIBUTING.md | 21 + zedd-app/.eslintrc.js | 23 + zedd-app/genIcons.tsconfig.json | 28 + zedd-app/genIcons.tsx | 47 + zedd-app/package-lock.json | 15703 ++++++++++++++++ zedd-app/package.json | 156 + zedd-app/src/AppState.test.ts | 397 + zedd-app/src/AppState.ts | 680 + zedd-app/src/ClarityState.ts | 152 + zedd-app/src/ZeddSettings.ts | 92 + zedd-app/src/chromeDriverMgmt.ts | 87 + zedd-app/src/components/AppBody.tsx | 317 + zedd-app/src/components/AppGui.tsx | 125 + zedd-app/src/components/BlockDisplay.tsx | 123 + zedd-app/src/components/Calendar.tsx | 425 + .../src/components/ChangeSliceTaskDialog.tsx | 61 + zedd-app/src/components/ClarityTaskSelect.tsx | 72 + zedd-app/src/components/ClarityView.tsx | 257 + zedd-app/src/components/ErrorBoundary.tsx | 41 + zedd-app/src/components/RenameTaskDialog.tsx | 50 + zedd-app/src/components/SettingsDialog.tsx | 361 + zedd-app/src/components/TaskEditor.tsx | 171 + zedd-app/src/components/TaskSelect.tsx | 194 + zedd-app/src/components/TitleBar.tsx | 171 + zedd-app/src/components/ZeddSvgIcon.tsx | 70 + zedd-app/src/feiertage.json | 35 + zedd-app/src/index.css | 47 + zedd-app/src/index.html | 21 + zedd-app/src/main.ts | 118 + zedd-app/src/plJiraConnector.ts | 160 + zedd-app/src/renderer.ts | 356 + zedd-app/src/toast-template.xml | 13 + zedd-app/src/typings.d.ts | 4 + zedd-app/src/util.test.ts | 28 + zedd-app/src/util.ts | 189 + zedd-app/tsconfig.json | 33 + zedd-app/tslint.json | 36 + zedd-app/webpack.main.config.js | 11 + zedd-app/webpack.renderer.config.js | 37 + zedd-app/webpack.rules.js | 62 + zedd-clarity/.gitignore | 2 + zedd-clarity/package-lock.json | 633 + zedd-clarity/package.json | 41 + zedd-clarity/src/index.ts | 713 + zedd-clarity/tsconfig.json | 58 + zedd-win32/.gitignore | 17 + zedd-win32/.npmignore | 9 + zedd-win32/LICENSE | 23 + zedd-win32/README.md | 40 + zedd-win32/bin/win32-x64-75/zedd-win32.node | Bin 0 -> 136704 bytes zedd-win32/binding.gyp | 14 + zedd-win32/index.d.ts | 7 + zedd-win32/index.js | 1 + zedd-win32/package.json | 24 + zedd-win32/tsconfig.json | 59 + zedd-win32/zedd-win32.cpp | 150 + 59 files changed, 22898 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 CONTRIBUTING.md create mode 100644 zedd-app/.eslintrc.js create mode 100644 zedd-app/genIcons.tsconfig.json create mode 100644 zedd-app/genIcons.tsx create mode 100644 zedd-app/package-lock.json create mode 100644 zedd-app/package.json create mode 100644 zedd-app/src/AppState.test.ts create mode 100644 zedd-app/src/AppState.ts create mode 100644 zedd-app/src/ClarityState.ts create mode 100644 zedd-app/src/ZeddSettings.ts create mode 100644 zedd-app/src/chromeDriverMgmt.ts create mode 100644 zedd-app/src/components/AppBody.tsx create mode 100644 zedd-app/src/components/AppGui.tsx create mode 100644 zedd-app/src/components/BlockDisplay.tsx create mode 100644 zedd-app/src/components/Calendar.tsx create mode 100644 zedd-app/src/components/ChangeSliceTaskDialog.tsx create mode 100644 zedd-app/src/components/ClarityTaskSelect.tsx create mode 100644 zedd-app/src/components/ClarityView.tsx create mode 100644 zedd-app/src/components/ErrorBoundary.tsx create mode 100644 zedd-app/src/components/RenameTaskDialog.tsx create mode 100644 zedd-app/src/components/SettingsDialog.tsx create mode 100644 zedd-app/src/components/TaskEditor.tsx create mode 100644 zedd-app/src/components/TaskSelect.tsx create mode 100644 zedd-app/src/components/TitleBar.tsx create mode 100644 zedd-app/src/components/ZeddSvgIcon.tsx create mode 100644 zedd-app/src/feiertage.json create mode 100644 zedd-app/src/index.css create mode 100644 zedd-app/src/index.html create mode 100644 zedd-app/src/main.ts create mode 100644 zedd-app/src/plJiraConnector.ts create mode 100644 zedd-app/src/renderer.ts create mode 100644 zedd-app/src/toast-template.xml create mode 100644 zedd-app/src/typings.d.ts create mode 100644 zedd-app/src/util.test.ts create mode 100644 zedd-app/src/util.ts create mode 100644 zedd-app/tsconfig.json create mode 100644 zedd-app/tslint.json create mode 100644 zedd-app/webpack.main.config.js create mode 100644 zedd-app/webpack.renderer.config.js create mode 100644 zedd-app/webpack.rules.js create mode 100644 zedd-clarity/.gitignore create mode 100644 zedd-clarity/package-lock.json create mode 100644 zedd-clarity/package.json create mode 100644 zedd-clarity/src/index.ts create mode 100644 zedd-clarity/tsconfig.json create mode 100644 zedd-win32/.gitignore create mode 100644 zedd-win32/.npmignore create mode 100644 zedd-win32/LICENSE create mode 100644 zedd-win32/README.md create mode 100644 zedd-win32/bin/win32-x64-75/zedd-win32.node create mode 100644 zedd-win32/binding.gyp create mode 100644 zedd-win32/index.d.ts create mode 100644 zedd-win32/index.js create mode 100644 zedd-win32/package.json create mode 100644 zedd-win32/tsconfig.json create mode 100644 zedd-win32/zedd-win32.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..be56c06 --- /dev/null +++ b/.gitignore @@ -0,0 +1,92 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock +.DS_Store + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# 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 + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Webpack +.webpack/ + +# Electron-Forge +out/ + +.vs +zedd-app/icons diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..9c21d02 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,27 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "electron@7.0.0 install", + "env": { + "ELECTRON_MIRROR": "https://npm.taobao.org/mirrors/electron/", + "DEBUG": "*" + }, + "program": "${workspaceFolder}/zedd-app/node_modules/electron/install.js", + "outFiles": ["${workspaceFolder}/**/*.js"], + "cwd": "${workspaceFolder}/zedd-app" + }, + { + "type": "node", + "request": "launch", + "name": "Launch Program", + "program": "${workspaceFolder}\\zedd-app\\src\\sq.js", + "outFiles": ["${workspaceFolder}/**/*.js"] + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9216b4a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "editor.formatOnSave": true, + "mocha.requires": [ + "ts-node/register" + ], + "mocha.files.glob": "src/**/*.test.ts", + "mocha.subdirectory": "zedd-app", + "mocha.env": { + "TS_NODE_TRANSPILE_ONLY": "1", + "TS_NODE_COMPILER_OPTIONS": "{\"module\":\"commonjs\"}" + }, + "eslint.nodePath": "zedd-app/node_modules", + "eslint.alwaysShowStatus": true +} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5312275 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,21 @@ +##Prerequisistes + +1. Node 12+ +2. Win 10 SDK (min (possibly exactly) Build 14393) +3. VC++ 2017 (if you get an error about a missing platform.winmd, try installing VC++ 2015 too) + +```sh +git clone https://github.com/NaridaL/zedd.git +cd zedd + +cd zedd-clarity +npm install +npm run build + +cd .. + +cd zedd-app +npm install +npm run genicons +npm run start +``` diff --git a/zedd-app/.eslintrc.js b/zedd-app/.eslintrc.js new file mode 100644 index 0000000..bd50662 --- /dev/null +++ b/zedd-app/.eslintrc.js @@ -0,0 +1,23 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint', 'react-hooks'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/eslint-recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react/recommended', + 'prettier/@typescript-eslint', + ], + rules: { + 'yoda': ['warn', 'always', { "onlyEquality": true }], + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-inferrable-types': 'off', + 'eqeqeq': 'error', + '@typescript-eslint/no-unused-vars': ['warn', { 'varsIgnorePattern': '^_' }], + 'no-constant-condition': ['warn', { checkLoops: false }] + }, +} diff --git a/zedd-app/genIcons.tsconfig.json b/zedd-app/genIcons.tsconfig.json new file mode 100644 index 0000000..3561f7f --- /dev/null +++ b/zedd-app/genIcons.tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "removeComments": false, + "preserveConstEnums": true, + "sourceMap": true, + "declaration": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "suppressImplicitAnyIndexErrors": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "noImplicitThis": true, + "allowJs": true, + "noUnusedParameters": true, + "importHelpers": true, + "noEmitHelpers": true, + "module": "commonjs", + "resolveJsonModule": true, + "noEmit": true, + "moduleResolution": "node", + "pretty": true, + "target": "esnext", + "jsx": "react", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true + } +} diff --git a/zedd-app/genIcons.tsx b/zedd-app/genIcons.tsx new file mode 100644 index 0000000..42aa682 --- /dev/null +++ b/zedd-app/genIcons.tsx @@ -0,0 +1,47 @@ +import { promises as fsp } from 'fs' +import * as React from 'react' +import * as ReactDOMServer from 'react-dom/server' +// import icongen = require('icon-gen') +const { convertFile } = require('convert-svg-to-png') +import { convert as icoConvert } from '@fiahfy/ico-convert' + +import { ZeddSvgIcon } from './src/components/ZeddSvgIcon' + +async function genIcon(name: string, svg: (res: number) => React.ReactElement) { + const ress = [16, 24, 128] + for (const res of ress) { + const svgString = ReactDOMServer.renderToStaticMarkup(svg(res)) + const svgFile = `./icons/${name}_${res}.svg` + await fsp.writeFile(svgFile, svgString, 'utf8') + // await icongen(svgFile, './icons', { + // report: true, + // ico: { + // name, + // // sizes: [16, 24, 32, 48, 64, 128, 256], + // sizes: [24], + // }, + // }) + await convertFile(svgFile, { + outputFilePath: `./icons/${name}_${res}.png`, + }) + } + const icoData = await icoConvert( + await Promise.all(ress.map(res => fsp.readFile(`./icons/${name}_${res}.png`))), + ) + await fsp.writeFile(`./icons/${name}.ico`, icoData) +} + +;(async () => { + await fsp.mkdir('icons') + const NUMBER_OF_SAMPLES = 13 + await genIcon('paused', res => ) + for (let i = 0; i < NUMBER_OF_SAMPLES; i++) { + const progress = i / (NUMBER_OF_SAMPLES - 1) + await genIcon('progress' + i, res => ( + + )) + } + await genIcon('app', res => ( + + )) +})() diff --git a/zedd-app/package-lock.json b/zedd-app/package-lock.json new file mode 100644 index 0000000..f245099 --- /dev/null +++ b/zedd-app/package-lock.json @@ -0,0 +1,15703 @@ +{ + "name": "zedd-app", + "version": "2.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz", + "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==", + "dev": true, + "requires": { + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.3.tgz", + "integrity": "sha512-RpxM252EYsz9qLUIq6F7YJyK1sv0wWDBFuztfDGWaQKzHjqDHysxSiRUpA/X9jmfqo+WzkAVKFaUily5h+gDCQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz", + "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz", + "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz", + "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz", + "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-regex": "^7.8.3", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz", + "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/types": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz", + "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz", + "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@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": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz", + "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==", + "dev": true, + "requires": { + "lodash": "^4.17.13" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz", + "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-wrap-function": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@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": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz", + "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, + "@babel/helpers": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.3.tgz", + "integrity": "sha512-E6SpIDJZ0cZAKoCNk+qSDd0ChfTnpiJN9FfNf3RZ20dzwA2vL2oq5IX1XTVT+4vDmRlta2nGk5HGMMskJAR+4A==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz", + "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz", + "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz", + "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz", + "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz", + "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.8", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz", + "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz", + "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz", + "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz", + "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz", + "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-remap-async-to-generator": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz", + "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz", + "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "lodash": "^4.17.13" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz", + "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-define-map": "^7.8.3", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-split-export-declaration": "^7.8.3", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz", + "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz", + "integrity": "sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz", + "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz", + "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz", + "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz", + "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz", + "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz", + "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz", + "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz", + "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz", + "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-simple-access": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz", + "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.8.3", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz", + "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz", + "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz", + "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz", + "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz", + "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz", + "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz", + "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz", + "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz", + "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz", + "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz", + "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-regex": "^7.8.3" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz", + "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz", + "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.0.tgz", + "integrity": "sha512-GRffJyCu16H3tEhbt9Q4buVFFBqrgS8FzTuhqSxlXNgmqD8aw2xmwtRwrvWXXlw7gHs664uqacsJymHJ9SUE/Q==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-typescript": "^7.8.3" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz", + "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/preset-env": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-typescript": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", + "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-typescript": "^7.9.0" + } + }, + "@babel/runtime": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz", + "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz", + "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==", + "dev": true, + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@electron-forge/async-ora": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/async-ora/-/async-ora-6.0.0-beta.50.tgz", + "integrity": "sha512-FYETvsr2oBvOy8jIyOitk4whb86gu1e2v/Uqmcnw4HW7lfYqHS9HiSc9xUI+9bM3csdzCO+pdbhbQfqolisLVg==", + "dev": true, + "requires": { + "colors": "^1.4.0", + "debug": "^4.1.0", + "log-symbols": "^3.0.0", + "ora": "^4.0.3", + "pretty-ms": "^6.0.0" + } + }, + "@electron-forge/cli": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.0.0-beta.50.tgz", + "integrity": "sha512-/Vd41Y4+nTYSRRbf1zG4d/64TzK61xc79u4+cHdoaa7svo28x0hmuNMlmV9dwqGAIeB8V1GeKYPKW0tEswOr2g==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/core": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "@electron/get": "^1.7.6", + "colors": "^1.4.0", + "commander": "^4.1.1", + "debug": "^4.1.0", + "fs-extra": "^8.1.0", + "inquirer": "^7.0.4", + "semver": "^7.1.3" + } + }, + "@electron-forge/core": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.0.0-beta.50.tgz", + "integrity": "sha512-nmVd6Xiw+K0oT1uVQiX2LGrDHeiZCadm2LbT1Pls9JG+QtEm2iKh64wdUXnVZCKnd6utdGrucPBQ86MfFwhiLA==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/installer-base": "6.0.0-beta.50", + "@electron-forge/installer-deb": "6.0.0-beta.50", + "@electron-forge/installer-dmg": "6.0.0-beta.50", + "@electron-forge/installer-exe": "6.0.0-beta.50", + "@electron-forge/installer-rpm": "6.0.0-beta.50", + "@electron-forge/installer-zip": "6.0.0-beta.50", + "@electron-forge/maker-base": "6.0.0-beta.50", + "@electron-forge/plugin-base": "6.0.0-beta.50", + "@electron-forge/publisher-base": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "@electron-forge/template-base": "6.0.0-beta.50", + "@electron-forge/template-typescript": "6.0.0-beta.50", + "@electron-forge/template-typescript-webpack": "6.0.0-beta.50", + "@electron-forge/template-webpack": "6.0.0-beta.50", + "@electron/get": "^1.7.6", + "@malept/cross-spawn-promise": "^1.0.0", + "colors": "^1.4.0", + "debug": "^4.1.0", + "electron-packager": "^14.2.0", + "electron-rebuild": "^1.8.6", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.5", + "lodash": "^4.17.15", + "log-symbols": "^3.0.0", + "node-fetch": "^2.6.0", + "nugget": "^2.0.1", + "resolve-package": "^1.0.1", + "semver": "^7.1.3", + "source-map-support": "^0.5.13", + "sudo-prompt": "^9.1.1", + "username": "^5.1.0", + "yarn-or-npm": "^3.0.1" + } + }, + "@electron-forge/installer-base": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-base/-/installer-base-6.0.0-beta.50.tgz", + "integrity": "sha512-Is3DEEkTxxt4+4WJbU2nrHsHTdOebIusNlkH5Wv4Nylqe13LN3i+tCHUHjLOsHkAVZqRdYwC2xBhJb/xjs07SA==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50" + } + }, + "@electron-forge/installer-darwin": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-darwin/-/installer-darwin-6.0.0-beta.50.tgz", + "integrity": "sha512-PlO2rUTkverFSzN3A4f32kEHRy/hrd0rIdrwZWmRxp4htbeQo2i1GRDUUflnC7Irbm/PVl8taQmCvuND4WiCxw==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/installer-base": "6.0.0-beta.50", + "fs-extra": "^8.1.0", + "sudo-prompt": "^9.1.1" + } + }, + "@electron-forge/installer-deb": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-deb/-/installer-deb-6.0.0-beta.50.tgz", + "integrity": "sha512-gJ6oN/0DqrUVe9tATWh2gZbcmDP3UV3lN/i5JJYP0QJKlHdvOFzmhgFA7SnDAb5QdAsM/YM0L8Gj+dxsoOPLbw==", + "dev": true, + "requires": { + "@electron-forge/installer-linux": "6.0.0-beta.50" + } + }, + "@electron-forge/installer-dmg": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-dmg/-/installer-dmg-6.0.0-beta.50.tgz", + "integrity": "sha512-VxWaS1Qor1tU/N2oyEyeAECxmVt0OhG2vzVpQUhWjWqPW3w3/FYNhDdaLKSQI/1PYwp/ZRLjrbS3Y6kKMKk4zw==", + "dev": true, + "requires": { + "@electron-forge/installer-darwin": "6.0.0-beta.50", + "@malept/cross-spawn-promise": "^1.0.0", + "debug": "^4.1.0", + "fs-extra": "^8.1.0" + } + }, + "@electron-forge/installer-exe": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-exe/-/installer-exe-6.0.0-beta.50.tgz", + "integrity": "sha512-a+u/AzCAHIdpt4QDy+FQGNEy6cTwzeKM+1bFHVSsnPn5TTPfAZJgyjyC+raIAaC+zQnnRGTVjfc6irj3dGU9qw==", + "dev": true, + "requires": { + "@electron-forge/installer-base": "6.0.0-beta.50", + "open": "^7.0.1" + } + }, + "@electron-forge/installer-linux": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-linux/-/installer-linux-6.0.0-beta.50.tgz", + "integrity": "sha512-iZoLQrNpU13pfF7KpSRKsc7Ecem28ug0QLnimOtZMvj9HuZXQ+pYJB8KvKrd0YqdGM8PMqQO8eLiYSerxc4heg==", + "dev": true, + "requires": { + "@electron-forge/installer-base": "6.0.0-beta.50", + "sudo-prompt": "^9.1.1" + } + }, + "@electron-forge/installer-rpm": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-rpm/-/installer-rpm-6.0.0-beta.50.tgz", + "integrity": "sha512-24duyDmAdcvjtQAuVYUCaZWK8IBF1qg93aXyb8+lyPGa5M8zcsKF58gUzkx89QDqvMXSoeitrtHC1RczE4h8vg==", + "dev": true, + "requires": { + "@electron-forge/installer-linux": "6.0.0-beta.50" + } + }, + "@electron-forge/installer-zip": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/installer-zip/-/installer-zip-6.0.0-beta.50.tgz", + "integrity": "sha512-ZMnBAL781AU8b+/zZl07n2HnN8tzfe6tnfhiZ343QG6/VA3l/RdoJ5kzA0MXsXjWl+T8OBep68Xr+p9uwmC2YQ==", + "dev": true, + "requires": { + "@electron-forge/installer-darwin": "6.0.0-beta.50", + "@malept/cross-spawn-promise": "^1.0.0", + "fs-extra": "^8.1.0" + } + }, + "@electron-forge/maker-base": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.0-beta.50.tgz", + "integrity": "sha512-6qGJTWm0qYMMDr7thM8b13eSbWn76lOAhOFHljA9nJOMkuI6mNKg/J7HWdozXaaIvzOyHQexXq1FEummXS5coQ==", + "dev": true, + "requires": { + "@electron-forge/shared-types": "6.0.0-beta.50", + "fs-extra": "^8.1.0", + "which": "^2.0.2" + } + }, + "@electron-forge/maker-deb": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.0.0-beta.50.tgz", + "integrity": "sha512-IrU8TLhOIzIhoIEZOmo4PMIy2r1xM3W3xo2W2IOLhIRRRUo1/AfcW+AjGWbpsuLXT2dByezhHKrYY6akhcpopg==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "electron-installer-debian": "^3.0.0" + } + }, + "@electron-forge/maker-rpm": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.0.0-beta.50.tgz", + "integrity": "sha512-GkvNUnb8O4O8pgNPklxwXLRxu/Rd3zCYQ49vkOxl48sUFeM0Nt88fRi/ovFsFTEI+lee7jGsksGx3G6mvbrfiA==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "electron-installer-redhat": "^3.0.0" + } + }, + "@electron-forge/maker-squirrel": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.0.0-beta.50.tgz", + "integrity": "sha512-9H9m7mO+wUNYjkOOxe93Pfpy/EQTSC8kxU1r2QVyzwCwP+JlQ9TBVjRSvX3KPypvFp/u7yXWPMFF3LlOkR0kqw==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "electron-winstaller": "^4.0.0", + "fs-extra": "^8.1.0" + } + }, + "@electron-forge/maker-zip": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.0.0-beta.50.tgz", + "integrity": "sha512-EPrj7KRG/vvo1y1MoTLcnBh3gqX+xPc7kUY7LLUIXs2C68G4k8Tm29YfQEQQbQK/HY+raDnvNjeZemvui/1PXQ==", + "dev": true, + "requires": { + "@electron-forge/maker-base": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "cross-zip": "^3.0.0", + "fs-extra": "^8.1.0" + } + }, + "@electron-forge/plugin-base": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.0-beta.50.tgz", + "integrity": "sha512-Cxat2MQFBmQ7uOZK01CNJ/hzH3e/5eT4huojv/m3mrCVnThuxj+BpaTJgJUQfdu4c2mvakzPcoF9oXZfkpVgtA==", + "dev": true, + "requires": { + "@electron-forge/shared-types": "6.0.0-beta.50" + } + }, + "@electron-forge/plugin-webpack": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-webpack/-/plugin-webpack-6.0.0-beta.50.tgz", + "integrity": "sha512-fL/KD5iiA49mA8fQ793n2+FB8LSCtxTIIoJ4BPbWREA/rS5H3HocsTp1XT2+zylJWLe3022H2WkvDkybbfh4Yg==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/plugin-base": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "@electron-forge/web-multi-logger": "6.0.0-beta.50", + "debug": "^4.1.0", + "express": "^4.17.1", + "fs-extra": "^8.1.0", + "global": "^4.3.2", + "html-webpack-plugin": "^3.2.0", + "webpack": "^4.41.6", + "webpack-dev-middleware": "^3.7.2", + "webpack-hot-middleware": "^2.25.0", + "webpack-merge": "^4.2.2" + } + }, + "@electron-forge/publisher-base": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.0.0-beta.50.tgz", + "integrity": "sha512-C04IusjCmaRbHYPjO6AjO3uRAlQsA06Frw678O+ftWKk0DZMXwrrczINzHd/xzP0BqD5H9AbjI72HIWEBsVj+Q==", + "dev": true + }, + "@electron-forge/shared-types": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.0-beta.50.tgz", + "integrity": "sha512-Vg6kCqhkc6xCqKMTubgZ6eh1hTWDx0C7Lg2cmD76vImUUyi87sxk/nOcvNqXm2dndtASDSglAbp4/1tN+aQBvw==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@types/electron-packager": "^14.0.0", + "electron-rebuild": "^1.8.6", + "ora": "^4.0.3" + } + }, + "@electron-forge/template-base": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.0.0-beta.50.tgz", + "integrity": "sha512-zMhRRYuAlRY4PNEdV1DUia7spSANi8CLcTveOqtu/BobMZtYY4o5bItBvlI8caAhw2Y8pKPKquVrPv81pne/RA==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "debug": "^4.1.0", + "fs-extra": "^8.1.0", + "username": "^5.1.0" + } + }, + "@electron-forge/template-typescript": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript/-/template-typescript-6.0.0-beta.50.tgz", + "integrity": "sha512-T0s4DkniVNEaXT1zAVK2OuX71pY/Xv1oo08FO9jVfg273bs3v+Lu37v+Pup54NPqMCrMoFOSK/iSDTMvnp55Qg==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "@electron-forge/template-base": "6.0.0-beta.50", + "fs-extra": "^8.1.0" + } + }, + "@electron-forge/template-typescript-webpack": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/template-typescript-webpack/-/template-typescript-webpack-6.0.0-beta.50.tgz", + "integrity": "sha512-rXzLjLfW3D9DtNCrhUedN9+gEKN6z8Pj+e7iSBq61iwaKv87sqVqrRmFvbSbg2PAmVL5LQiG0lk50mbO5x8/Bw==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "@electron-forge/template-base": "6.0.0-beta.50", + "fs-extra": "^8.1.0" + } + }, + "@electron-forge/template-webpack": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.0.0-beta.50.tgz", + "integrity": "sha512-twZa8sCaWpeofYhymDbufDxL1cWnoOLzcA78bY1BYCsK9lkQFbMnXpoRoHg7JnAPDzMNFB2tG4nBLSML+FHCzg==", + "dev": true, + "requires": { + "@electron-forge/async-ora": "6.0.0-beta.50", + "@electron-forge/shared-types": "6.0.0-beta.50", + "@electron-forge/template-base": "6.0.0-beta.50", + "fs-extra": "^8.1.0" + } + }, + "@electron-forge/web-multi-logger": { + "version": "6.0.0-beta.50", + "resolved": "https://registry.npmjs.org/@electron-forge/web-multi-logger/-/web-multi-logger-6.0.0-beta.50.tgz", + "integrity": "sha512-h0enD5r4j2CsYANnuemlfwQYErZ2dpTCK8cdplGlCV0AjQswMO3c1gtKE1OCl6yz8hI3bL6PQzwsls1JqzzkMQ==", + "dev": true, + "requires": { + "express": "^4.17.1", + "express-ws": "^4.0.0", + "xterm": "^4.4.0", + "xterm-addon-fit": "^0.3.0", + "xterm-addon-search": "^0.5.0" + } + }, + "@electron/get": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.9.0.tgz", + "integrity": "sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^2.0.2", + "global-tunnel-ng": "^2.7.1", + "got": "^9.6.0", + "progress": "^2.0.3", + "sanitize-filename": "^1.6.2", + "sumchecker": "^3.0.1" + } + }, + "@emotion/hash": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", + "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==", + "dev": true + }, + "@fast-csv/format": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.1.2.tgz", + "integrity": "sha512-ERW7QuIEYa/eJArjzEKWe8Sdj9aNBLDjMfZw+EpcIb9CFOMz7SNZl8ElWOjcUU8Gj088TerBSGvUoCZN0SoXig==", + "dev": true, + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.1.2.tgz", + "integrity": "sha512-GmgHo1EHB5/M2v3tAj83l77PxGCxxYvx0s/PoWM/fp5PrS8ECtX0THKsuJ0jO3+BkpaHhX3/UZFOBnfcEw1FkQ==", + "dev": true, + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "@fiahfy/ico": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@fiahfy/ico/-/ico-0.0.4.tgz", + "integrity": "sha512-+w3DHtz9pN3x2ToVOYuhisRki8XOLBFX3yfdvl0BBCxFW0Dxv3osKdbExe+t9DcAFc6Z5l7l3Tps28Bvs7kD5g==", + "dev": true, + "requires": { + "pngjs": "^3.4.0" + } + }, + "@fiahfy/ico-convert": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@fiahfy/ico-convert/-/ico-convert-0.0.7.tgz", + "integrity": "sha512-OXbb0C7w99qhr1sL22qmCVs7o84VxElvysb2FcQIJ7U/WnVdP9bPEQMD287vWeoYpaB3WsHag5mtHts+FZQUmg==", + "dev": true, + "requires": { + "@fiahfy/ico": "^0.0.4", + "meow": "^6.0.0", + "sharp": "^0.23.4" + }, + "dependencies": { + "camelcase-keys": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.1.tgz", + "integrity": "sha512-BPCNVH56RVIxQQIXskp5tLQXUNGQ6sXr7iCv1FHDt81xBOQ/1r6H8SPxf19InVP6DexWar4s87q9thfuk8X9HA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "map-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", + "dev": true + }, + "meow": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.0.tgz", + "integrity": "sha512-iIAoeI01v6pmSfObAAWFoITAA4GgiT45m4SmJgoxtZfvI0fyZwhV4d0lTwiUXvAKIPlma05Feb2Xngl52Mj5Cg==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.1.1", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.0.0", + "minimist-options": "^4.0.1", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.0", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.8.1", + "yargs-parser": "^18.1.1" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "trim-newlines": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", + "dev": true + }, + "yargs-parser": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "@malept/cross-spawn-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.0.0.tgz", + "integrity": "sha512-wE6Y5vqqBE0jATZT1oev3twD1beEcBIDwbrZVt9mekFEv3H/REyjdHCr0qulozZsp6DUya3ituJVnC4YacHO9w==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "@marshallofsound/webpack-asset-relocator-loader": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@marshallofsound/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-0.5.0.tgz", + "integrity": "sha512-X50R97SiDNTpOckiplghBo63Vo8GxSsr98s3VTwEu3qyVr+TY4I91KRtKelEj2OAfgMnkTymw89+psFVq8aB1g==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "@material-ui/core": { + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.9.8.tgz", + "integrity": "sha512-4cslpG6oLoPWUfwPkX+hvbak4hAGiOfgXOu/UIYeeMrtsTEebC0Mirjoby7zhS4ny86YI3rXEFW6EZDmlj5n5w==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/styles": "^4.9.6", + "@material-ui/system": "^4.9.6", + "@material-ui/types": "^5.0.0", + "@material-ui/utils": "^4.9.6", + "@types/react-transition-group": "^4.2.0", + "clsx": "^1.0.2", + "hoist-non-react-statics": "^3.3.2", + "popper.js": "^1.14.1", + "prop-types": "^15.7.2", + "react-is": "^16.8.0", + "react-transition-group": "^4.3.0" + } + }, + "@material-ui/icons": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.9.1.tgz", + "integrity": "sha512-GBitL3oBWO0hzBhvA9KxqcowRUsA0qzwKkURyC8nppnC3fw54KPKZ+d4V1Eeg/UnDRSzDaI9nGCdel/eh9AQMg==", + "requires": { + "@babel/runtime": "^7.4.4" + } + }, + "@material-ui/lab": { + "version": "4.0.0-alpha.47", + "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.47.tgz", + "integrity": "sha512-+WC3O0M/769D3nO9Rqupusc+lob7tQMe5/DnOjAhZ0bpXlJbhZb7N84WkEk4JgQLj6ydP8e9Jhqd1lG+mGj+xw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.9.6", + "clsx": "^1.0.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + }, + "@material-ui/styles": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.9.6.tgz", + "integrity": "sha512-ijgwStEkw1OZ6gCz18hkjycpr/3lKs1hYPi88O/AUn4vMuuGEGAIrqKVFq/lADmZUNF3DOFIk8LDkp7zmjPxtA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@emotion/hash": "^0.8.0", + "@material-ui/types": "^5.0.0", + "@material-ui/utils": "^4.9.6", + "clsx": "^1.0.2", + "csstype": "^2.5.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.0.3", + "jss-plugin-camel-case": "^10.0.3", + "jss-plugin-default-unit": "^10.0.3", + "jss-plugin-global": "^10.0.3", + "jss-plugin-nested": "^10.0.3", + "jss-plugin-props-sort": "^10.0.3", + "jss-plugin-rule-value-function": "^10.0.3", + "jss-plugin-vendor-prefixer": "^10.0.3", + "prop-types": "^15.7.2" + } + }, + "@material-ui/system": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.9.6.tgz", + "integrity": "sha512-QtfoAePyqXoZ2HUVSwGb1Ro0kucMCvVjbI0CdYIR21t0Opgfm1Oer6ni9P5lfeXA39xSt0wCierw37j+YES48Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "@material-ui/utils": "^4.9.6", + "prop-types": "^15.7.2" + } + }, + "@material-ui/types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.0.0.tgz", + "integrity": "sha512-UeH2BuKkwDndtMSS0qgx1kCzSMw+ydtj0xx/XbFtxNSTlXydKwzs5gVW5ZKsFlAkwoOOQ9TIsyoCC8hq18tOwg==", + "dev": true + }, + "@material-ui/utils": { + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.9.6.tgz", + "integrity": "sha512-gqlBn0JPPTUZeAktn1rgMcy9Iczrr74ecx31tyZLVGdBGGzsxzM6PP6zeS7FuoLS6vG4hoZP7hWnOoHtkR0Kvw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.4", + "prop-types": "^15.7.2", + "react-is": "^16.8.0" + } + }, + "@nodert-win10-au/windows.applicationmodel": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@nodert-win10-au/windows.applicationmodel/-/windows.applicationmodel-0.4.4.tgz", + "integrity": "sha512-/46SHT3E5s29p9Fh+BEAJIuzX1vLnGTKSfeGHcUKrPzJneP7OY05NTRH1PHRfRRCgE7YfbIeQqRpbJ0dyvliqw==", + "requires": { + "nan": "^2.14.0" + } + }, + "@nodert-win10-au/windows.data.xml.dom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@nodert-win10-au/windows.data.xml.dom/-/windows.data.xml.dom-0.4.4.tgz", + "integrity": "sha512-UxKrBzuM4D4SYVdUWuzhlpLAtjtV25SIBuip1bcp6b8pLk0tg1Od3/UUmOatk3eGP0SCTg6KuTBM6vEKZxXW9g==", + "requires": { + "nan": "^2.14.0" + } + }, + "@nodert-win10-au/windows.foundation": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@nodert-win10-au/windows.foundation/-/windows.foundation-0.4.4.tgz", + "integrity": "sha512-M31DRrLb3DWTtInxwrZqTjvTl4d7O2EqfPHOcgoch2gA1JDgLr+cpTYxDRar+MvkKEO2dCNDhsV2eoDRZFHkiw==", + "requires": { + "nan": "^2.14.0" + } + }, + "@nodert-win10-au/windows.ui.notifications": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@nodert-win10-au/windows.ui.notifications/-/windows.ui.notifications-0.4.4.tgz", + "integrity": "sha512-wo0/D7boePEWN6bUoQ/RpnG4xwmrzT06RzPv8Ns7WnYSIb6NvEbCNdIMgx1hTr9qriLrgeZX7DNrWAKcDtLsXg==", + "requires": { + "nan": "^2.14.0" + } + }, + "@nodert-win10-au/windows.ui.startscreen": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@nodert-win10-au/windows.ui.startscreen/-/windows.ui.startscreen-0.4.4.tgz", + "integrity": "sha512-EW/LSzjqpv41BjMITdnp40Ez78+vJ7u3sQForh3k/zxTLBHdhxveWlM0r+s8G5TRPB3F4zTlymx2OQZgHN/vhQ==", + "requires": { + "nan": "^2.14.0" + } + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.0.tgz", + "integrity": "sha512-atR1J/jRXvQAb47gfzSK8zavXy7BcpnYq21ALon0U99etu99vsir0trzIO3wpeLtW+LLVY6X7EkfVTbjGSH8Ww==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, + "@sinonjs/formatio": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" + } + }, + "@sinonjs/samsam": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.0.3.tgz", + "integrity": "sha512-QucHkc2uMJ0pFGjJUDP3F9dq5dx8QIaqISl9QgwLOh6P9yv877uONPGXh/OH/0zmM3tW1JjuJltAZV2l7zU+uQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/electron-packager": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@types/electron-packager/-/electron-packager-14.0.0.tgz", + "integrity": "sha512-n47/AbT4DEYPyXtES2myPyKCxVE3hICAB3MnpoVg+Ba8CLBGOpUUsNJ5fyLhfKt5N06sT9nTk4eAc+rtYVpvTQ==", + "dev": true, + "requires": { + "@electron/get": "^1.3.1", + "@types/node": "*", + "electron-notarize": "^0.1.1", + "electron-osx-sign": "^0.4.11" + } + }, + "@types/eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==", + "dev": true + }, + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true, + "optional": true + }, + "@types/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", + "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.2.tgz", + "integrity": "sha512-El9yMpctM6tORDAiBwZVLMcxoTMcqqRO9dVyYcn7ycLWbvR8klrDn8CAOwRfZujZtWD7yS/mshTdz43jMOejbg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "optional": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz", + "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", + "dev": true + }, + "@types/mime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true, + "optional": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/mocha": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", + "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==", + "dev": true + }, + "@types/node": { + "version": "12.12.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.30.tgz", + "integrity": "sha512-sz9MF/zk6qVr3pAnM0BSQvYIBK44tS75QC5N+VbWSE4DjCV/pJ+UzCW/F+vVnl7TkOPcuwQureKNtSSwjBTaMg==", + "dev": true + }, + "@types/node-windows": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@types/node-windows/-/node-windows-0.1.0.tgz", + "integrity": "sha512-Av/6S5B6OoY5y1DFXHzgMroAixUk/uvHmJhoJ5E3jsK/cFJoJzvh0kIHK+kp5w/qtWc+h3peQzqGAGPDgEu/hQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "@types/react": { + "version": "16.9.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.27.tgz", + "integrity": "sha512-j+RvQb9w7a2kZFBOgTh+s/elCwtqWUMN6RJNdmz0ntmwpeoMHKnyhUcmYBu7Yw94Rtj9938D+TJSn6WGcq2+OA==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "@types/react-dom": { + "version": "16.9.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.9.5.tgz", + "integrity": "sha512-BX6RQ8s9D+2/gDhxrj8OW+YD4R+8hj7FEM/OJHGNR0KipE1h1mSsf39YeyC81qafkq+N3rU3h3RFbLSwE5VqUg==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.2.4.tgz", + "integrity": "sha512-8DMUaDqh0S70TjkqU0DxOu80tFUiiaS9rxkWip/nb7gtvAsbqOXm02UCmR8zdcjWujgeYPiPNTVpVpKzUDotwA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/selenium-webdriver": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.0.9.tgz", + "integrity": "sha512-HopIwBE7GUXsscmt/J0DhnFXLSmO04AfxT6b8HAprknwka7pqEWquWDMXxCjd+NUHK9MkCe1SDKKsMiNmCItbQ==", + "dev": true + }, + "@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "@types/sinon": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-7.5.2.tgz", + "integrity": "sha512-T+m89VdXj/eidZyejvmoP9jivXgBDdkOSBVQjU9kF349NEx10QdPNGxHeZUaj1IlJ32/ewdyXJjnJxyxJroYwg==", + "dev": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz", + "integrity": "sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==", + "dev": true + }, + "@types/tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-6IwZ9HzWbCq6XoQWhxLpDjuADodH/MKXRUIDFudvgjcVdjFknvmR+DNsoUeer4XPrEnrZs04Jj+kfV9pFsrhmA==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/unzipper": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.3.tgz", + "integrity": "sha512-01mQdTLp3/KuBVDhP82FNBf+enzVOjJ9dGsCWa5z8fcYAFVgA9bqIQ2NmsgNFzN/DhD0PUQj4n5p7k6I9mq80g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/webpack": { + "version": "4.41.8", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.8.tgz", + "integrity": "sha512-mh4litLHTlDG84TGCFv1pZldndI34vkrW9Mks++Zx4KET7DRMoCXUvLbTISiuF4++fMgNnhV9cc1nCXJQyBYbQ==", + "dev": true, + "requires": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "@types/webpack-env": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.15.1.tgz", + "integrity": "sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA==", + "dev": true + }, + "@types/webpack-node-externals": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@types/webpack-node-externals/-/webpack-node-externals-1.7.1.tgz", + "integrity": "sha512-kbO2gYPKvMb5j1KOgnIuUH52CKul9Ud4b10J5n+JX8oHmgu86hYpBVfrV4bMDe5lhCaO64h8QrKz7WnRZzqkbA==", + "dev": true, + "requires": { + "@types/webpack": "*" + } + }, + "@types/webpack-sources": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.6.tgz", + "integrity": "sha512-FtAWR7wR5ocJ9+nP137DV81tveD/ZgB1sadnJ/axUGM3BUVfRPx8oQNMtv3JNfTeHx3VP7cXiyfR/jmtEsVHsQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.25.0.tgz", + "integrity": "sha512-W2YyMtjmlrOjtXc+FtTelVs9OhuR6OlYc4XKIslJ8PUJOqgYYAPRJhAqkYRQo3G4sjvG8jSodsNycEn4W2gHUw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "2.25.0", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.0.0", + "tsutils": "^3.17.1" + } + }, + "@typescript-eslint/experimental-utils": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.25.0.tgz", + "integrity": "sha512-0IZ4ZR5QkFYbaJk+8eJ2kYeA+1tzOE1sBjbwwtSV85oNWYUBep+EyhlZ7DLUCyhMUGuJpcCCFL0fDtYAP1zMZw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/typescript-estree": "2.25.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.25.0.tgz", + "integrity": "sha512-mccBLaBSpNVgp191CP5W+8U1crTyXsRziWliCqzj02kpxdjKMvFHGJbK33NroquH3zB/gZ8H511HEsJBa2fNEg==", + "dev": true, + "requires": { + "@types/eslint-visitor-keys": "^1.0.0", + "@typescript-eslint/experimental-utils": "2.25.0", + "@typescript-eslint/typescript-estree": "2.25.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "@typescript-eslint/typescript-estree": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.25.0.tgz", + "integrity": "sha512-VUksmx5lDxSi6GfmwSK7SSoIKSw9anukWWNitQPqt58LuYrKalzsgeuignbqnB+rK/xxGlSsCy8lYnwFfB6YJg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-visitor-keys": "^1.1.0", + "glob": "^7.1.6", + "is-glob": "^4.0.1", + "lodash": "^4.17.15", + "semver": "^6.3.0", + "tsutils": "^3.17.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "ajv": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true, + "requires": { + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + } + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asar": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", + "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "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" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "async-which": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-which/-/async-which-1.0.3.tgz", + "integrity": "sha512-/il6aSVpGo70qAgfnr2BtmzrHgw6lhgRlSs3QfjLXDwmJDJB+7kED6Ga2WgJ+gUjpqBv07ASL/OJDe6pdTSv2Q==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atlassian-jwt": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/atlassian-jwt/-/atlassian-jwt-1.0.2.tgz", + "integrity": "sha512-OjruBzloZLQFDsBfOsseSCm1O7iEJIWt2t9GhKER4ar+Si7m7DOK4Tz24GdDmwGRhrsfb6KyUST/i0/luvT3TA==", + "dev": true, + "requires": { + "jsuri": "^1.3.1", + "lodash": "^4.12.0" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10" + } + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-import": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.0.tgz", + "integrity": "sha512-bHU8m0SrY89ub2hBBuYjbennOeH0YUYkVpH6jxKFk0uD8rhN+0jNHIPtXnac+Vn7N/hgkLGGDcIoYK7je3Hhew==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/runtime": "^7.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dev": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boolean": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", + "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "dev": true, + "optional": true + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-request": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", + "integrity": "sha1-ns5bWsqJopkyJC4Yv5M975h2zBc=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "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": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", + "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.378", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", + "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "dev": true, + "requires": { + "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": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "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" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + } + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", + "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dev": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "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" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chroma.ts": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/chroma.ts/-/chroma.ts-1.0.8.tgz", + "integrity": "sha512-WLlgzolg1yEz1jMK7niEGRJNSaUo5ZzrQUy8JcWub7GRgybfAp/z2Eg0iHb9PzOsytPiNvoF5cRW3KbevRKFYg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.2.0.tgz", + "integrity": "sha512-tgU3fKwzYjiLEQgPMD9Jt+JjHVL9kW93FiIMX/l7rivvOD4/LL0Mf7gda3+4U2KJBloybwgj5KEoQgGRioMiKQ==", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz", + "integrity": "sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", + "dev": true, + "optional": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "dev": true, + "requires": { + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + } + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "convert-svg-core": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/convert-svg-core/-/convert-svg-core-0.5.0.tgz", + "integrity": "sha512-V30vm5h4sHjmjyAr7o/gYAEmdEIsi0sLKKbDigSxplovCzMHTERXSikIOgA8xSllHh0c4gHYP55Pxwgtu9O+3w==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "commander": "^2.19.0", + "file-url": "^2.0.2", + "get-stdin": "^6.0.0", + "glob": "^7.1.3", + "lodash.omit": "^4.5.0", + "lodash.pick": "^4.4.0", + "pollock": "^0.2.0", + "puppeteer": "^1.10.0", + "tmp": "0.0.33" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "convert-svg-to-png": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/convert-svg-to-png/-/convert-svg-to-png-0.5.0.tgz", + "integrity": "sha512-Pzg2IEirPdN/VXovG9NY8H5Ww3PUEohMcyu9a11E0G0/oVcbPLWQYE3/S6mxpjidqzYr1i5iKLTKCiU9hctKFQ==", + "dev": true, + "requires": { + "convert-svg-core": "^0.5.0" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "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": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true, + "optional": true + }, + "core-js-compat": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz", + "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==", + "dev": true, + "requires": { + "browserslist": "^4.8.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz", + "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "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": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "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-env": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz", + "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cross-zip": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-3.0.0.tgz", + "integrity": "sha512-cm+l8PJ6WiSQmKZ/x8DGvUm2u/3FX2JFs1AFd18gdHaVhP5Lf4oE6Jrj2Jd05JYSioz5x+nIRVp0zBQuzuCRcQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "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-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "css-loader": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.4.2.tgz", + "integrity": "sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.23", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.1", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.2", + "schema-utils": "^2.6.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-vendor": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.7.tgz", + "integrity": "sha512-VS9Rjt79+p7M0WkPqcAza4Yq1ZHrsHrwf7hPL/bjQB+c1lwmAI+1FXxYTYt818D/50fFVflw0XKleiBN5RITkg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.6.2", + "is-in-browser": "^1.0.2" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csstype": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz", + "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==", + "dev": true + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-fns": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.11.1.tgz", + "integrity": "sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true, + "optional": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-helpers": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.1.3.tgz", + "integrity": "sha512-nZD1OtwfWGRBWlpANxacBEZrEuLa16o1nh7YopFWeoF68Zt8GGEmzHu6Xv4F3XaFIC+YXtTLrzgqKxFgLEe4jw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.6.3", + "csstype": "^2.6.7" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "dev": true + } + } + }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-8.2.0.tgz", + "integrity": "sha512-mnV43gKCrCUMHLmGws/DU/l8LhaxrFD53A4ofwtthdCqOZWGIdk1+eMphiVumXR5a3lC64XVvmXQ2k28i7F/zw==", + "dev": true, + "requires": { + "@electron/get": "^1.0.1", + "@types/node": "^12.0.12", + "extract-zip": "^1.0.3" + } + }, + "electron-installer-common": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.1.tgz", + "integrity": "sha512-d9gEXhfSSyMn8mkFNdbUdkqdLkxVZ8nO3NDso3nuSnG1+wy7cJuuCjutwR4+zsXdQuNFC1n/DxpTk4pBLZSCTQ==", + "dev": true, + "optional": true, + "requires": { + "@malept/cross-spawn-promise": "^1.0.0", + "asar": "^2.0.1", + "debug": "^4.1.1", + "fs-extra": "^8.0.1", + "glob": "^7.1.4", + "lodash": "^4.17.15", + "parse-author": "^2.0.0", + "semver": "^7.1.1", + "tmp-promise": "^2.0.1" + }, + "dependencies": { + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "optional": true, + "requires": { + "rimraf": "^2.6.3" + } + }, + "tmp-promise": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-2.0.2.tgz", + "integrity": "sha512-zl71nFWjPKW2KXs+73gEk8RmqvtAeXPxhWDkTUoa3MSMkjq3I+9OeknjF178MQoMYsdqL730hfzvNfEkePxq9Q==", + "dev": true, + "optional": true, + "requires": { + "tmp": "0.1.0" + } + } + } + }, + "electron-installer-debian": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.0.0.tgz", + "integrity": "sha512-91iiicfK5hq6D6Xit7SFCN2GpccFBQbZB1JpYaxFdaueEjM/1hSULtCPf4e5w/2vQKZ73AfBZrxxIJqO3DhGPw==", + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.1", + "electron-installer-common": "^0.10.0", + "fs-extra": "^8.0.1", + "get-folder-size": "^2.0.1", + "lodash": "^4.17.4", + "word-wrap": "^1.2.3", + "yargs": "^15.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "optional": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "optional": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "optional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "optional": true, + "requires": { + "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.1" + } + }, + "yargs-parser": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-installer-redhat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.0.0.tgz", + "integrity": "sha512-BtYh174AOIGq0iDges4/fihqJYw8WsWXRKuRpKvUlkqrwfeGMWqln28+kKV5IW6GPfHjRFeCO5dcMUioUDBo1A==", + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.1", + "electron-installer-common": "^0.10.0", + "fs-extra": "^8.1.0", + "lodash": "^4.17.15", + "word-wrap": "^1.2.3", + "yargs": "^15.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "optional": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "optional": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "optional": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "optional": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "optional": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "dev": true, + "optional": true, + "requires": { + "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.1" + } + }, + "yargs-parser": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "dev": true, + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-notarize": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.1.1.tgz", + "integrity": "sha512-TpKfJcz4LXl5jiGvZTs5fbEx+wUFXV5u8voeG5WCHWfY/cdgdD8lDZIZRqLVOtR3VO+drgJ9aiSHIO9TYn/fKg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^8.0.1" + } + }, + "electron-osx-sign": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.15.tgz", + "integrity": "sha512-1QtPNpjIji9bGZ0VRFwtJUyU1uHi7q3XUAOG0qFsvAUfs5H0T8hbgUfyg3xvPzmF1ruV8T8pQmQ86vNfLrcRiA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "electron-packager": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-14.2.1.tgz", + "integrity": "sha512-g6y3BVrAOz/iavKD+VMFbehrQcwCWuA3CZvVbmmbQuCfegGA1ytwWn0BNIDDrEdbuz31Fti7mnNHhb5L+3Wq9A==", + "dev": true, + "requires": { + "@electron/get": "^1.6.0", + "asar": "^2.0.1", + "cross-zip": "^3.0.0", + "debug": "^4.0.1", + "electron-notarize": "^0.2.0", + "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": "^16.0.0" + }, + "dependencies": { + "electron-notarize": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.2.1.tgz", + "integrity": "sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "yargs-parser": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-rebuild": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.10.1.tgz", + "integrity": "sha512-KSqp0Xiu7CCvKL2aEdPp/vNe2Rr11vaO8eM/wq9gQJTY02UjtAJ3l7WLV7Mf8oR+UJReJO8SWOWs/FozqK8ggA==", + "dev": true, + "requires": { + "colors": "^1.3.3", + "debug": "^4.1.1", + "detect-libc": "^1.0.3", + "fs-extra": "^8.1.0", + "node-abi": "^2.11.0", + "node-gyp": "^6.0.1", + "ora": "^3.4.0", + "spawn-rx": "^3.0.0", + "yargs": "^14.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "electron-squirrel-startup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz", + "integrity": "sha1-GbTlWTP6Dvj1VnhLnGYPdyVGoLg=", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "electron-sudo": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/electron-sudo/-/electron-sudo-4.0.12.tgz", + "integrity": "sha1-F9J/yzODe39v06eUbxaNZZBWalM=", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "bluebird": "^3.4.6" + } + }, + "electron-to-chromium": { + "version": "1.3.380", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.380.tgz", + "integrity": "sha512-2jhQxJKcjcSpVOQm0NAfuLq8o+130blrcawoumdXT6411xG/xIAOyZodO/y7WTaYlz/NHe3sCCAe/cJLnDsqTw==", + "dev": true + }, + "electron-windows-notifications": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/electron-windows-notifications/-/electron-windows-notifications-3.0.6.tgz", + "integrity": "sha512-BV7ZAQ2Nj0YIyIoI9OClCLv2/NnROabHTfBYzOI8lNuY0PL+IF7gEXZTNCvJhnEYNXqvhOr8ZjqFyU0ZAVuqYQ==", + "requires": { + "@nodert-win10-au/windows.applicationmodel": "^0.4.4", + "@nodert-win10-au/windows.data.xml.dom": "^0.4.4", + "@nodert-win10-au/windows.foundation": "^0.4.4", + "@nodert-win10-au/windows.ui.notifications": "^0.4.4", + "@nodert-win10-au/windows.ui.startscreen": "^0.4.4", + "debug": "^4.1.1", + "is-electron-renderer": "^2.0.1", + "sanitize-xml-string": "^1.1.0", + "uuid": "^3.3.2", + "xml-escape": "^1.1.0" + } + }, + "electron-winstaller": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-4.0.0.tgz", + "integrity": "sha512-Rq5YUQ/zBiGiDW3ezVaRigF3QbohVjDtfcpZpzmhJxX/1jndc96OQJw2x1HulHmhPV7n9R4WEsMkzkHObufU9g==", + "dev": true, + "optional": true, + "requires": { + "asar": "^2.0.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash.template": "^4.2.2", + "temp": "^0.9.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "elliptic": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", + "dev": true, + "requires": { + "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" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", + "dev": true + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "optional": true + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "eslint-scope": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", + "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz", + "integrity": "sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + }, + "dependencies": { + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + } + } + }, + "eslint-plugin-react": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz", + "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.1", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.2.3", + "object.entries": "^1.1.1", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.15.1", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.2", + "xregexp": "^4.3.0" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-3.0.0.tgz", + "integrity": "sha512-EjxTHxjLKIBWFgDJdhKKzLh5q+vjTFrqNZX36uIxWS4OfyXe5DawqPj3U5qeJ1ngLwatjzQnmR0Lz0J0YH3kxw==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "express-ws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/express-ws/-/express-ws-4.0.0.tgz", + "integrity": "sha512-KEyUw8AwRET2iFjFsI1EJQrJ/fHeGiJtgpYgEWG3yDv4l/To/m3a2GaYfeGyB3lsWdvbesjF5XCMx+SVBgAAYw==", + "dev": true, + "requires": { + "ws": "^5.2.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-csv": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.1.3.tgz", + "integrity": "sha512-W2ifln3p+/Fv2tPRQq5Et8BdRb6/f4EhncmRMZHWlvZHr/s9uMe7ZVDtwD1kskwKDmTLsq63hPcJDtO4NYZr9w==", + "dev": true, + "requires": { + "@fast-csv/format": "^4.1.2", + "@fast-csv/parse": "^4.1.2", + "@types/node": "^12.12.17" + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "file-url": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/file-url/-/file-url-2.0.2.tgz", + "integrity": "sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4=", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "dependencies": { + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + } + }, + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", + "dev": true, + "requires": { + "is-buffer": "~2.0.3" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", + "dev": true + } + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "dev": true + }, + "flora-colossus": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", + "integrity": "sha512-d+9na7t9FyH8gBJoNDSi28mE4NgQVGGvxQ4aHtFRetjyh5SXjuus+V5EZaxFmFdXVemSOrx0lsgEl/ZMjnOWJA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^7.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "3.2.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "glob": { + "version": "7.1.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.9.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.14.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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.4.2" + } + }, + "nopt": { + "version": "4.0.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "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" + } + }, + "rimraf": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.13", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "galactus": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz", + "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "flora-colossus": "^1.0.0", + "fs-extra": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "gar": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", + "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-folder-size": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", + "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==", + "dev": true, + "optional": true, + "requires": { + "gar": "^1.0.4", + "tiny-each-async": "2.0.3" + } + }, + "get-installed-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/get-installed-path/-/get-installed-path-2.1.1.tgz", + "integrity": "sha512-Qkn9eq6tW5/q9BDVdMpB8tOHljX9OSP0jRC5TRNVA4qRc839t4g8KQaR8t0Uv0EFVL0MlyG7m/ofjEgAROtYsA==", + "dev": true, + "requires": { + "global-modules": "1.0.0" + } + }, + "get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=", + "dev": true, + "requires": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "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-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-agent": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz", + "integrity": "sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A==", + "dev": true, + "optional": true, + "requires": { + "boolean": "^3.0.0", + "core-js": "^3.6.4", + "es6-error": "^4.1.1", + "matcher": "^2.1.0", + "roarr": "^2.15.2", + "semver": "^7.1.2", + "serialize-error": "^5.0.0" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "global-tunnel-ng": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", + "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", + "dev": true, + "optional": true, + "requires": { + "encodeurl": "^1.0.2", + "lodash": "^4.17.10", + "npm-conf": "^1.1.3", + "tunnel": "^0.0.6" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "globalthis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", + "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "dev": true, + "optional": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@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": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, + "requires": { + "react-is": "^16.7.0" + } + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "hyphenate-style-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz", + "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz", + "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has": "^1.0.3", + "side-channel": "^1.0.2" + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-docker": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz", + "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==", + "dev": true + }, + "is-electron-renderer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-electron-renderer/-/is-electron-renderer-2.0.1.tgz", + "integrity": "sha1-pGnQVvl1aXxYyYxgI+sKp5r4laI=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=", + "dev": true + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "requires": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jira-connector": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jira-connector/-/jira-connector-3.1.0.tgz", + "integrity": "sha512-eMpkYx/s+XREWC/d/dP9lXLbYQh43C0i8q+RJJFP3sMPq/Dq2NLHrymgCIb2tFrxxwvfZ/yHBBv+rU3MD66OrQ==", + "dev": true, + "requires": { + "atlassian-jwt": "^1.0.2", + "mime-types": "^2.1.25", + "oauth": "^0.9.15", + "query-string": "^6.9.0", + "request": "^2.88.0" + } + }, + "jira.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jira.js/-/jira.js-1.4.0.tgz", + "integrity": "sha512-suoYwANPrbExeN5wJF6h/TEhhCwEsZYDR6lFXfWeY+T6xTVsra4Jq9XitCAzls+DGYeYuIa/+MFLHs/f5YUh7g==", + "dev": true, + "requires": { + "atlassian-jwt": "git+https://github.com/MrRefactoring/atlassian-jwt.git#dist", + "axios": "^0.19.2" + }, + "dependencies": { + "atlassian-jwt": { + "version": "git+https://github.com/MrRefactoring/atlassian-jwt.git#2653d31d97559f25b23e6e77f7ea817af8aa58c4", + "from": "git+https://github.com/MrRefactoring/atlassian-jwt.git#dist", + "dev": true, + "requires": { + "@types/express": "^4.17.2", + "jsuri": "^1.3.1" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jss": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.1.1.tgz", + "integrity": "sha512-Xz3qgRUFlxbWk1czCZibUJqhVPObrZHxY3FPsjCXhDld4NOj1BgM14Ir5hVm+Qr6OLqVljjGvoMcCdXNOAbdkQ==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "csstype": "^2.6.5", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-camel-case": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.1.1.tgz", + "integrity": "sha512-MDIaw8FeD5uFz1seQBKz4pnvDLnj5vIKV5hXSVdMaAVq13xR6SVTVWkIV/keyTs5txxTvzGJ9hXoxgd1WTUlBw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.1.1" + } + }, + "jss-plugin-default-unit": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.1.1.tgz", + "integrity": "sha512-UkeVCA/b3QEA4k0nIKS4uWXDCNmV73WLHdh2oDGZZc3GsQtlOCuiH3EkB/qI60v2MiCq356/SYWsDXt21yjwdg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-global": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.1.1.tgz", + "integrity": "sha512-VBG3wRyi3Z8S4kMhm8rZV6caYBegsk+QnQZSVmrWw6GVOT/Z4FA7eyMu5SdkorDlG/HVpHh91oFN56O4R9m2VA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-nested": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.1.1.tgz", + "integrity": "sha512-ozEu7ZBSVrMYxSDplPX3H82XHNQk2DQEJ9TEyo7OVTPJ1hEieqjDFiOQOxXEj9z3PMqkylnUbvWIZRDKCFYw5Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1", + "tiny-warning": "^1.0.2" + } + }, + "jss-plugin-props-sort": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.1.1.tgz", + "integrity": "sha512-g/joK3eTDZB4pkqpZB38257yD4LXB0X15jxtZAGbUzcKAVUHPl9Jb47Y7lYmiGsShiV4YmQRqG1p2DHMYoK91g==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-rule-value-function": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.1.1.tgz", + "integrity": "sha512-ClV1lvJ3laU9la1CUzaDugEcwnpjPTuJ0yGy2YtcU+gG/w9HMInD5vEv7xKAz53Bk4WiJm5uLOElSEshHyhKNw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "jss": "10.1.1" + } + }, + "jss-plugin-vendor-prefixer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.1.1.tgz", + "integrity": "sha512-09MZpQ6onQrhaVSF6GHC4iYifQ7+4YC/tAP6D4ZWeZotvCMq1mHLqNKRIaqQ2lkgANjlEot2JnVi1ktu4+L4pw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.7", + "jss": "10.1.1" + } + }, + "jsuri": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsuri/-/jsuri-1.3.1.tgz", + "integrity": "sha1-zZP8aoeyVRQst7D0efAFF6uTle0=", + "dev": true + }, + "jsx-ast-utils": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz", + "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "object.assign": "^4.1.0" + } + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true + }, + "just-extend": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true, + "requires": { + "package-json": "^4.0.0" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true, + "optional": true + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", + "dev": true + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=", + "dev": true + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=", + "dev": true + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", + "dev": true + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "optional": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matcher": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", + "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "optional": true + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "requires": { + "mime-db": "1.43.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "min-indent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", + "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz", + "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz", + "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mobx": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-5.15.4.tgz", + "integrity": "sha512-xRFJxSU2Im3nrGCdjSuOTFmxVDGeqOHL+TyADCGbT0k4HHqGmx5u2yaHNryvoORpI4DfbzjJ5jPmuv+d7sioFw==", + "dev": true + }, + "mobx-react-lite": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-1.5.2.tgz", + "integrity": "sha512-PyZmARqqWtpuQaAoHF5pKX7h6TKNLwq6vtovm4zZvG6sEbMRHHSqioGXSeQbpRmG8Kw8uln3q/W1yMO5IfL5Sg==", + "dev": true + }, + "mocha": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.1.tgz", + "integrity": "sha512-3qQsu3ijNS3GkWcccT5Zw0hf/rWvu1fTN9sPvEd81hlwsr30GX2GcDSSoBxo24IR8FelmrAydGC6/1J5QQP4WA==", + "dev": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.3", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "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-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "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" + } + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nise": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.3.tgz", + "integrity": "sha512-EGlhjm7/4KvmmE6B/UFsKh7eHykRl9VH+au8dduHLCyWUO/hr7+N+WtTvDUwc9zHuM1IaIJs/0lQ6Ag1jDkQSg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-abi": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", + "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", + "dev": true, + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, + "node-gyp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz", + "integrity": "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.1.2", + "request": "^2.88.0", + "rimraf": "^2.6.3", + "semver": "^5.7.1", + "tar": "^4.4.12", + "which": "^1.3.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-loader": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-0.6.0.tgz", + "integrity": "sha1-x5fvUQle1YWZArFX9jhPY2HgWug=", + "dev": true + }, + "node-releases": { + "version": "1.1.52", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.52.tgz", + "integrity": "sha512-snSiT1UypkgGt2wxPqS6ImEUICbNCMb31yaxWrOLXjhlt2z2/IBpaOxzONExqSm4y5oLnAqjjRWu+wsDzK5yNQ==", + "dev": true, + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "node-windows": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/node-windows/-/node-windows-1.0.0-beta.1.tgz", + "integrity": "sha512-wWAM7zRvu4ZrBGsEI+7oGcoGr5jEeHgxzdx4DNEFddK/gh1yOsy782nCcShjOZ4Kffy8zDfmCw0Femxvib/5Rw==", + "dev": true, + "requires": { + "optimist": "~0.6.0", + "xml": "0.0.12" + } + }, + "nodemon": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz", + "integrity": "sha512-GWhYPMfde2+M0FsHnggIHXTqPDHXia32HRhh6H0d75Mt9FKUoCBvumNHr7LdrpPBTKxsWmIEOjoN+P4IU6Hcaw==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz", + "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.3.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "readdirp": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz", + "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==", + "dev": true, + "requires": { + "picomatch": "^2.0.7" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "dev": true + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "optional": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth": { + "version": "0.9.15", + "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", + "integrity": "sha1-vR/vr2hslrdUda7VGWQS/2DPucE=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.fromentries": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz", + "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.3.tgz", + "integrity": "sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ora": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.3.tgz", + "integrity": "sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.2.0", + "is-interactive": "^1.0.0", + "log-symbols": "^3.0.0", + "mute-stream": "0.0.8", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, + "p-limit": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "requires": { + "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": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", + "dev": true, + "requires": { + "author-regex": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "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": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "dev": true + }, + "pollock": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/pollock/-/pollock-0.2.1.tgz", + "integrity": "sha512-2Xy6LImSXm0ANKv9BKSVuCa6Z4ACbK7oUrl9gtUgqLkekL7n9C0mlWsOGYYuGbCG8xT0x3Q4F31C3ZMyVQjwsg==", + "dev": true + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz", + "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==", + "dev": true + }, + "prebuild-install": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", + "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "prettier": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.2.tgz", + "integrity": "sha512-5xJQIPT8BraI7ZnaDwSbu5zLrB6vvi8hVV58yHQ+QK64qrY40dULy0HSRlQ2/2IdzeBpjhDkqdcFBnFeDEMVdg==", + "dev": true + }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "pretty-ms": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-6.0.1.tgz", + "integrity": "sha512-ke4njoVmlotekHlHyCZ3wI/c5AMT8peuHs8rKJqekj/oR5G8lND2dVpicFlUz5cbZgE290vvkMuDwfj/OcW1kw==", + "dev": true, + "requires": { + "parse-ms": "^2.1.0" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "~0.1.2", + "through2": "~0.2.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true, + "optional": true + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "pstree.remy": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.7.tgz", + "integrity": "sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "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": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "puppeteer": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz", + "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^2.2.1", + "mime": "^2.0.3", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.11.1.tgz", + "integrity": "sha512-1ZvJOUl8ifkkBxu2ByVM/8GijMIPx+cef7u3yroO3Ogm4DOdZcF5dcrWTIlSHe3Pg/mtlt6/eFjObDfJureZZA==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.0.tgz", + "integrity": "sha512-iINUOYvl1cGEmfoaLjnZXt4bKfT2LJnZZib5N/LLyAphC+Dd11vNP9CNVb38j+SAJpFI1uo8j9frmih53ASy7Q==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "rcedit": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-2.1.1.tgz", + "integrity": "sha512-N1JyXxHD2zpqqW4A77RNK1d/M+tyed9JkvL/lnUI5cf4igF/8B9FNLFCtDUhGrk2GWEPxC+RF0WXWWB3I8QC7w==", + "dev": true + }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-dom": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + } + }, + "react-hotkeys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-hotkeys/-/react-hotkeys-2.0.0.tgz", + "integrity": "sha512-3n3OU8vLX/pfcJrR3xJ1zlww6KS1kEJt0Whxc4FiGV+MJrQ1mYSYI3qS/11d2MJDFm8IhOXMTFQirfu6AVOF6Q==", + "dev": true, + "requires": { + "prop-types": "^15.6.1" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "react-transition-group": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.3.0.tgz", + "integrity": "sha512-1qRV1ZuVSdxPlPf4O8t7inxUGpdyO5zG9IoNfJxSO0ImU2A1YWkEQvFPuIPZmMLkg5hYs7vv5mMOyfgSkvAwvw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" + }, + "regenerator-transform": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz", + "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4", + "private": "^0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz", + "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g==", + "dev": true + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + }, + "regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "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" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-package/-/resolve-package-1.0.1.tgz", + "integrity": "sha1-aG9wsYi9fWdfW7xCgszaBgq7nSc=", + "dev": true, + "requires": { + "get-installed-path": "^2.0.3" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "roarr": { + "version": "2.15.2", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.2.tgz", + "integrity": "sha512-jmaDhK9CO4YbQAV8zzCnq9vjAqeO489MS5ehZ+rXmFiPFFE6B+S9KYO6prjmLJ5A0zY3QxVlQdrIya7E/azz/Q==", + "dev": true, + "optional": true, + "requires": { + "boolean": "^3.0.0", + "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" + } + }, + "run-async": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", + "dev": true, + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", + "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sanitize-xml-string": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/sanitize-xml-string/-/sanitize-xml-string-1.1.0.tgz", + "integrity": "sha512-RzX25K64YtZm9FvdZr/Ac7Eeq0va1YX0xmpOkjWoREhgKXXldrJRVJhBel83nS8omIcaKcNTdLY8XzOIK920HA==" + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "selenium-webdriver": { + "version": "4.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", + "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", + "requires": { + "jszip": "^3.2.2", + "rimraf": "^2.7.1", + "tmp": "0.0.30" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "dev": true + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true, + "optional": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "^5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", + "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "dev": true, + "optional": true, + "requires": { + "type-fest": "^0.8.0" + } + }, + "serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "serializr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/serializr/-/serializr-2.0.2.tgz", + "integrity": "sha512-xIqLv4VytKOH/jTCNavoOsJTPKkE/fZCZeAD+Db/U5o+MviQs+8k+G8L6smFVXbUCFSaeNW0xJcVvAXR/GSBgg==", + "dev": true + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sharp": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.23.4.tgz", + "integrity": "sha512-fJMagt6cT0UDy9XCsgyLi0eiwWWhQRxbwGmqQT6sY8Av4s0SVsT/deg8fobBQCTDU5iXRgz0rAeXoE2LBZ8g+Q==", + "dev": true, + "requires": { + "color": "^3.1.2", + "detect-libc": "^1.0.3", + "nan": "^2.14.0", + "npmlog": "^4.1.2", + "prebuild-install": "^5.3.3", + "semver": "^6.3.0", + "simple-get": "^3.1.0", + "tar": "^5.0.5", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "tar": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-5.0.5.tgz", + "integrity": "sha512-MNIgJddrV2TkuwChwcSNds/5E9VijOiw7kAc1y5hTNJoLDSuIyid2QtLYiCYNnICebpuvjhPQZsXwUL0O3l7OQ==", + "dev": true, + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^0.5.0", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "^1.0.1" + } + }, + "sinon": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.0.1.tgz", + "integrity": "sha512-iTTyiQo5T94jrOx7X7QLBZyucUJ2WvL9J13+96HMfm2CGoJYbIPqRfl6wgNcqmzk0DI28jeGx5bUTXizkrqBmg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.0.3", + "diff": "^4.0.2", + "nise": "^4.0.1", + "supports-color": "^7.1.0" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "sleep-promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-8.0.1.tgz", + "integrity": "sha1-jXlaJ+ojlT32tSuRCB5eImZZk8U=", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + } + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spawn-rx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz", + "integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==", + "dev": true, + "requires": { + "debug": "^2.5.1", + "lodash.assign": "^4.2.0", + "rxjs": "^6.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true, + "optional": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "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": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz", + "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "has-symbols": "^1.0.1", + "internal-slot": "^1.0.2", + "regexp.prototype.flags": "^1.3.0", + "side-channel": "^1.0.2" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "style-loader": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz", + "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.6.4" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + } + } + }, + "sudo-prompt": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.1.1.tgz", + "integrity": "sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA==", + "dev": true + }, + "sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "requires": { + "debug": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "tar-fs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz", + "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp": "^0.5.1", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "temp": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.1.tgz", + "integrity": "sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA==", + "dev": true, + "optional": true, + "requires": { + "rimraf": "~2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "dev": true, + "requires": { + "execa": "^0.7.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "terser": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.7.tgz", + "integrity": "sha512-fmr7M1f7DBly5cX2+rFDvmGBAaaZyPrHYK4mMdHEDAdNTqXSZgSOfqsfGq2HqPGT/1V0foZZuCZFx8CHKgAk3g==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tiny-each-async": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", + "integrity": "sha1-jru/1tYpXxNwAD+7NxYq/loKUdE=", + "dev": true, + "optional": true + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "dev": true + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "tmp-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.1.0.tgz", + "integrity": "sha512-8+Ah9aB1IRXCnIOxXZ0uFozV1nMU5xiu7hhFVUSxZ3bYu+psD4TzagCzVbexUCgNNGJnsmNDQlS4nG3mTyoNkw==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "tmp": "0.1.0" + }, + "dependencies": { + "tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "requires": { + "rimraf": "^2.6.3" + } + } + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "ts-loader": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.2.tgz", + "integrity": "sha512-HDo5kXZCBml3EUPcc7RlZOV/JGlLHwppTLEHb3SHnr5V7NXD4klMEkrhJe5wgRbaWsSXi+Y1SIBN/K9B6zWGWQ==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "ts-node": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.1.tgz", + "integrity": "sha512-10DE9ONho06QORKAaCBpPiFCdW+tZJuY/84tyypGtl6r+/C7Asq0dhqbRZURuUlLQtZxxDvT8eoj8cGW0ha6Bg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, + "tslint": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.0.tgz", + "integrity": "sha512-fXjYd/61vU6da04E505OZQGb2VCN2Mq3doeWcOIryuG+eqdmFUXTYVwdhnbEu2k46LNLgUYt9bI5icQze/j0bQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.10.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tslint-config-prettier": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.18.0.tgz", + "integrity": "sha512-xPw9PgNPLG3iKRxmK7DWr+Ea/SzrvfHtjFt5LBl61gk2UBG/DB9kCXRjv+xyIU1rUtnayLeMUVJBcMX8Z17nDg==", + "dev": true + }, + "tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "unzipper": { + "version": "0.10.10", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.10.tgz", + "integrity": "sha512-wEgtqtrnJ/9zIBsQb8UIxOhAH1eTHfi7D/xvmrUoMEePeI6u24nq1wigazbIFtHt6ANYXdEVTvc8XYNlTurs7A==", + "dev": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dev": true, + "requires": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "username": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz", + "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "mem": "^4.3.0" + } + }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "4.42.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.0.tgz", + "integrity": "sha512-EzJRHvwQyBiYrYqhyjW9AqM90dE4+s1/XtCfn7uWg6cS72zH+2VPFAlsnW0+W0cDi0XRjNKUMoJtpSi50+Ph6w==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.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.1", + "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.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "webpack-cli": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.11.tgz", + "integrity": "sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "requires": { + "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-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + } + } + }, + "webpack-hot-middleware": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", + "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-node-externals": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", + "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==", + "dev": true + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", + "dev": true + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dev": true, + "requires": { + "string-width": "^2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xml": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/xml/-/xml-0.0.12.tgz", + "integrity": "sha1-8Is0cQmRK+AChXhfRvFa2OUKX2c=", + "dev": true + }, + "xml-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz", + "integrity": "sha1-OQTBQ/qOs6ADDsZG0pAqLxtwbEQ=" + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "dev": true + }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "dev": true, + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + }, + "dependencies": { + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + } + } + }, + "xterm": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.4.0.tgz", + "integrity": "sha512-JGIpigWM3EBWvnS3rtBuefkiToIILSK1HYMXy4BCsUpO+O4UeeV+/U1AdAXgCB6qJrnPNb7yLgBsVCQUNMteig==", + "dev": true + }, + "xterm-addon-fit": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.3.0.tgz", + "integrity": "sha512-kvkiqHVrnMXgyCH9Xn0BOBJ7XaWC/4BgpSWQy3SueqximgW630t/QOankgqkvk11iTOCwWdAY9DTyQBXUMN3lw==", + "dev": true + }, + "xterm-addon-search": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.5.0.tgz", + "integrity": "sha512-zLVqVTrg5w2nk9fRj3UuVKCPo/dmFe/cLf3EM9Is5Dm6cgOoXmeo9eq2KgD8A0gquAflTFTf0ya2NaFmShHwyg==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.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": "^15.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "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.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yarn-or-npm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/yarn-or-npm/-/yarn-or-npm-3.0.1.tgz", + "integrity": "sha512-fTiQP6WbDAh5QZAVdbMQkecZoahnbOjClTQhzv74WX5h2Uaidj1isf9FDes11TKtsZ0/ZVfZsqZ+O3x6aLERHQ==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.5", + "pkg-dir": "^4.2.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "~1.0.1" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "zedd-clarity": { + "version": "file:../zedd-clarity", + "dev": true, + "requires": { + "@types/deep-equal": "^1.0.1", + "@types/lodash": "^4.14.149", + "@types/node": "^12.12.21", + "@types/selenium-webdriver": "^4.0.8", + "date-fns": "^2.10.0", + "deep-equal": "^2.0.1", + "fast-csv": "^4.1.1", + "lodash": "^4.17.15", + "selenium-webdriver": "^4.0.0-alpha.5", + "sleep-promise": "^8.0.1", + "ts-node": "^8.6.2", + "typescript": "^3.8.3" + }, + "dependencies": { + "@fast-csv/format": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.1.1.tgz", + "integrity": "sha512-xiapqgG9bTiCcDlxjuaV+HQt7kJGQOxCT3kXkOiT0S4Q3X6Zo0WE86iYQCo4X/tlkcjozPq3bc0f0AOhCI0wZw==", + "dev": true, + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.1.1.tgz", + "integrity": "sha512-ayyg/O1IlOWn0d0vcVmOz1DHnD5vutHbDdovKS2qX2PcT09TkZe0Xx/2Wh2CSynzM+2ynj/05fxYKFDpiorpzQ==", + "dev": true, + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "@types/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==", + "dev": true + }, + "@types/node": { + "version": "12.12.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.21.tgz", + "integrity": "sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.0.8.tgz", + "integrity": "sha512-a5/HYMlBM4RNKZHGtIZRpFuk5HChp7raLt9SPiVLP9woUdd65Ix5CEJzjvqQUV68QXdd7xtzyL2n4kMLqCDL6g==", + "dev": true + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "date-fns": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.10.0.tgz", + "integrity": "sha512-EhfEKevYGWhWlZbNeplfhIU/+N+x0iCIx7VzKlXma2EdQyznVlZhCptXUY+BegNpPW2kjdx15Rvq503YcXXrcA==", + "dev": true + }, + "deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.1.tgz", + "integrity": "sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g==", + "dev": true, + "requires": { + "es-abstract": "^1.16.3", + "es-get-iterator": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "isarray": "^2.0.5", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0", + "side-channel": "^1.0.1", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + }, + "dependencies": { + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "es-abstract": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", + "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", + "dev": true, + "requires": { + "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.1.0", + "string.prototype.trimright": "^2.1.0" + } + }, + "es-get-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.0.2.tgz", + "integrity": "sha512-ZHb4fuNK3HKHEOvDGyHPKf5cSWh/OvAMskeM/+21NMnTuvqFvz8uHatolu+7Kf6b6oK9C+3Uo1T37pSGPWv0MA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.0", + "is-set": "^2.0.0", + "is-string": "^1.0.4", + "isarray": "^2.0.5" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "fast-csv": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.1.1.tgz", + "integrity": "sha512-otu5Zc2O4xCLSZMw8NMAcl7ieJTh6RuH2kfvaEpiKnZ57jjy45estIoXyb8eisv3Js/ViBfdwNTmeyV+yMJwSw==", + "dev": true, + "requires": { + "@fast-csv/format": "^4.1.1", + "@fast-csv/parse": "^4.1.1", + "@types/node": "^12.12.17" + }, + "dependencies": { + "@types/node": { + "version": "12.12.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.21.tgz", + "integrity": "sha512-8sRGhbpU+ck1n0PGAUgVrWrWdjSW2aqNeyC15W88GRsMpSwzv6RJGlLhE7s2RhVSOdyDmxbqlWSeThq4/7xqlA==", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "glob": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.5.tgz", + "integrity": "sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ==", + "dev": true, + "requires": { + "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" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==", + "dev": true + }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==", + "dev": true + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==", + "dev": true + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==", + "dev": true + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "dev": true + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "dev": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=", + "dev": true + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=", + "dev": true + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=", + "dev": true + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", + "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", + "dev": true + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "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" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "selenium-webdriver": { + "version": "4.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.5.tgz", + "integrity": "sha512-hktl3DSrhzM59yLhWzDGHIX9o56DvA+cVK7Dw6FcJR6qQ4CGzkaHeXQPcdrslkWMTeq0Ci9AmCxq0EMOvm2Rkg==", + "dev": true, + "requires": { + "jszip": "^3.1.5", + "rimraf": "^2.6.3", + "tmp": "0.0.30", + "xml2js": "^0.4.19" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "dev": true, + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", + "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + } + } + }, + "sleep-promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-8.0.1.tgz", + "integrity": "sha1-jXlaJ+ojlT32tSuRCB5eImZZk8U=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "ts-node": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz", + "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "3.1.1" + } + }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "dev": true, + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } + }, + "which-collection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.0.tgz", + "integrity": "sha512-mG4RtFHE+17N2AxRNvBQ488oBjrhaOaI/G+soUaRJwdyDbu5zmqoAKPYBlY7Zd+QTwpfvInRLKo40feo2si1yA==", + "dev": true, + "requires": { + "is-map": "^2.0.0", + "is-set": "^2.0.0", + "is-weakmap": "^2.0.0", + "is-weakset": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml2js": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", + "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "util.promisify": "~1.0.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } + } + } +} diff --git a/zedd-app/package.json b/zedd-app/package.json new file mode 100644 index 0000000..cef9668 --- /dev/null +++ b/zedd-app/package.json @@ -0,0 +1,156 @@ +{ + "name": "zedd-app", + "productName": "zedd-app", + "version": "2.0.2", + "description": "My Electron application description", + "main": ".webpack/main", + "scripts": { + "start": "cross-env NODE_INSTALLER=npm electron-forge start -- --dev", + "package": "electron-forge package", + "make": "electron-forge make", + "publish": "electron-forge publish", + "genicons": "rimraf icons && ts-node -P genIcons.tsconfig.json genIcons.tsx", + "prettier": "prettier --write src/**/*.{ts,tsx,js,d.ts,json}", + "test": "cross-env TS_NODE_TRANSPILE_ONLY=1 TS_NODE_COMPILER_OPTIONS={\\\"module\\\":\\\"commonjs\\\"} mocha --require ts-node/register src/**/*.test.ts", + "test:watch": "npm t -- --extension ts,tsx --watch", + "tslint": "tslint --project .", + "lint": "eslint src --ext .ts,.js,.tsx,.jsx" + }, + "keywords": [], + "author": { + "name": "Adrian Leonhard", + "email": "adrianleonhard@gmail.com" + }, + "license": "UNLICENSED", + "prettier": { + "trailingComma": "all", + "semi": false, + "singleQuote": true, + "jsxSingleQuote": true, + "printWidth": 100 + }, + "config": { + "forge": { + "packagerConfig": { + "ignore": [ + "\\.gitignore", + "node_modules/\\.cache", + ".*\\.(iobj|pdb|ipdb)$" + ], + "derefSymlinks": true, + "icon": "icons/app.ico" + }, + "makers": [ + { + "name": "@electron-forge/maker-squirrel", + "config": { + "name": "zedd" + } + }, + { + "name": "@electron-forge/maker-zip", + "platforms": [ + "darwin" + ] + } + ], + "plugins": [ + [ + "@electron-forge/plugin-webpack", + { + "mainConfig": "./webpack.main.config.js", + "renderer": { + "config": "./webpack.renderer.config.js", + "entryPoints": [ + { + "html": "./src/index.html", + "js": "./src/renderer.ts", + "name": "main_window" + } + ] + } + } + ] + ] + } + }, + "dependencies": { + "electron-windows-notifications": "^3.0.6", + "selenium-webdriver": "^4.0.0-alpha.7" + }, + "devDependencies": { + "@material-ui/icons": "^4.9.1", + "@babel/core": "^7.9.0", + "@babel/preset-env": "^7.9.0", + "@babel/preset-typescript": "^7.9.0", + "@electron-forge/cli": "6.0.0-beta.50", + "@electron-forge/maker-deb": "6.0.0-beta.50", + "@electron-forge/maker-rpm": "6.0.0-beta.50", + "@electron-forge/maker-squirrel": "6.0.0-beta.50", + "@electron-forge/maker-zip": "6.0.0-beta.50", + "@electron-forge/plugin-webpack": "6.0.0-beta.50", + "@fiahfy/ico-convert": "0.0.7", + "@marshallofsound/webpack-asset-relocator-loader": "^0.5.0", + "@material-ui/core": "^4.9.8", + "@material-ui/lab": "^4.0.0-alpha.47", + "@types/lodash": "^4.14.149", + "@types/mocha": "^7.0.2", + "@types/node": "^12.12.30", + "@types/node-windows": "^0.1.0", + "@types/react": "^16.9.27", + "@types/react-dom": "^16.9.5", + "@types/selenium-webdriver": "^4.0.9", + "@types/sinon": "^7.5.2", + "@types/tmp": "^0.1.0", + "@types/unzipper": "^0.10.3", + "@types/webpack-env": "^1.15.1", + "@types/webpack-node-externals": "^1.7.1", + "@typescript-eslint/eslint-plugin": "^2.25.0", + "@typescript-eslint/parser": "^2.25.0", + "async-which": "^1.0.3", + "babel-loader": "^8.1.0", + "babel-plugin-import": "^1.13.0", + "browser-request": "^0.3.3", + "chroma.ts": "^1.0.8", + "convert-svg-to-png": "^0.5.0", + "cross-env": "^7.0.2", + "css-loader": "^3.4.2", + "date-fns": "^2.11.1", + "electron": "^8.2.0", + "electron-squirrel-startup": "^1.0.0", + "electron-sudo": "^4.0.12", + "eslint": "^6.8.0", + "eslint-config-prettier": "^6.10.1", + "eslint-plugin-react": "^7.19.0", + "eslint-plugin-react-hooks": "^3.0.0", + "fast-csv": "^4.1.3", + "jira-connector": "^3.1.0", + "jira.js": "^1.4.0", + "lodash": "^4.17.15", + "mobx": "^5.15.4", + "mobx-react-lite": "^1.5.2", + "mocha": "^7.1.1", + "node-loader": "^0.6.0", + "node-windows": "^1.0.0-beta.1", + "nodemon": "^2.0.2", + "prettier": "^2.0.2", + "raw-loader": "^4.0.0", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-hotkeys": "^2.0.0", + "serializr": "^2.0.2", + "sinon": "^9.0.1", + "sleep-promise": "^8.0.1", + "style-loader": "^1.1.3", + "sudo-prompt": "^9.1.1", + "ts-loader": "^6.2.2", + "ts-node": "^8.8.1", + "tslint": "^6.1.0", + "tslint-config-prettier": "^1.18.0", + "typescript": "^3.8.3", + "unzipper": "^0.10.10", + "webpack-cli": "^3.3.11", + "webpack-node-externals": "^1.7.2", + "zedd-clarity": "file:../zedd-clarity" + } +} diff --git a/zedd-app/src/AppState.test.ts b/zedd-app/src/AppState.test.ts new file mode 100644 index 0000000..9ff1435 --- /dev/null +++ b/zedd-app/src/AppState.test.ts @@ -0,0 +1,397 @@ +// import type{ describe, it } from 'mocha' +import * as assert from 'assert' +import { + addDays, + addSeconds, + differenceInSeconds, + formatISO, + isAfter, + parse as dateParse, + parseISO, + set as dateSet, + subSeconds, +} from 'date-fns' +import * as fs from 'fs' +import * as path from 'path' +import * as sinon from 'sinon' +import { SinonSpy } from 'sinon' + +import { dateFormatString, formatInterval, AppState, TimeSlice } from './AppState' + +const calcTargetTime = (now: Date, time: string) => { + const parts = time.split(':').map((s) => +s) + let targetTime = dateSet(now, { + hours: parts[0], + minutes: parts[1] ?? 0, + seconds: parts[2] ?? 0, + }) + if (!isAfter(targetTime, now)) { + targetTime = addDays(targetTime, 1) + } + return targetTime +} + +describe('AppState', () => { + describe('trackTime', () => { + let state: AppState + let userIsIdle: boolean + let now: Date + let lastUserInput: Date + let idleCallback: SinonSpy<[Interval], void> + + function date(dateString: string) { + return dateParse(dateString, dateFormatString, now) + } + + function waitUntil(time: string) { + const targetTime = calcTargetTime(now, time) + // console.log('waiting from', now, 'until', targetTime) + + while (true) { + const nextNow = addSeconds(now, 10) + if (isAfter(nextNow, targetTime)) { + break + } + now = nextNow + if (!userIsIdle) { + lastUserInput = subSeconds(now, 2) + } + state.trackTime(now, differenceInSeconds(now, lastUserInput)) + } + } + function suspendUntil(time: string) { + const targetTime = calcTargetTime(now, time) + now = subSeconds(targetTime, 1) + lastUserInput = now + state.trackTime(now, 0) + } + function quitUntil(time: string) { + const saveFileContents = state.toJsonString() + + waitUntil(time) + state = AppState.loadFromJsonString(saveFileContents) + state.idleSliceNotificationCallback = idleCallback + state.trackTime(now, differenceInSeconds(now, lastUserInput)) + } + + function startTiming(what: string) { + state.currentTask = state.getTaskForName(what) + state.timingInProgess = true + } + function stopTiming() { + state.currentTask = state.getUndefinedTask() + state.timingInProgess = false + } + function leave() { + userIsIdle = true + } + function comeBack() { + userIsIdle = false + } + function addSlice(slice: string) { + const [start, end, taskName] = TimeSlice.parse(slice) + + state.addSlice(new TimeSlice(start, end, state.getTaskForName(taskName))) + } + function checkSlices(...slices: string[]) { + assert.deepEqual( + state.slices.map((s) => formatInterval(s) + ' ' + s.task.name), + slices, + 'state.slices at ' + formatISO(now), + ) + } + function checkIdles(...slices: string[]) { + assert.deepEqual( + idleCallback.args.map(([s]) => formatInterval(s)), + slices, + 'idleCallback.args', + ) + } + + beforeEach(() => { + idleCallback = sinon.fake() as SinonSpy<[Interval], void> + state = new AppState() + state.idleSliceNotificationCallback = idleCallback + userIsIdle = false + now = parseISO('2020-01-01T10:00:02') + }) + + it('works with < 1 min', () => { + startTiming('rebasing') + waitUntil('10:00:33') + + checkSlices('2020-01-01 10:00 - 2020-01-01 10:01 rebasing') + }) + + it('works with > 1 min', () => { + startTiming('rebasing') + waitUntil('10:23:22') + + checkSlices('2020-01-01 10:00 - 2020-01-01 10:24 rebasing') + }) + + it('works across day boundaries', () => { + startTiming('rebasing') + waitUntil('2:00') + + checkSlices( + '2020-01-01 10:00 - 2020-01-02 00:00 rebasing', + '2020-01-02 00:00 - 2020-01-02 02:00 rebasing', + ) + }) + + it('leaves no gap if the last task is < 5min ago', () => { + startTiming('rebasing') + waitUntil('11:00') + + stopTiming() + waitUntil('11:03') + + startTiming('daily') + waitUntil('11:20') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 11:00 rebasing', + '2020-01-01 11:00 - 2020-01-01 11:20 daily', + ) + }) + + it('does not create multiple slices if switching rapidly', () => { + startTiming('rebasing') + waitUntil('10:30:10') + startTiming('jumping') + waitUntil('10:30:30') + startTiming('running') + waitUntil('10:30:40') + startTiming('leaping') + waitUntil('11:00') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 10:30 rebasing', + '2020-01-01 10:30 - 2020-01-01 11:00 leaping', + ) + }) + + it('extends the last task if it is the same task and < 5min ago', () => { + startTiming('rebasing') + waitUntil('11:00') + + stopTiming() + waitUntil('11:03') + startTiming('rebasing') + waitUntil('11:20') + + checkSlices('2020-01-01 10:00 - 2020-01-01 11:20 rebasing') + }) + + it('converts the last slice if it is < 5min', () => { + startTiming('rebasing') + waitUntil('10:02') + startTiming('eating') + waitUntil('12:00') + + checkSlices('2020-01-01 10:00 - 2020-01-01 12:00 eating') + }) + + it('converts the last slice if it is < 5min and < 5min ago', () => { + startTiming('rebasing') + waitUntil('10:04') + stopTiming() + waitUntil('10:08') + startTiming('eating') + waitUntil('12:00') + + checkSlices('2020-01-01 10:00 - 2020-01-01 12:00 eating') + }) + + it('keeps timing when the user is away < 15min', () => { + startTiming('rebasing') + waitUntil('10:20') + leave() + waitUntil('10:30') + + checkSlices('2020-01-01 10:00 - 2020-01-01 10:30 rebasing') + + comeBack() + waitUntil('11:00') + + checkSlices('2020-01-01 10:00 - 2020-01-01 11:00 rebasing') + }) + + it('keeps timing when the app is suspended < 15min', () => { + startTiming('rebasing') + waitUntil('10:20') + suspendUntil('10:30') + + checkSlices('2020-01-01 10:00 - 2020-01-01 10:30 rebasing') + + waitUntil('11:00') + + checkSlices('2020-01-01 10:00 - 2020-01-01 11:00 rebasing') + }) + + it('keeps timing when the app is off < 15min', () => { + startTiming('rebasing') + waitUntil('10:20') + quitUntil('10:30') + + checkSlices('2020-01-01 10:00 - 2020-01-01 10:30 rebasing') + + waitUntil('11:00') + + checkSlices('2020-01-01 10:00 - 2020-01-01 11:00 rebasing') + }) + + it('stops timing when the user is away > 15min', () => { + startTiming('rebasing') + waitUntil('10:20') + leave() + waitUntil('11:30') + + checkSlices('2020-01-01 10:00 - 2020-01-01 10:20 rebasing') + + comeBack() + waitUntil('12:00') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 10:20 rebasing', + '2020-01-01 11:30 - 2020-01-01 12:00 rebasing', + ) + checkIdles('2020-01-01 10:20 - 2020-01-01 11:30') + }) + + it('stops timing when the app is suspended > 15min', () => { + startTiming('rebasing') + waitUntil('10:20') + suspendUntil('11:30:20') + + waitUntil('12:00') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 10:20 rebasing', + '2020-01-01 11:30 - 2020-01-01 12:00 rebasing', + ) + checkIdles('2020-01-01 10:20 - 2020-01-01 11:30') + }) + + it('stops timing when the app is off > 15min', () => { + startTiming('rebasing') + waitUntil('10:20') + quitUntil('11:30:02') + + waitUntil('12:00') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 10:20 rebasing', + '2020-01-01 11:30 - 2020-01-01 12:00 rebasing', + ) + checkIdles('2020-01-01 10:20 - 2020-01-01 11:30') + }) + + it('tracks the correct idle time if user was away <15min before the app was suspended', () => { + startTiming('rebasing') + waitUntil('10:20') + leave() + waitUntil('10:30') + + suspendUntil('11:00:02') + comeBack() + + waitUntil('12:00') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 10:20 rebasing', + '2020-01-01 11:00 - 2020-01-01 12:00 rebasing', + ) + checkIdles('2020-01-01 10:20 - 2020-01-01 11:00') + }) + + it('tracks the correct idle time if the app restarts while the user is away', () => { + startTiming('rebasing') + waitUntil('10:20') + leave() + waitUntil('11:00') + + quitUntil('12:00') + + waitUntil('13:00') + comeBack() + + waitUntil('14:00') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 10:20 rebasing', + '2020-01-01 13:00 - 2020-01-01 14:00 rebasing', + ) + checkIdles('2020-01-01 10:20 - 2020-01-01 13:00') + }) + + it('changes the currentTask to a task it "runs into"', () => { + addSlice('2020-01-01 11:00 - 2020-01-01 12:00 daily') + + startTiming('rebasing') + waitUntil('11:30') + + checkSlices( + '2020-01-01 10:00 - 2020-01-01 11:00 rebasing', + '2020-01-01 11:00 - 2020-01-01 12:00 daily', + ) + assert.equal(state.currentTask.name, 'daily', 'current task name') + }) + + it('works when manually extending the current time slice', () => { + startTiming('rebasing') + waitUntil('11:00') + + checkSlices('2020-01-01 10:00 - 2020-01-01 11:00 rebasing') + state.slices[0].end = date('2020-01-01 12:00') + waitUntil('11:30') + + checkSlices('2020-01-01 10:00 - 2020-01-01 12:00 rebasing') + + waitUntil('13:00') + checkSlices('2020-01-01 11:00 - 2020-01-01 13:00 rebasing') + }) + + it.only('alle Stände von Sonja lassen sich laden', async () => { + const dir = 'C:\\Users\\aleonhar\\Documents\\My Received Files\\data' + for (const f of fs.readdirSync(dir)) { + console.log('load ', f) + await AppState.loadFromJsonString(fs.readFileSync(path.join(dir, f), 'utf8')) + } + }) + + // it('is possible to switch task while in an existing slice', () => { + // addSlice('2020-01-01 11:00 - 2020-01-01 12:00 daily') + + // startTiming('rebasing') + // waitUntil('11:30') + + // startTiming('rebasing') + // waitUntil('12:00') + + // assert.equal(state.currentTask.name, 'rebasing', 'current task name') + // checkSlices( + // '2020-01-01 10:00 - 2020-01-01 11:00 rebasing', + // '2020-01-01 11:00 - 2020-01-01 11:30 daily', + // '2020-01-01 11:30 - 2020-01-01 12:00 rebasing', + // ) + // }) + + // it.only('', () => { + // addSlice('2020-01-01 11:00 - 2020-01-01 12:00 daily') + + // startTiming('rebasing') + // leave() + + // waitUntil('11:30') + // comeBack() + + // assert.equal(state.currentTask.name, 'daily', 'current task name') + // checkSlices( + // '2020-01-01 10:00 - 2020-01-01 11:00 rebasing', + // '2020-01-01 11:00 - 2020-01-01 12:00 daily', + // ) + // }) + }) +}) diff --git a/zedd-app/src/AppState.ts b/zedd-app/src/AppState.ts new file mode 100644 index 0000000..034841b --- /dev/null +++ b/zedd-app/src/AppState.ts @@ -0,0 +1,680 @@ +import * as assert from 'assert' +import { + addMinutes, + areIntervalsOverlapping, + compareAsc, + compareDesc, + differenceInDays, + differenceInHours, + differenceInMinutes, + eachDayOfInterval, + endOfDay, + format as formatDate, + getDay, + getISODay, + isAfter, + isBefore, + isSameDay, + isValid, + max as dateMax, + min as dateMin, + parseISO, + set as dateSet, + startOfDay, + startOfMinute, + parse as dateParse, + subSeconds, +} from 'date-fns' +import { remote } from 'electron' +import { promises as fsp } from 'fs' +import { sum, uniq } from 'lodash' +import { computed, observable, transaction } from 'mobx' +import type { IObservableArray } from 'mobx' +import * as path from 'path' +import { + custom, + date, + deserialize, + identifier, + list, + object, + raw, + reference, + serializable, + serialize, + SKIP, + getDefaultModelSchema, +} from 'serializr' + +import feiertage from './feiertage.json' +import { + abs, + getDayInterval, + isoWeekInterval, + mkdirIfNotExists, + startOfNextMinute, + stringHashColor, + tryWithFilesInDir, + uniqCustom, + FILE_DATE_FORMAT, + readFilesWithDate, +} from './util' +import { ZeddSettings } from './ZeddSettings' + +export const MIN_GAP_TIME_MIN = 5 + +export class Task { + @serializable(identifier()) + @observable + public name: string + + @serializable + @observable + public clarityTaskIntId: number | undefined + + /** + * The internal key for JIRA-Issues. + * Used to prevent multiple tasks being created for the same issue. + */ + @serializable + @observable + public key: string | undefined + + @serializable + @observable + public clarityTaskComment: string = '' + + constructor( + name: string = '', + clarityTaskIntId?: number | undefined, + key?: string, + clarityTaskComment?: string, + ) { + this.name = name + this.clarityTaskIntId = clarityTaskIntId + this.key = key + this.clarityTaskComment = clarityTaskComment || '' + } + + public static same(a: Task, b: Task) { + return (a.key && b.key && a.key === b.key) || a.name === b.name + } + + public getColor() { + return stringHashColor(this.name) + } +} + +export const validDate = (d: T) => { + if (!isValid(d)) throw new Error('date invalid: ' + d) + return d +} +export const dateFormatString = 'yyyy-MM-dd HH:mm' +export const format = (date: Date | number) => formatDate(date, dateFormatString) +export const formatInterval = (s: Interval) => format(s.start) + ' - ' + format(s.end) + +export class TimeSlice { + static parse(slice: string): [Date, Date, string] { + const [, startString, endString, taskName] = slice.match(/(.{16}) - (.{16}) (.*)/)! + const now = new Date() + return [ + dateParse(startString, dateFormatString, now), + dateParse(endString, dateFormatString, now), + taskName, + ] + } + @observable + private _start: Date + + @observable + private _end: Date + + @serializable(date()) + get start(): Date { + return this._start + } + + set start(start: Date) { + this.setInterval(start, undefined) + } + @serializable(date()) + get end(): Date { + return this._end + } + + set end(end: Date) { + this.setInterval(undefined, end) + } + + @serializable(reference(Task)) + @observable + public task: Task + + public setInterval(start = this._start, end = this._end) { + if (differenceInMinutes(end, start) <= 0) { + throw new Error(`start (${start}) must be at least one minute before end (${end})`) + } + this._start = start + this._end = end + } + + constructor(start: Date, end: Date, task: Task) { + this.setInterval(start, end) + this.task = task + } + toString(): string { + return formatInterval(this) + ' ' + this.task.name + } +} +export const timeSliceStr = (ts: TimeSlice | undefined) => { + if (!ts) return undefined + return formatInterval(ts) + ' ' + ts.task.name +} + +export class AppState { + /** CONSTANTS */ + public static readonly APP_START_TIME = new Date() + + /** FIELDS */ + // public tasks: Task[] = [ + // // { + // // name: 'ersatz-regi', + // // clarity: clarityTasks[0], + // // }, + // AppState.UNDEFINED_TASK, + // ] + + @observable + @serializable + public timingInProgess: boolean = true + + @observable + @serializable( + list( + custom( + (s: TimeSlice) => s.toString(), + (jsonValue, context, _oldValue, done) => { + const [start, end, taskName] = + 'object' === typeof jsonValue + ? [new Date(jsonValue.start), new Date(jsonValue.end), jsonValue.task] + : TimeSlice.parse(jsonValue) + context.rootContext.await(getDefaultModelSchema(Task)!, taskName, (err, task) => { + if (err) done(err, undefined) + let result + try { + result = new TimeSlice(start, end, task) + } catch (e) { + result = SKIP + } + done(undefined, result) + }) + }, + ), + ), + ) + public slices: IObservableArray = observable([]) + + @observable + public renameTaskDialogOpen: boolean = false + + @observable + public settingsDialogOpen: boolean = false + + @observable + public errors: string[] = [] + + @observable + @serializable + public submitTimesheets = false + + @observable + public assignedIssueTasks: Task[] = [] + + @observable + public changingSliceTask: TimeSlice | undefined = undefined + + /** + * init last, so this.slices is already set + */ + @observable + @serializable(reference(Task)) + public currentTask: Task = this.getUndefinedTask() + + @observable + public focused: TimeSlice | undefined = undefined + + @observable + public lastAction = 0 + + @serializable( + custom( + (x) => x, + (x, _, old) => (x.normal ? x : { ...old, normal: x }), + ), + ) + public bounds = { + normal: { x: 100, y: 100, width: 800, height: 600 }, + maximized: false, + hover: { x: 100, y: 100, width: 800, height: 600 }, + } + + public config: ZeddSettings = new ZeddSettings() + + public idleSliceNotificationCallback: undefined | ((when: Interval) => void) + + @observable + private _startDate: string = '' + + @observable + private _endDate: string = '' + + @observable + private _showing!: Interval + + private _interval: NodeJS.Timeout + + @serializable( + custom( + (s, _, state) => state.slices.indexOf(s), + (i, context) => context.target.slices[i], + ), + ) + private lastTimedSlice: undefined | TimeSlice = undefined + + @serializable(date()) + private lastUserAction: Date = new Date() + + /** + * Whether the always-on-top, title-bar-only "hover mode" is currently enabled. + */ + @observable + @serializable + hoverMode: boolean = false + + constructor() { + this.showing = isoWeekInterval(Date.now()) + } + + public static async saveToDir(instance: AppState, dir: string) { + // const allTasks = instance.slices.map(s => s.task) + // if (instance.currentTask) allTasks.push(instance.currentTask) + // instance.tasks = uniq(allTasks) + await mkdirIfNotExists(dir) + const newFile = 'data_' + formatDate(new Date(), FILE_DATE_FORMAT) + '.json' + try { + await fsp.writeFile(path.join(dir, newFile), instance.toJsonString(), 'utf8') + } catch (e) { + try { + await fsp.unlink(newFile) + } catch (e2) { + console.log('Error while trying to unlink file after error writing file.', e2) + } + throw e + } + } + + public static loadFromJsonString(json: string): AppState { + return deserialize(AppState, JSON.parse(json)) + } + + public static async loadFromDir(dir: string): Promise { + return await tryWithFilesInDir(dir, /^data_(.*).json$/, async (file, _date) => { + console.log('loadFromDir: loading AppState from', file) + const json = await fsp.readFile(path.join(dir, file), 'utf8') + return this.loadFromJsonString(json) + }) + } + + /** + * Delete old files in the directory. (Keeping some, the more recent, the more frequently). + * @returns The number of deleted files. + */ + public static async cleanSaveDir(dir: string): Promise { + const filesWithDate = await readFilesWithDate(dir, /^data_(.*).json$/) + const datesToKeep = filesWithDate.map(([_f, date]) => date) + filterDatesFalloff(datesToKeep) + const pathsToDelete = filesWithDate + .filter(([_f, date]) => !datesToKeep.includes(date)) + .map(([f]) => path.join(dir, f)) + await Promise.all(pathsToDelete.map(fsp.unlink)) + return pathsToDelete.length + } + + @serializable(list(object(Task), { afterDeserialize: (callback) => callback(undefined, SKIP) })) + @computed + get tasks() { + const allTasks = this.slices.map((s) => s.task) + if (this.currentTask) allTasks.push(this.currentTask) + return uniq(allTasks) + } + + @computed + get tasksInfos() { + const UNDEFINED_TASK = this.getUndefinedTask() + const tasksInfos = this.slices.reduceRight((result, slice) => { + if (slice.task !== UNDEFINED_TASK) { + const info = result.find((i) => i.task === slice.task) + if (info) { + info.lastEnd = dateMax([info.lastEnd, slice.end]) + } else { + result.push({ task: slice.task, lastEnd: slice.end }) + } + } + return result + }, [] as { task: Task; lastEnd: Date }[]) + tasksInfos.sort((a, b) => compareDesc(a.lastEnd, b.lastEnd)) + return tasksInfos + } + + public get startDate() { + return this._startDate + } + public set startDate(iso: string) { + this._startDate = iso + this.updateShowingFromStartEnd() + } + public get endDate() { + return this._endDate + } + public set endDate(iso: string) { + this._endDate = iso + this.updateShowingFromStartEnd() + } + + public get showing() { + return this._showing + } + + @serializable(object({ factory: () => ({}), props: { start: date(), end: date() } })) + public set showing(newShowing: Interval) { + // console.log('public set showing ', newShowing) + this._showing = newShowing + this._startDate = formatDate(newShowing.start, 'yyyy-MM-dd') + this._endDate = formatDate(newShowing.end, 'yyyy-MM-dd') + } + /** + * If tasks already contains a task with a matching key or name, return that, + * otherwise return the passed task. + */ + public normalizeTask(taskToNormalize: Task): Task { + return this.tasks.find((t) => Task.same(taskToNormalize, t)) ?? taskToNormalize + } + + /** METHODS */ + public toggleTimingInProgress() { + this.timingInProgess = !this.timingInProgess + } + + public getDayWorkedMinutes(day: Date): number { + return sum( + this.slices + .filter((s) => isSameDay(s.start, day)) + .map((s) => differenceInMinutes(s.end, s.start)), + ) + } + + public getDayProgress(day: Date): number { + const dayMinutes = this.getDayWorkedMinutes(day) + const dayShouldWorkMinutes = (this.config.workmask[getISODay(day) - 1] || 0) * 60 + return 0 === dayShouldWorkMinutes ? 1 : dayMinutes / dayShouldWorkMinutes + } + + public getUndefinedTask(): Task { + return ( + this.tasks.find((t) => 'UNDEFINED' === t.name) || + new Task('UNDEFINED', undefined, 'UNDEFINED') + ) + } + + public getMostRecentTasks(n: number): Task[] { + return this.tasksInfos.slice(0, n).map((i) => i.task) + } + + public getSuggestedTasks() { + return uniqCustom([...this.getMostRecentTasks(7), ...this.assignedIssueTasks], Task.same) + } + + public getTaskMinutes(task: Task) { + return sum( + this.slices.filter((s) => s.task === task).map((s) => differenceInMinutes(s.end, s.start)), + ) + } + + public fillErsatz(when: Interval) { + for (const day of eachDayOfInterval(when)) { + this.addSliceIfDayEmpty( + this.makeFullDaySlice(day, this.getTaskForName(this.config.ersatzTask)), + ) + } + } + + public clearErsatz(when: Interval) { + const fixedWhen = { start: startOfDay(when.start), end: endOfDay(when.end) } + const ersatzTask = this.getTaskForName(this.config.ersatzTask) + const slicesToRemove = this.slices.filter( + (s) => s.task === ersatzTask && areIntervalsOverlapping(s, fixedWhen), + ) + transaction(() => slicesToRemove.forEach((r) => this.slices.remove(r))) + } + + public getPreviousSlice(slice: TimeSlice) { + return this.slices.reduce((result, s) => { + if (!isBefore(s.start, slice.start)) return result + if (!result || isAfter(s.start, result.start)) return s + return result + }, undefined as TimeSlice | undefined) + } + + public getNextSlice(slice: TimeSlice) { + return this.slices.reduce((result, s) => { + if (!isAfter(s.start, slice.start)) return result + if (!result || isBefore(s.start, result.start)) return s + return result + }, undefined as TimeSlice | undefined) + } + + public getTaskForName(name: Task | string | undefined) { + const taskName = ('string' === typeof name ? name : name?.name)?.trim()?.replace(/\s+/, ' ') + if (!taskName) { + return this.getUndefinedTask() + } + const taskNameLC = taskName.toLowerCase() + return ( + this.tasks.find((t) => taskNameLC === t.name.toLowerCase()) || + this.assignedIssueTasks.find((t) => taskNameLC === t.name.toLowerCase()) || + new Task(taskName, undefined) + ) + } + + public addSlice(s: TimeSlice) { + validDate(s.start) + validDate(s.end) + + this.slices.push(s) + this.slices.replace( + this.slices.slice().sort((a, b) => compareAsc(a.start, b.start) || compareAsc(a.end, b.end)), + ) + return s + } + + public startInterval() { + this._interval = setInterval(this.trackTime, 5_000) + } + public cleanup() { + if (this._interval) clearInterval(this._interval) + } + + /** + * Tasks cannot overlap. + * + * Main time tracking loop. The currentTask can be assumed to have been set immediately + * after the last event. Call on('resume') to make assumption valid. + * + * The currently selected task eats/overrides existing slices in the way. When encountering + * a new slice, the currently selected task switches. The user is presented with an option + * to stay with the curent task. + */ + public trackTime = ( + now = new Date(), + secondsSinceLastUserInput = remote?.powerMonitor?.getSystemIdleTime() ?? 0, + ) => { + const prevLastUserAction = this.lastUserAction + this.lastUserAction = subSeconds(now, secondsSinceLastUserInput) + if (!this.timingInProgess || this.getUndefinedTask() === this.currentTask) { + this.lastTimedSlice = undefined + return + } + let lastSlice = + this.slices.reduce((prev, s) => { + if (abs(differenceInMinutes(now, s.end)) < 5 && isBefore(s.start, now)) { + if (!prev || isAfter(s.start, prev.start)) { + return s + } + } + return prev + }, undefined as TimeSlice | undefined) ?? this.lastTimedSlice + + // console.log('lastSlice', strlastSlice) + if (differenceInMinutes(now, this.lastUserAction) > 15) { + if (lastSlice) { + lastSlice.end = startOfNextMinute(this.lastUserAction) + this.lastTimedSlice = undefined + } + return + } + if ( + isAfter(this.lastUserAction, prevLastUserAction) && + differenceInMinutes(now, prevLastUserAction) > 15 + ) { + // console.log('user is back', timeSliceStr(lastSlice)) + + if (lastSlice) { + lastSlice.end = startOfNextMinute(prevLastUserAction) + // console.log('lastSlice', timeSliceStr(lastSlice)) + lastSlice = undefined + } + try { + if (this.idleSliceNotificationCallback) { + this.idleSliceNotificationCallback({ + start: startOfNextMinute(prevLastUserAction), + end: startOfMinute(now), + }) + } + } catch (e) { + console.error('There was an error calling idleSliceNotificationCallback', e) + } + } + + if (!lastSlice) { + const start = startOfMinute(now) + const newSlice: TimeSlice = new TimeSlice(start, addMinutes(start, 1), this.currentTask) + // console.log('ADDING SLICE', newSlice) + + this.lastTimedSlice = this.addSlice(newSlice) + } else { + if ( + abs(differenceInMinutes(lastSlice.end, lastSlice.start)) < 5 && + lastSlice.task !== this.currentTask + ) { + // last slice is < 5min, convert it + lastSlice.task = this.currentTask + } + if (lastSlice.task === this.currentTask) { + if (isSameDay(lastSlice.start, now)) { + // extend current slice + lastSlice.end = startOfNextMinute(now) + this.lastTimedSlice = lastSlice + } else { + // console.log('adding slice because of new day', now, timeSliceStr(lastSlice)) + const boundary = startOfDay(now) + lastSlice.end = boundary + this.lastTimedSlice = this.addSlice( + new TimeSlice(boundary, startOfNextMinute(now), this.currentTask), + ) + } + } else { + lastSlice.end = dateMin([lastSlice.end, startOfMinute(now)]) + const newSlice = new TimeSlice(lastSlice.end, startOfNextMinute(now), this.currentTask) + // console.log('lastSlice is different, add', timeSliceStr(lastSlice), timeSliceStr(newSlice)) + this.lastTimedSlice = this.addSlice(newSlice) + } + } + } + + public isDayEmpty(timeInDay: Date) { + return !this.slices.some((s) => areIntervalsOverlapping(getDayInterval(timeInDay), s)) + } + + public addSliceIfDayEmpty(newSlice: TimeSlice | undefined) { + if (!newSlice) { + return + } + assert(isSameDay(newSlice.start, newSlice.end)) + const dayIsEmpty = this.isDayEmpty(newSlice.start) + if (dayIsEmpty) { + this.addSlice(newSlice) + } + return dayIsEmpty + } + + public importHolidays() { + for (const holidayDateStr of Object.keys(feiertage)) { + const date = new Date(holidayDateStr) + const slice = this.makeFullDaySlice(date, this.getTaskForName('URLAUB')) + this.addSliceIfDayEmpty(slice) + } + } + + public toJsonString() { + const stateJsonObject = serialize(AppState, this) + return JSON.stringify(stateJsonObject, undefined, ' ') + } + + private updateShowingFromStartEnd() { + try { + const start = parseISO(this.startDate) + const end = parseISO(this.endDate) + console.log('updateSHowingFromStartEnd', this.startDate, end) + if (start <= end) this.showing = { start, end } + } catch (e) { + console.error(e) + } + } + + private makeFullDaySlice(day: Date, task: Task): TimeSlice | undefined { + const dayWorkHours = this.config.workmask[getDay(day) - 1] + if (dayWorkHours) { + return new TimeSlice( + dateSet(day, { hours: this.config.startHour }), + dateSet(day, { + hours: this.config.startHour + dayWorkHours, + }), + task, + ) + } + return undefined + } +} + +function filterDatesFalloff(dates: Date[], now = new Date()) { + dates.sort(compareDesc) + for (let i = 1; i < dates.length; i++) { + const prev = dates[i - 1] + const current = dates[i] + let keep + if (differenceInHours(now, current) < 1) { + // keep everything + keep = true + } else if (differenceInDays(now, current) < 1) { + // keep one per hour + keep = prev.getHours() !== current.getHours() + } else { + // keep one per day + keep = +startOfDay(prev) !== +startOfDay(current) + } + if (!keep) { + dates.splice(i, 1) + i-- + } + } +} diff --git a/zedd-app/src/ClarityState.ts b/zedd-app/src/ClarityState.ts new file mode 100644 index 0000000..4c58cf5 --- /dev/null +++ b/zedd-app/src/ClarityState.ts @@ -0,0 +1,152 @@ +import { format as formatDate, parseISO } from 'date-fns' +import { promises as fsp } from 'fs' +import { computed, observable } from 'mobx' +import * as path from 'path' +import { + fillClarity, + getProjectInfo, + ClarityExportFormat, + Task as ZeddClarityTask, +} from 'zedd-clarity' +import './index.css' + +import { getLatestFileInDir, mkdirIfNotExists, FILE_DATE_FORMAT } from './util' + +export interface ClarityTask extends ZeddClarityTask { + projectName: string + projectIntId: string +} + +export class ClarityState { + public nikuLink: string + @observable + private _currentlyImportingTasks = false + + @observable + private _tasks: ClarityTask[] = [] + + @observable + private _tasksLastUpdated: Date | undefined + + public constructor(public clarityDir: string) {} + + public get currentlyImportingTasks() { + return this._currentlyImportingTasks + } + + get tasks() { + return this._tasks + } + + @computed + get intIdTaskMap(): Map { + return this._tasks.reduce((map, task) => map.set(task.intId, task), new Map()) + } + + @computed + get projectNames(): string[] { + const projectNames = Array.from( + this._tasks.reduce((set, task) => (set.add(task.projectName), set), new Set()), + ) + projectNames.sort() + return projectNames + } + + public get tasksLastUpdated() { + return this._tasksLastUpdated + } + + public async init() { + await mkdirIfNotExists(this.clarityDir) + } + + public async export(clarityExport: ClarityExportFormat, submitTimesheets: boolean) { + try { + this._currentlyImportingTasks = true + await fillClarity(this.nikuLink, clarityExport, submitTimesheets, false) + } finally { + this._currentlyImportingTasks = false + } + } + + public async importAndSaveClarityTasks( + excludedProjects: string[], + toImport: string[] | 'ALL' = 'ALL', + ): Promise { + const importProject = (projectName: string) => + 'ALL' === toImport || toImport.includes(projectName) + const importedTasks = await this.importClarityTasks( + (projectName) => excludedProjects.includes(projectName) || !importProject(projectName), + ) + const oldTasksNotExcludedAndNotImported = this._tasks.filter( + ({ projectName }) => !excludedProjects.includes(projectName) && !importProject(projectName), + ) + this._tasks = [...oldTasksNotExcludedAndNotImported, ...importedTasks] + await this.saveClarityTasksToFile(this._tasks) + return this._tasks + } + + public async loadStateFromFile() { + ;[this._tasksLastUpdated, this._tasks] = await this.loadClarityTasksFromFile() + } + + public resolveTask(intId: number | undefined) { + return intId === undefined ? undefined : this.intIdTaskMap.get(intId) + } + + public isValidTaskIntId(intId: number | undefined) { + return this.resolveTask(intId) !== undefined + } + + private async importClarityTasks( + excludeProject: (projectName: string) => boolean, + ): Promise { + if (this._currentlyImportingTasks) { + throw new Error('Already importing') + } + try { + this._currentlyImportingTasks = true + const projectInfos = await getProjectInfo( + this.nikuLink, + excludeProject, + undefined, + path.join(this.clarityDir, 'dl'), + ) + return projectInfos.flatMap(({ tasks, name: projectName, intId: projectIntId }) => + tasks.map((task) => + Object.assign( + task, + { + projectName, + projectIntId, + }, + (task as unknown) as ClarityTask, + ), + ), + ) + } finally { + this._currentlyImportingTasks = false + } + } + + private async saveClarityTasksToFile(tasks: ClarityTask[]) { + const json = JSON.stringify(tasks, undefined, ' ') + const newFile = 'tasks_' + formatDate(new Date(), FILE_DATE_FORMAT) + '.json' + await fsp.writeFile(path.join(this.clarityDir, newFile), json) + const filesToDelete = (await fsp.readdir(this.clarityDir, { withFileTypes: true })).filter( + (f) => f.isFile() && f.name !== newFile, + ) + await Promise.all(filesToDelete.map((f) => fsp.unlink(path.join(this.clarityDir, f.name)))) + } + + private async loadClarityTasksFromFile(): Promise<[Date, ClarityTask[]]> { + const [file, date] = await getLatestFileInDir(this.clarityDir, /^tasks_(.*)\.json$/) + const content = await fsp.readFile(path.join(this.clarityDir, file), { + encoding: 'utf8', + }) + const tasks: ClarityTask[] = JSON.parse(content, (key, value) => + 'end' === key || 'start' === key ? parseISO(value) : value, + ) + return [date, tasks] + } +} diff --git a/zedd-app/src/ZeddSettings.ts b/zedd-app/src/ZeddSettings.ts new file mode 100644 index 0000000..f34867c --- /dev/null +++ b/zedd-app/src/ZeddSettings.ts @@ -0,0 +1,92 @@ +import { observable } from 'mobx' +import { serializable, raw, list, primitive, deserialize, serialize } from 'serializr' +import { promises as fsp } from 'fs' + +export class ZeddSettings { + constructor(fromFile?: string) { + this.fromFile = fromFile! + } + + public static async readFromFile(file: string): Promise { + const settings = deserialize(ZeddSettings, JSON.parse(await fsp.readFile(file, 'utf8'))) + settings.fromFile = file + return settings + } + + public async saveToFile(file: string = this.fromFile) { + return fsp.writeFile(file, JSON.stringify(serialize(this), undefined, ' '), 'utf8') + } + + private fromFile: string + + /** + * regular worktimes. used for sick/holidays + * format: [mondayHours, tuesdayHours, ...] + * + */ + @observable + @serializable(raw()) + public workmask = [8, 8, 8, 8, 8, 0, 0] + + /** + * first hour of the calendar by default, as well as start hour for holidays etc + * + */ + @observable + @serializable(raw()) + public startHour = 8 + + /** + * define clarity projects whoses tasks should not be imported + * function will be called with project names, returning true + * will lead to the project being excluded + * + */ + @observable + @serializable(list(primitive())) + public excludeProjects = [] as string[] + + /** + * int-id of the clarity-task to be used for holidays + * + */ + @observable + @serializable(raw()) + public urlaubClarityTaskIntId: number | undefined + + /** + * Name of the ERSATZ Task (not in Clarity!) You can configure the + * Clarity-Account in the app. + */ + @observable + @serializable(raw()) + public ersatzTask = 'ERSATZ' + + /** + * Link to clarity. Everything before the '#'. + */ + @observable + @serializable(raw()) + public nikuLink = '' + + /** + * mininum user idle time in minutes which counts as "user is away" + */ + @observable + @serializable + public minIdleTimeMin = 15 + + @observable + @serializable(raw()) + public cgJira = { + // Everything *before* 'secure/Dashboard.jspa'. + url: '', + username: '', + password: '', + currentIssuesJql: 'assignee = currentUser() AND resolution = Unresolved ORDER BY updated DESC', + } + + @observable + @serializable + public keepHovering = true +} diff --git a/zedd-app/src/chromeDriverMgmt.ts b/zedd-app/src/chromeDriverMgmt.ts new file mode 100644 index 0000000..7bb2257 --- /dev/null +++ b/zedd-app/src/chromeDriverMgmt.ts @@ -0,0 +1,87 @@ +import which from 'async-which' + +import { promisify } from 'util' +import { Extract } from 'unzipper' +import { withDir as withTmpDir } from 'tmp-promise' +import { exec } from 'child_process' +import { dirname, join } from 'path' +import { get as httpsGet } from 'https' +import sudo from 'sudo-prompt' +import { fileExists } from './util' + +export const getEnvPathChromePath = async () => { + const chromePath = (await which('chrome'))?.trim() + if (!chromePath) { + throw new Error('Could not find Google Chrome! Is it installed and on the path?') + } + console.log(chromePath) + return chromePath +} + +export const getChromeVersion = async () => { + const { stdout } = await promisify(exec)( + `wmic datafile where name=${JSON.stringify(await getEnvPathChromePath())} get Version /value`, + ) + return stdout.trim().replace(/^Version=/, '') +} + +export const getLatestChromeDriverVersion = async (chromeVersion: string) => { + // See https://stackoverflow.com/a/55266105/1980909 + + const url = + 'https://chromedriver.storage.googleapis.com/LATEST_RELEASE_' + + chromeVersion.replace(/\.\d+$/, '') + + return await fetch(url) + .then((r) => r.text()) + .then((t) => t.trim()) +} + +export const installChromeDriver = async (chromeDriverVersion: string) => { + const chromeDir = dirname(await getEnvPathChromePath()) + const url = `https://chromedriver.storage.googleapis.com/${chromeDriverVersion}/chromedriver_win32.zip` + + await withTmpDir( + async (unzipDir) => { + console.log(`Unzipping ${url} to ${unzipDir.path}`) + await new Promise((resolve, reject) => { + const extract = Extract({ path: unzipDir.path }) + extract.on('close', resolve) + extract.on('error', reject) + httpsGet(url, (res) => { + console.log(res) + res.pipe(extract) + }) + }) + + console.log(`Copying chromedriver.exe to ${chromeDir}`) + await promisify(sudo.exec)( + `move /Y ${JSON.stringify(join(unzipDir.path, 'chromedriver.exe'))} ${JSON.stringify( + join(chromeDir, 'chromedriver.exe'), + )}`, + { name: 'Copy Chromedriver' }, + ) + }, + { prefix: 'chromedriver' }, + ) +} +export const getCurrentChromeDriverVersion = async () => { + const { stdout } = await promisify(exec)(`chromedriver --version`) + return stdout + .trim() + .replace(/^ChromeDriver\s*/, '') + .replace(/\s.*/, '') +} + +export const getNonEnvPathChromePath = async () => { + for (const path of [ + 'C:\\Program Files (x86)\\Google\\Application\\chrome.exe', + 'C:\\Users\\UserName\\AppDataLocal\\Google\\Chrome\\chrome.exe', + 'C:\\Documents and Settings\\UserName\\Local Settings\\Application Data\\Google\\Chrome\\chrome.exe', + ]) { + if (await fileExists(path)) { + return path + } + } + return undefined +} diff --git a/zedd-app/src/components/AppBody.tsx b/zedd-app/src/components/AppBody.tsx new file mode 100644 index 0000000..357575c --- /dev/null +++ b/zedd-app/src/components/AppBody.tsx @@ -0,0 +1,317 @@ +import { Button, ButtonGroup, TextField, PopoverPosition, Paper, Tooltip } from '@material-ui/core' +import { useTheme, makeStyles } from '@material-ui/core/styles' +import { + addMinutes, + addMonths, + addWeeks, + max as dateMax, + min as dateMin, + startOfDay, + differenceInDays, + isMonday, + addDays, + startOfMonth, + isSameDay, + endOfMonth, +} from 'date-fns' +import { observer } from 'mobx-react-lite' +import * as React from 'react' +import { useCallback, useState } from 'react' + +import { ErrorBoundary } from './ErrorBoundary' +import { AppState, Task, TimeSlice } from '../AppState' +import { ClarityState } from '../ClarityState' +import { businessWeekInterval, isoWeekInterval, monthInterval, omap, startOfNextDay } from '../util' +import { BlockDisplay } from './BlockDisplay' +import { Calendar, SliceDragStartHandler, SliceSplitHandler } from './Calendar' +import { ClarityView } from './ClarityView' +import { TaskEditor } from './TaskEditor' +import { sortBy } from 'lodash' +import { remote, MenuItemConstructorOptions } from 'electron' +import { ArrowBack, ArrowForward, Delete as DeleteIcon } from '@material-ui/icons' + +const { Menu } = remote + +const useStyles = makeStyles((theme) => ({ + contentRoot: { + overflowY: 'scroll', + '& > *': { margin: theme.spacing(2) }, + }, + controlBar: { + margin: theme.spacing(-1), + display: 'flex', + flexWrap: 'wrap', + alignItems: 'center', + '& > *': { margin: theme.spacing(1), flexGrow: 1 }, + '& .MuiButtonGroup-root > *': { flexGrow: 1 }, + '& input[type="date"]::-webkit-clear-button': { display: 'none' }, + }, +})) + +export interface AppBodyProps { + state: AppState + clarityState: ClarityState + getTasksForSearchString: (s: string) => Promise + display: boolean +} + +export const AppBody = observer( + ({ state, clarityState, getTasksForSearchString, display }: AppBodyProps) => { + const [anchorPosition, setAnchorPosition] = useState(undefined as undefined | PopoverPosition) + + const theme = useTheme() + const classes = useStyles() + + // const onBlockClick = useCallback((e: React.MouseEvent, slice: TimeSlice) => { + // console.log('onContextMenu') + // if (2 === e.button) + // setAnchorPosition( + // ilog({ + // top: e.clientY, + // left: e.clientX, + // }), + // ) + // }, []) + + const onMenuClose = useCallback(() => setAnchorPosition(undefined), [setAnchorPosition]) + const onBlockClick = useCallback( + (_: React.MouseEvent, slice: TimeSlice) => { + Menu.buildFromTemplate([ + ...sortBy(state.getSuggestedTasks(), (t) => t.name).map( + (t): MenuItemConstructorOptions => ({ + type: 'checkbox', + label: t.name, + checked: slice.task === t, + click: (x) => (slice.task = state.getTaskForName(x.label)), + }), + ), + { + type: 'normal', + label: 'Other...', + click: (_) => (state.changingSliceTask = slice), + }, + + { type: 'separator' }, + + { + type: 'normal', + label: 'Start Timing This', + click: () => (state.currentTask = slice.task), + }, + { type: 'normal', label: 'Delete', click: (_) => state.slices.remove(slice) }, + { + type: 'normal', + label: 'Eat Previous Slice', + click: (_) => { + const previousSlice = state.getPreviousSlice(slice) + if (!previousSlice) return + state.slices.remove(previousSlice) + slice.start = previousSlice.start + }, + }, + { + type: 'normal', + label: 'Eat Next Slice', + click: (_) => { + const nextSlice = state.getNextSlice(slice) + if (!nextSlice) return + state.slices.remove(nextSlice) + slice.end = nextSlice.end + }, + }, + ]).popup() + }, + [state], + ) + + const arrowClick = useCallback( + (e: React.MouseEvent) => { + const dir = +e.currentTarget.dataset.dir! + const { start, end } = state.showing + const diff = differenceInDays(end, start) + console.log(isMonday(start), diff) + if (isMonday(start) && 4 === diff) { + // showing mo-fri + state.showing = omap(state.showing, (d) => addWeeks(d, dir)) + } else if (isSameDay(start, startOfMonth(start)) && isSameDay(end, endOfMonth(start))) { + state.showing = omap(state.showing, (d) => addMonths(d, dir)) + } else { + state.showing = omap(state.showing, (d) => addDays(d, dir * (diff + 1))) + } + }, + [state], + ) + + return ( +
+ {/* + {sortBy(state.getSuggestedTasks(), t => t.name).map( + t => ( + (slice.task = state.getTaskForName(x.label))} + > + {t.name} + + ), + // type: 'checkbox', + // label: t.name, + // checked: slice.task === t, + // , + // }), + )} + */} +
+ (state.currentTask = t)} + value={state.currentTask} + getTasksForSearchString={getTasksForSearchString} + /> +
+ {/* */} +
+
+ (state.startDate = e.target.value)} + /> + (state.endDate = e.target.value)} + /> + + + + + + + + + + + + + + + + + + + +
+
+ + { + newEnd = dateMax([newEnd, addMinutes(slice.start, 1)]) + newEnd = dateMin([newEnd, startOfNextDay(slice.start)]) + const nextSlice = state.getNextSlice(slice) + if (nextSlice) newEnd = dateMin([newEnd, nextSlice.start]) + slice.end = newEnd + }} + onSliceStartChange={(slice, newStart) => { + newStart = dateMin([newStart, addMinutes(slice.end, -1)]) + newStart = dateMax([newStart, startOfDay(slice.start)]) + const prevSlice = state.getPreviousSlice(slice) + if (prevSlice) newStart = dateMax([newStart, prevSlice.end]) + slice.start = newStart + }} + onSliceAdd={(s) => state.addSlice(s)} + splitBlock={(slice, splitAt) => { + if (slice.start < splitAt && splitAt < slice.end) { + const newSlice = new TimeSlice(slice.start, slice.end, slice.task) + slice.end = splitAt + newSlice.start = splitAt + state.addSlice(newSlice) + } + }} + getVirtualSlice={(start, end) => new TimeSlice(start, end, state.getUndefinedTask())} + deleteSlice={(b) => state.slices.splice(state.slices.indexOf(b), 1)} + renderSlice={(attributes) => { + return ( + + ) + }} + /> + + + (state.submitTimesheets = x)} + errorHandler={(e) => state.errors.push(e.message)} + /> + +
+ ) + }, +) diff --git a/zedd-app/src/components/AppGui.tsx b/zedd-app/src/components/AppGui.tsx new file mode 100644 index 0000000..05266c3 --- /dev/null +++ b/zedd-app/src/components/AppGui.tsx @@ -0,0 +1,125 @@ +import { CssBaseline, Snackbar } from '@material-ui/core' +import { createMuiTheme, MuiThemeProvider, makeStyles } from '@material-ui/core/styles' +import useMediaQuery from '@material-ui/core/useMediaQuery' +import { Alert } from '@material-ui/lab' +import { remote } from 'electron' +import { observer } from 'mobx-react-lite' +import * as React from 'react' +import { useMemo } from 'react' + +import { ErrorBoundary } from './ErrorBoundary' +import { AppState, Task } from '../AppState' +import { ClarityState } from '../ClarityState' +import { ChangeSliceTaskDialog } from './ChangeSliceTaskDialog' +import { RenameTaskDialog } from './RenameTaskDialog' +import { SettingsDialog } from './SettingsDialog' +import { ZeddSettings } from '../ZeddSettings' +import { TitleBar } from './TitleBar' +import { AppBody } from './AppBody' + +const { systemPreferences } = remote + +export interface AppGuiProps { + state: AppState + clarityState: ClarityState + getTasksForSearchString: (s: string) => Promise + menuItems: { label: string; click: () => void }[] + checkCgJira: (cg: ZeddSettings['cgJira']) => Promise +} + +const useStyles = makeStyles({ + '@global #react-root': { + // transform: 'rotate(20deg)', + // overflow: 'scroll', + }, +}) + +export const AppGui = observer( + ({ state, clarityState, getTasksForSearchString, checkCgJira, menuItems }: AppGuiProps) => { + const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)') + + const theme = useMemo( + () => + createMuiTheme({ + spacing: 8, + palette: { + primary: { main: '#' + systemPreferences.getAccentColor().substr(0, 6) }, + // type: true ? 'dark' : 'light', + type: prefersDarkMode ? 'dark' : 'light', + }, + }), + [prefersDarkMode], + ) + + const { config } = state + const currentFocusedTask = state.focused?.task ?? state.currentTask + + useStyles() + + return ( + + + {!state.hoverMode && ( + state.errors.shift()} + > + state.errors.shift()} severity='error'> + {state.errors.length && state.errors[0]} + + + )} + + {state.settingsDialogOpen && ( + { + config.saveToFile() + state.settingsDialogOpen = false + }} + checkCgJira={checkCgJira} + settings={state.config} + clarityState={clarityState} + /> + )} + {currentFocusedTask && state.renameTaskDialogOpen ? ( + { + state.renameTaskDialogOpen = false + if (newName && currentFocusedTask) currentFocusedTask.name = newName + }} + /> + ) : ( + state.changingSliceTask && ( + { + if ('string' === typeof newTask) newTask = state.getTaskForName(newTask) + console.log('ChangeSLiceTaskDialog', 'state.changingSliceTask!.task = newTask') + state.changingSliceTask!.task = newTask + state.changingSliceTask = undefined + }} + state={state} + /> + ) + )} + + + + + ) + }, +) diff --git a/zedd-app/src/components/BlockDisplay.tsx b/zedd-app/src/components/BlockDisplay.tsx new file mode 100644 index 0000000..8c937f6 --- /dev/null +++ b/zedd-app/src/components/BlockDisplay.tsx @@ -0,0 +1,123 @@ +import { format } from 'date-fns' +import { observer } from 'mobx-react-lite' +import * as React from 'react' +import { useCallback } from 'react' + +import { useTheme } from '@material-ui/core/styles' +import { TimeSlice } from '../AppState' +import { ClarityState } from '../ClarityState' +import { SliceDragStartHandler, SliceSplitHandler } from './Calendar' + +export type BlockProps = { + slice: TimeSlice + startDrag?: SliceDragStartHandler + showTime?: boolean + onSplit?: SliceSplitHandler + onContextMenu: (e: React.MouseEvent, block: TimeSlice) => void + clarityState: ClarityState +} & Omit, 'onContextMenu'> + +export const BlockDisplay = observer( + ({ + slice, + onSplit, + startDrag, + onContextMenu, + clarityState, + style, + ...attributes + }: BlockProps) => { + // console.log('rendering BlockDisplay') + const blockClickHandler = useCallback( + (e: React.MouseEvent) => { + console.log('Click', e) + if (e.ctrlKey && onSplit) onSplit(slice, e) + if (1 === e.button) onContextMenu(e, slice) + }, + [slice, onSplit], + ) + const startHandleHandler = useCallback((e: React.MouseEvent) => startDrag!(slice, e, 'start'), [ + startDrag, + slice, + ]) + const startPrevHandleHandler = useCallback( + (e: React.MouseEvent) => startDrag!(slice, e, 'start+prev'), + [startDrag, slice], + ) + const endHandleHandler = useCallback((e: React.MouseEvent) => startDrag!(slice, e, 'end'), [ + startDrag, + slice, + ]) + + const clarityTask = clarityState.resolveTask(slice.task.clarityTaskIntId) + + const theme = useTheme() + + return ( +
onContextMenu(e, slice)} + > + {true && ( +
+ {format(slice.start, 'HH:mm')} - {format(slice.end, 'HH:mm')} +
+ )} + {!clarityTask && ( + + ⚠️ + + )} + {slice.task.name}{' '} + {clarityTask && ( + + {clarityTask.name} + {slice.task.clarityTaskComment && ( + {' mK ' + slice.task.clarityTaskComment} + )} + + )} + {startDrag && ( + <> +
+
+
+ + )} +
+ ) + }, +) +// export const BlockDisplayShortcuts: any = withHotKeys(BlockDisplay as any, {}) as any diff --git a/zedd-app/src/components/Calendar.tsx b/zedd-app/src/components/Calendar.tsx new file mode 100644 index 0000000..8145d93 --- /dev/null +++ b/zedd-app/src/components/Calendar.tsx @@ -0,0 +1,425 @@ +import { useTheme } from '@material-ui/core/styles' +import * as chroma from 'chroma.ts' +import { + addDays, + addHours, + addMinutes, + areIntervalsOverlapping, + differenceInMinutes, + eachDayOfInterval, + format, + getDay, + getHours, + getISOWeek, + getISOWeekYear, + isSameDay, + isValid, + isWithinInterval, + lastDayOfISOWeek, + max as dateMax, + min as dateMin, + roundToNearestMinutes, + set as dateSet, + startOfISOWeek, + subMinutes, +} from 'date-fns' +import { last } from 'lodash' +import groupBy from 'lodash/groupBy' +import { observer, useLocalStore } from 'mobx-react-lite' +import * as React from 'react' +import { useCallback, useEffect, useRef, ReactElement } from 'react' + +import { intRange, isoDay, min } from '../util' + +export type SliceDragStartHandler = ( + b: T, + e: React.MouseEvent, + pos: 'start' | 'end' | 'start+prev', +) => void +export type SliceSplitHandler = (b: T, e: React.MouseEvent) => void + +export interface CalendarProps { + showing: Interval + deleteSlice: (slice: T) => void + startHour: number + slices: T[] + selectedSlice?: T + onSliceStartChange: (slice: T, newStart: Date) => void + onSliceEndChange: (slice: T, newEnd: Date) => void + splitBlock: (slice: T, splitAt: Date) => void + onSliceAdd: (slice: T) => void + renderSlice: ( + attributes: React.HTMLAttributes & { + slice: T + startDrag: SliceDragStartHandler | undefined + onSplit: SliceSplitHandler | undefined + }, + ) => ReactElement + getVirtualSlice: (start: Date, end: Date) => T +} + +// const triple = (x: string) => [x, 'ctrl+' + x, 'shift+' + x] +const percent = (x: number) => '' + x * 100 + '%' +const adjustStartHour = (startHour: number, showing: Interval, slices: Interval[]) => + min( + startHour, + ...slices.filter((s) => areIntervalsOverlapping(s, showing)).map((s) => getHours(s.start)), + ) + +export const minutesToScreen = (m: number) => '' + m + 'px' +const RenderSliceWrapper = observer( + ({ + blockDayStart, + slice, + startDrag, + renderSlice, + onSplit, + }: { + blockDayStart: Date + slice: T + startDrag?: SliceDragStartHandler | undefined + renderSlice: CalendarProps['renderSlice'] + onSplit?: SliceSplitHandler | undefined + }) => { + const topMinutes = differenceInMinutes(slice.start, blockDayStart) + const heightMinutes = differenceInMinutes(slice.end, slice.start) + return renderSlice({ + slice, + style: { + position: 'absolute', + top: '' + minutesToScreen(topMinutes), + height: '' + minutesToScreen(heightMinutes), + }, + startDrag, + onSplit, + }) + }, +) +const screenPxToMinutes = (px: number) => px +const CalendarBase = ({ + renderSlice, + showing, + slices, + onSliceStartChange, + onSliceEndChange, + onSliceAdd, + startHour: minStartHour, + deleteSlice, + splitBlock, + getVirtualSlice, +}: CalendarProps) => { + const local = useLocalStore(() => ({ + showTime: new Date(), + currentlyDragging: [] as { block: T; startEnd: 'start' | 'end' }[], + fixedShowInterval: undefined as { start: number; end: number } | undefined, + virtualSlice: undefined as T | undefined, + })) + const timeBlockDivs: HTMLDivElement[] = useRef([]).current + timeBlockDivs.length = 0 + + // refresh every minute so that the "current time" bar moves correctly + useEffect(() => { + const refreshInterval = window.setInterval(() => (local.showTime = new Date()), 60_000) + return () => window.clearInterval(refreshInterval) + }) + + const startHour = local.fixedShowInterval?.start ?? adjustStartHour(minStartHour, showing, slices) + + const hoursBlockMouseClick = useCallback( + (_: React.MouseEvent) => { + if (local.virtualSlice) { + onSliceAdd(local.virtualSlice) + local.virtualSlice = undefined + } + }, + [onSliceAdd], + ) + + const viewportXYToTime = useCallback( + (x: number, y: number) => { + for (let i = 0; i < timeBlockDivs.length; i++) { + const div = timeBlockDivs[i] + const bb = div.getBoundingClientRect() + if (x >= bb.left && x <= bb.right) { + const topPx = y - bb.top + const divTopDate = dateSet(addDays(showing.start, i), { + hours: startHour, + }) + const time = addMinutes(divTopDate, screenPxToMinutes(topPx)) + return time + } + } + return undefined + }, + [showing, startHour], + ) + + const hoursBlockMouseMove = useCallback( + (e: React.MouseEvent) => { + const pointTime = viewportXYToTime(e.clientX, e.clientY) + if (e.ctrlKey && pointTime && !slices.some((s) => isWithinInterval(pointTime, s))) { + const minTime = dateMax(slices.map((s) => s.end).filter((s) => s <= pointTime)) + const maxTime = dateMin(slices.map((s) => s.start).filter((s) => pointTime < s)) + let start = roundToNearestMinutes(subMinutes(pointTime, 30), { nearestTo: 15 }) + let end = addHours(start, 1) + if (end > maxTime) { + const diff = differenceInMinutes(end, maxTime) + end = addMinutes(end, -diff) + start = addMinutes(start, -diff) + } + if (start < minTime) { + start = minTime + } + local.virtualSlice = local.virtualSlice || getVirtualSlice(start, end) + local.virtualSlice.start = start + local.virtualSlice.end = end + } else { + local.virtualSlice = undefined + } + }, + [viewportXYToTime], + ) + + const onSplit = useCallback( + (split: T, e: React.MouseEvent) => { + const splitDate = viewportXYToTime(e.clientX, e.clientY) + if (splitDate) splitBlock(split, roundToNearestMinutes(splitDate, { nearestTo: 15 })) + }, + [splitBlock], + ) + + const dragOngoing = useCallback( + (e: MouseEvent) => { + local.currentlyDragging.forEach(({ block, startEnd }) => { + const newDate = viewportXYToTime(e.clientX, e.clientY) + if (newDate && isValid(newDate)) + ('start' === startEnd ? onSliceStartChange : onSliceEndChange)( + block, + roundToNearestMinutes(newDate, { nearestTo: e.ctrlKey ? 5 : 15 }), + ) + }) + if (local.currentlyDragging.length !== 0) { + e.preventDefault() + } + }, + [viewportXYToTime], + ) + const dragStop = useCallback(() => { + local.currentlyDragging.length = 0 + local.fixedShowInterval = undefined + window.removeEventListener('mouseup', dragStop) + window.removeEventListener('mousemove', dragOngoing) + }, [dragOngoing]) + useEffect(() => { + window.addEventListener('mousemove', dragOngoing) + return () => window.removeEventListener('mousemove', dragOngoing) + }, [dragOngoing]) + + const dragStart: SliceDragStartHandler = useCallback( + (block, e, pos) => { + console.log('dragStart', pos) + if ('end' === pos || 'start' === pos) { + local.currentlyDragging.push({ block, startEnd: pos }) + } + if ('start+prev' === pos) { + local.currentlyDragging.push({ block, startEnd: 'start' }) + const prevBlock = slices.find((s) => s.end === block.start)! + if (prevBlock) local.currentlyDragging.push({ block: prevBlock, startEnd: 'end' }) + } + + local.fixedShowInterval = { start: startHour, end: getHours(showing.end) } + + window.addEventListener('mouseup', dragStop) + window.addEventListener('mousemove', dragOngoing) + + e.preventDefault() + }, + [dragOngoing, dragStop, startHour], + ) + + const hoursBlockMouseLeave = useCallback( + (_: React.MouseEvent) => (local.virtualSlice = undefined), + [], + ) + + const endHour = 24 + const now = Date.now() + const days = eachDayOfInterval(showing) + const daysByCalendarWeeks = groupBy(days, (d) => startOfISOWeek(d).getTime()) + + const theme = useTheme() + + const weekColorScale = chroma + .scale((t) => chroma.hsl(t * 360, 0.75, 'dark' === theme.palette.type ? 0.1 : 0.97)) + .out(undefined) + + const weekColors = weekColorScale.colors(7, 'color').map((c) => c.css()) + const weekBorderColors = weekColorScale + .colors(7, 'color') + .map((c) => c.darker('dark' === theme.palette.type ? -1 : 1).css()) + + return ( +
+ {/* Header with year / week */} + {Object.keys(daysByCalendarWeeks).map((startOfISOWeekStr) => { + const firstDay = +startOfISOWeekStr + const _includesStartOfWeek = isSameDay(daysByCalendarWeeks[startOfISOWeekStr][0], firstDay) + const _includesEndOfWeek = isSameDay( + last(daysByCalendarWeeks[startOfISOWeekStr])!, + lastDayOfISOWeek(firstDay), + ) + return ( +
+ {getISOWeekYear(firstDay)} / Week {getISOWeek(firstDay)} +
+ ) + })} + + {/* Header with date */} + {days.map((d) => ( +
+ {format(d, 'E, do MMMM')} +
+ ))} + + {/* background-hours blocks */} + {days.map((d, i) => { + const blockDayStart = dateSet(d, { + hours: startHour, + minutes: 0, + }) + + return ( +
(timeBlockDivs[i] = r!)} + onMouseMove={hoursBlockMouseMove} + onClick={hoursBlockMouseClick} + onMouseLeave={hoursBlockMouseLeave} + > + {intRange(startHour, endHour).map((x) => ( +
+ {('' + x).padStart(2, '0')} +
+ ))} + + {/* display blocks */} + {slices + .filter(({ start }) => isSameDay(start, d)) + .map((s, si) => { + const keyMap: { [binding: string]: string[] | string } = {} + const handlers: { + [binding: string]: (e: React.KeyboardEvent) => void + } = {} + + for (const [startEnd, earlierKey, laterKey] of [ + ['START', 'u', 'h'], + ['END', 'j', 'n'], + ]) { + for (const [earlierLater, key] of [ + ['EARLIER', earlierKey], + ['LATER', laterKey], + ]) { + const keys = [] + for (const ctrl of ['', 'ctrl+']) + for (const alt of ['', 'alt+']) + for (const shift of ['', 'shift+']) { + keys.push(ctrl + alt + shift + key) + } + keyMap[startEnd + earlierLater] = keys + handlers[startEnd + earlierLater] = (e: React.KeyboardEvent) => { + const minutes = e.shiftKey ? 60 : e.ctrlKey ? 5 : 15 + const dir = 'EARLIER' === earlierLater ? -1 : 1 + if ('START' === startEnd) { + onSliceStartChange(s, addMinutes(s.start, dir * minutes)) + const bPrev = slices.find((_, bbi) => slices[bbi + 1] === s) + if (e.altKey && bPrev) { + onSliceEndChange(bPrev, addMinutes(bPrev.end, dir * minutes)) + } + } else { + onSliceEndChange(s, addMinutes(s.end, dir * minutes)) + const bNext = slices.find((_, bbi) => slices[bbi - 1] === s) + if (e.altKey && bNext) { + onSliceStartChange(bNext, addMinutes(bNext.start, dir * minutes)) + } + } + e.preventDefault() + } + } + } + keyMap.DELETE_BLOCK = 'del' + handlers.DELETE_BLOCK = (_) => deleteSlice(s) + return ( + + ) + })} + {/* display current time line */} + {isSameDay(d, now) && startHour <= getHours(now) && getHours(now) < endHour && ( +
+ )} + {/* virtual time slice */} + {local.virtualSlice && isSameDay(local.virtualSlice.start, d) && ( + + )} +
+ ) + })} +
+ ) +} + +// cast here so generic is not lost +export const Calendar: typeof CalendarBase = observer(CalendarBase) as any diff --git a/zedd-app/src/components/ChangeSliceTaskDialog.tsx b/zedd-app/src/components/ChangeSliceTaskDialog.tsx new file mode 100644 index 0000000..47925a0 --- /dev/null +++ b/zedd-app/src/components/ChangeSliceTaskDialog.tsx @@ -0,0 +1,61 @@ +import { Dialog, DialogActions, DialogContent, DialogTitle } from '@material-ui/core' +import Button from '@material-ui/core/Button' +import { format as formatDate } from 'date-fns' +import * as React from 'react' +import { useState } from 'react' + +import { AppState, Task, TimeSlice } from '../AppState' +import { ClarityState } from '../ClarityState' +import { TaskEditor } from './TaskEditor' + +export const ChangeSliceTaskDialog = ({ + slice, + done, + state, + getTasksForSearchString, + clarityState, +}: { + slice: TimeSlice + done: (newTask: Task | string) => void + state: AppState + getTasksForSearchString: (ss: string) => Promise + clarityState: ClarityState +}) => { + const [newTask, setNewTask] = useState(slice.task) + + return ( + done(slice.task)} + aria-labelledby='form-dialog-title' + maxWidth='lg' + fullWidth + > + + {`Task for Time Slice ${formatDate(slice.start, 'do MMMM')} ${formatDate( + slice.start, + 'HH:mm', + )} - ${formatDate(slice.end, 'HH:mm')}`} + +
+ + + + + + + +
+
+ ) +} diff --git a/zedd-app/src/components/ClarityTaskSelect.tsx b/zedd-app/src/components/ClarityTaskSelect.tsx new file mode 100644 index 0000000..a64e2f9 --- /dev/null +++ b/zedd-app/src/components/ClarityTaskSelect.tsx @@ -0,0 +1,72 @@ +import { observer } from 'mobx-react-lite' +import * as React from 'react' + +import { TextField } from '@material-ui/core' +import { StandardTextFieldProps } from '@material-ui/core/TextField' +import { Autocomplete } from '@material-ui/lab' + +import { ClarityState, ClarityTask } from '../ClarityState' + +export type ClarityTaskSelectProps = { + clarityState: ClarityState + onChange: (taskIntId: number | undefined) => void + value: number | undefined +} & Omit + +export const ClarityTaskSelect = observer( + ({ + clarityState, + onChange, + value, + style, + disabled, + ...textFieldProps + }: ClarityTaskSelectProps) => { + const maxEntries = 20 + + const resolvedVal = (value && clarityState.resolveTask(value)) ?? '' + console.log('value ' + value + ' res ', resolvedVal) + + return ( + } + options={clarityState.tasks} + disabled={disabled} + style={style} + filterOptions={(options: ClarityTask[], state) => { + const result = [] + const inputParts = state.inputValue + .toLowerCase() + .replace('/', ' ') + .trim() + .split(/[\s*]+/) + for (let i = 0; i < options.length && result.length <= maxEntries; i++) { + const task = options[i] + if ( + inputParts.every( + (ip) => + task.name.toLowerCase().includes(ip) || + task.projectName.toLowerCase().includes(ip), + ) + ) { + result.push(task) + } + } + return result + }} + onChange={(_: unknown, clarityTask: ClarityTask | undefined) => + onChange(clarityTask?.intId) + } + value={resolvedVal} + renderOption={(option: ClarityTask, _state) => ( + <> +
{option.projectName}
+
{option.name}
+
{option.strId}
+ + )} + getOptionLabel={(x: ClarityTask) => (x ? x.projectName + ' / ' + x.name : '')} + /> + ) + }, +) diff --git a/zedd-app/src/components/ClarityView.tsx b/zedd-app/src/components/ClarityView.tsx new file mode 100644 index 0000000..cb6db5d --- /dev/null +++ b/zedd-app/src/components/ClarityView.tsx @@ -0,0 +1,257 @@ +import { useTheme, makeStyles } from '@material-ui/core/styles' +import { + addDays, + areIntervalsOverlapping, + differenceInMinutes, + eachDayOfInterval, + format as formatDate, + max as dateMax, + min as dateMin, +} from 'date-fns' +import { observer } from 'mobx-react-lite' +import * as React from 'react' +import { ClarityExportFormat } from 'zedd-clarity' +import { + Button, + Checkbox, + FormControlLabel, + Card, + CardContent, + CardActions, +} from '@material-ui/core' +import { Send as SendIcon } from '@material-ui/icons' +import { groupBy, uniqBy, sortBy } from 'lodash' + +import { validDate, TimeSlice } from '../AppState' +import { ClarityState } from '../ClarityState' +import { ceil, splitIntervalIntoCalendarDays, sum, omap } from '../util' + +export interface ClarityViewProps { + showing: Interval + blocks: TimeSlice[] + clarityState: ClarityState + submitTimesheets: boolean + onChangeSubmitTimesheets: (x: boolean) => void + errorHandler: (e: Error) => void +} + +const useStyles = makeStyles((theme) => ({ + table: { + padding: 0, + borderSpacing: 0, + '& .textHeader': { textAlign: 'left' }, + '& .numberCell, .numberHeader': { + textAlign: 'right', + }, + '& th': { padding: theme.spacing(1, 2) }, + '& td': { + borderTop: '1px solid', + borderColor: theme.palette.divider, + padding: theme.spacing(0.5, 2), + }, + }, +})) + +const dayToString = (day: Date | number) => formatDate(day, 'yyyy-MM-dd') + +const formatHours = (h: number) => + h ? h.toLocaleString('de-DE', { minimumFractionDigits: 2 }) : '-' + +export const ceilToNearest = (x: number, nearest: number) => ceil(x / nearest) * nearest + +const placeholderClarityTask = { + projectName: 'UNDEFINED', + intId: -1, + name: 'UNDEFINED', +} + +function transform({ blocks, showing, clarityState }: ClarityViewProps): ClarityExportFormat { + // add 1 to the end of showing, because we want the interval to go to the end of the + // not just the begining + const showInterval = { start: showing.start, end: addDays(showing.end, 1) } + + // in the first step, create a ClarityExportFormat with and entry for each + // task/comment combination + const dayMap: ClarityExportFormat = {} + for (const b of blocks) { + validDate(b.start) + validDate(b.end) + validDate(showing.start) + validDate(showing.end) + try { + if (!areIntervalsOverlapping(b, showInterval)) { + continue + } + } catch (e) { + console.error(b, showInterval) + throw e + } + const task = + (b.task.clarityTaskIntId && clarityState.resolveTask(+b.task.clarityTaskIntId)) || + placeholderClarityTask + // fix start/end of b, as part of the interval may be outside showInterval + const bStartFixed = dateMax([b.start, showInterval.start]) + const bEndFixed = dateMin([b.end, showInterval.end]) + for (const daySlice of splitIntervalIntoCalendarDays({ + start: bStartFixed, + end: bEndFixed, + })) { + const dayKey = dayToString(daySlice.start) + const dayHourss = dayMap[dayKey] || (dayMap[dayKey] = []) + let dayHours = dayHourss.find( + (d) => d.taskIntId === b.task.clarityTaskIntId && d.comment === b.task.clarityTaskComment, + ) + if (!dayHours) { + dayHours = { + hours: 0, + projectName: task.projectName, + taskIntId: task.intId, + taskName: task.name, + comment: b.task.clarityTaskComment, + } + dayHourss.push(dayHours) + } + + dayHours.hours += differenceInMinutes(daySlice.end, daySlice.start) / 60 + } + } + // round hours + for (const dayHourss of Object.values(dayMap)) { + for (const dayHours of dayHourss) { + dayHours.hours = ceilToNearest(dayHours.hours, 0.25) + } + } + // group entries with same task (but different comment) + for (const dayStr of Object.keys(dayMap)) { + dayMap[dayStr] = Object.values(groupBy(dayMap[dayStr], (we) => we.taskIntId)).map( + (workEntries) => ({ + hours: sum(workEntries.map((we) => we.hours)), + projectName: workEntries[0].projectName, + taskIntId: workEntries[0].taskIntId, + taskName: workEntries[0].taskName, + comment: + workEntries + .filter((we) => we.comment) + .map((we) => formatHours(we.hours) + ': ' + we.comment) + .join(', ') || undefined, + }), + ) + } + return dayMap +} + +export const ClarityView = observer((props: ClarityViewProps) => { + const { showing, submitTimesheets, onChangeSubmitTimesheets, errorHandler, clarityState } = props + const days = eachDayOfInterval(showing) + const clarityExport = transform(props) + const allWorkEntries = Object.values(clarityExport).flatMap((x) => x) + const tasksToShow = sortBy( + uniqBy(allWorkEntries, (we) => we.taskIntId), + (x) => +(-1 === x.taskIntId), // placeholder task last + (x) => x.projectName, + (x) => x.taskName, + ) + const theme = useTheme() + const classes = useStyles(props) + + return ( + + + + + Project / Task + {days.map((d) => ( + + {formatDate(d, 'EEEEEE, dd.MM')} + + ))} + Total + + + + {tasksToShow.map((taskToShow) => ( + + + {taskToShow.projectName} + {' / '} + {taskToShow.taskName} + + {days.map((d) => { + const workEntry = clarityExport[dayToString(d)]?.find( + (we) => we.taskIntId === taskToShow.taskIntId, + ) + return ( + + {workEntry?.comment && m/K } + {formatHours(workEntry?.hours ?? 0)} + + ) + })} + + {formatHours( + sum( + allWorkEntries + .filter((we) => we.taskIntId === taskToShow.taskIntId) + .map((we) => we.hours), + ), + )} + + + ))} + + + + + {days.map((d) => ( + + {formatHours(sum(clarityExport[dayToString(d)]?.map((we) => we.hours) ?? []))} + + ))} + {formatHours(sum(allWorkEntries.map((we) => we.hours)))} + + + + + {' '} + onChangeSubmitTimesheets(!!checked)} + /> + } + title='Autosubmit timesheets or just save them' + label='Autosubmit' + /> + + + ) +}) diff --git a/zedd-app/src/components/ErrorBoundary.tsx b/zedd-app/src/components/ErrorBoundary.tsx new file mode 100644 index 0000000..6c991d3 --- /dev/null +++ b/zedd-app/src/components/ErrorBoundary.tsx @@ -0,0 +1,41 @@ +import * as React from 'react' +import { Component } from 'react' +import { TextField } from '@material-ui/core' + +export class ErrorBoundary extends Component { + state = { error: undefined as any } + + constructor(props: {}) { + super(props) + } + + static getDerivedStateFromError(error: Error) { + // Update state so the next render will show the fallback UI. + return { error } + } + componentDidCatch(error: Error, errorInfo: any) { + // You can also log the error to an error reporting service + console.error(error, errorInfo) + // logErrorToMyService(error, errorInfo) + } + render() { + if (this.state.error) { + return ( +
+

An Error Occurred!

+ +
+ ) + } + return this.props.children + } +} diff --git a/zedd-app/src/components/RenameTaskDialog.tsx b/zedd-app/src/components/RenameTaskDialog.tsx new file mode 100644 index 0000000..74e8fc7 --- /dev/null +++ b/zedd-app/src/components/RenameTaskDialog.tsx @@ -0,0 +1,50 @@ +import { Dialog, DialogActions, DialogContent, DialogTitle } from '@material-ui/core' +import Button from '@material-ui/core/Button' +import TextField from '@material-ui/core/TextField' +import * as React from 'react' +import { useState } from 'react' + +import { Task } from '../AppState' + +export const RenameTaskDialog = ({ + task, + done, +}: { + task: Task + done: (newName: string) => void +}) => { + const [newName, setNewName] = useState(task.name) + + return ( + done(name)} + aria-labelledby='form-dialog-title' + maxWidth='lg' + > + Rename Task {task.name} +
+ + setNewName(e.target.value)} + fullWidth + /> + + + + + +
+
+ ) +} diff --git a/zedd-app/src/components/SettingsDialog.tsx b/zedd-app/src/components/SettingsDialog.tsx new file mode 100644 index 0000000..c28ed37 --- /dev/null +++ b/zedd-app/src/components/SettingsDialog.tsx @@ -0,0 +1,361 @@ +import { + Dialog, + DialogActions, + DialogContent, + DialogTitle, + TextField, + FormLabel, + CircularProgress, + Grid, + InputAdornment, + Checkbox, + FormControlLabel, + Tooltip, +} from '@material-ui/core' +import Button from '@material-ui/core/Button' +import * as React from 'react' +import { useState, useEffect, useCallback } from 'react' +import { remote } from 'electron' +import { observer } from 'mobx-react-lite' +import { uniq, debounce } from 'lodash' + +import { + getCurrentChromeDriverVersion, + getLatestChromeDriverVersion, + getChromeVersion, + installChromeDriver, +} from '../chromeDriverMgmt' +import { ClarityTaskSelect } from './ClarityTaskSelect' +import { ClarityState } from '../ClarityState' +import { ZeddSettings } from '../ZeddSettings' +import { toggle } from '../util' + +const { openExternal } = remote.shell + +const inExternal = (e: React.MouseEvent) => { + openExternal(e.currentTarget.href) + e.preventDefault() +} + +export const SettingsDialog = observer( + ({ + done, + clarityState, + settings, + checkCgJira, + }: { + done: () => void + clarityState: ClarityState + settings: ZeddSettings + checkCgJira: (cgJira: ZeddSettings['cgJira']) => Promise + }) => { + const [chromeVersion, setChromeVersion] = useState({} as { error?: any; value?: string }) + const [installedDriverVersion, setInstalledDriverVersion] = useState( + {} as { error?: any; value?: string }, + ) + const [latestDriverVersion, setLatestDriverVersion] = useState( + {} as { error?: any; value?: string }, + ) + const [cgJiraStatus, setCgJiraStatus] = useState( + {} as { error?: any; ok?: true; checking?: true }, + ) + + const updateVersions = () => { + setChromeVersion({}) + setInstalledDriverVersion({}) + setLatestDriverVersion({}) + + getChromeVersion() + .then((value) => { + setChromeVersion({ value }) + getLatestChromeDriverVersion(value) + .then((value) => setLatestDriverVersion({ value })) + .catch((error) => setLatestDriverVersion({ error })) + }) + .catch((error) => setChromeVersion({ error })) + getCurrentChromeDriverVersion() + .then((value) => setInstalledDriverVersion({ value })) + .catch((error) => setInstalledDriverVersion({ error })) + } + + useEffect(updateVersions, []) + + const checkCgJiraDebounced = useCallback( + debounce(() => { + const cgJira = settings.cgJira + if (cgJira.url && settings.cgJira.username && settings.cgJira.password) { + setCgJiraStatus({ checking: true }) + checkCgJira(cgJira) + .then(() => setCgJiraStatus({ ok: true })) + .catch((error) => setCgJiraStatus({ error })) + } + }, 2000), + [checkCgJira], + ) + + const canInstall = + latestDriverVersion.value && latestDriverVersion.value !== installedDriverVersion.value + + const projects = uniq([...clarityState.projectNames, ...settings.excludeProjects]) + projects.sort() + + return ( + done()} + aria-labelledby='form-dialog-title' + maxWidth='md' + fullWidth + > + Settings + + + + Hour Mask +
Regular worktimes. Used for sick/holidays.
+
+ + {['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'].map((d, di) => ( + (settings.workmask[di] = +e.target.value)} + /> + ))} + + + + Start Hour +
+ First hour of the calendar by default, as well as start hour for holidays etc. +
+
+ + (settings.startHour = +e.target.value)} + InputProps={{ + endAdornment: :00, + }} + inputProps={{ min: 1, max: 60, step: 1 }} + /> + + + + Min Idle Time +
+ Mininum user idle time in minutes which counts as "user is away". +
+
+ + (settings.minIdleTimeMin = +e.target.value)} + InputProps={{ + endAdornment: minutes, + }} + inputProps={{ min: 1, max: 60, step: 1 }} + /> + + + Keep Always On Top +
+ Will minimize to always-on-top after losing focus. +
+
+ + (settings.keepHovering = !!checked)} + /> + + + Clarity URL + + + (settings.nikuLink = e.target.value)} + /> + + + + Clarity Holiday Account + + + (settings.urlaubClarityTaskIntId = newIntId)} + /> + + + + Ersatz Task + + + (settings.ersatzTask = e.target.value.trim())} + /> + + + + Clarity Projects To Ignore +
+ Define clarity projects whoses tasks should not be imported. +
+
+ + {projects.map((x) => ( + toggle(settings.excludeProjects, e.target.value)} + /> + } + label={x} + /> + ))} + + + + PL JIRA +
Leave blank if not relevant.
+
+ + secure/Dashboard.jspa + ), + }} + value={settings.cgJira.url} + onChange={(e) => { + settings.cgJira.url = e.target.value.trim() + checkCgJiraDebounced() + }} + /> + + + + + { + settings.cgJira.username = e.target.value.trim() + checkCgJiraDebounced() + }} + /> + { + settings.cgJira.password = Buffer.from(e.target.value, 'utf8').toString('base64') + checkCgJiraDebounced() + }} + /> + {cgJiraStatus.checking ? ( + + ) : cgJiraStatus.ok ? ( + '✔️' + ) : cgJiraStatus.error ? ( + + + + ) : null} + + + + Current Chrome Version +
Must be on the PATH.
+
+ + {chromeVersion.error ? ( + + {'' + chromeVersion.error}{' '} + + Download Google Chrome + + + ) : chromeVersion.value ? ( + chromeVersion.value + ) : ( + + )} + + + + Installed Chromedriver Version + + + + {installedDriverVersion.error ? ( + {'' + installedDriverVersion.error} + ) : installedDriverVersion.value ? ( + installedDriverVersion.value + ) : ( + + )} + + + + + Latest Chromedriver Version + + + + {latestDriverVersion.error ? ( + + Could not GET latest chromedriver version. {'' + latestDriverVersion.error} + + ) : latestDriverVersion.value ? ( + <> +
{latestDriverVersion.value}
+
+ {canInstall && ( + <>The latest driver version does not match the installed one. + )} +
+ + ) : ( + + )} +
+
+
+
+ + + + + +
+ ) + }, +) diff --git a/zedd-app/src/components/TaskEditor.tsx b/zedd-app/src/components/TaskEditor.tsx new file mode 100644 index 0000000..b252246 --- /dev/null +++ b/zedd-app/src/components/TaskEditor.tsx @@ -0,0 +1,171 @@ +import { + Button, + Grid, + Paper, + TextField, + Tooltip, + MenuItem, + MenuList, + ClickAwayListener, + Popper, +} from '@material-ui/core' +import { Edit as EditIcon, GetApp as ImportIcon } from '@material-ui/icons' +import { format as formatDate, formatDistance } from 'date-fns' +import { observer } from 'mobx-react-lite' +import * as React from 'react' +import { useCallback, useState, useRef } from 'react' +import { NikuUrlInvalidError } from 'zedd-clarity' + +import { AppState, Task } from '../AppState' +import { ClarityState } from '../ClarityState' +import { ClarityTaskSelect } from './ClarityTaskSelect' +import { TaskSelect } from './TaskSelect' + +interface TaskEditorProps { + state: AppState + value: Task + clarityState: ClarityState + getTasksForSearchString: (s: string) => Promise + onTaskSelectChange: (t: Task) => void + style?: React.CSSProperties +} + +export const TaskEditor = observer( + ({ + state, + clarityState, + onTaskSelectChange, + value, + getTasksForSearchString, + style, + }: TaskEditorProps) => { + console.log('value', value) + const importClarityTasks = useCallback( + (which: string) => + clarityState + .importAndSaveClarityTasks( + state.config.excludeProjects, + 'ALL' === which ? 'ALL' : [which], + ) + .catch((e) => + state.errors.push( + e.message + + (e instanceof NikuUrlInvalidError + ? 'Check zeddConfig.nikuLink and reload config.' + : ''), + ), + ), + [clarityState, state], + ) + + const [popperOpen, setPopperOpen] = useState(false) + const anchorRef = useRef(null) + + return ( + + + onTaskSelectChange(state.getTaskForName(t))} + fullWidth + style={{ flex: '1 1 auto', width: '100%' }} + getTasksForSearchString={getTasksForSearchString} + handleError={(err) => state.errors.push(err.message)} + /> + + + + + + (value.clarityTaskIntId = newIntId)} + clarityState={clarityState} + /> + + + + + + + + setPopperOpen(false)}> + + { + setPopperOpen(false) + importClarityTasks('ALL') + }} + > + ALL + + {clarityState.projectNames.map((pn) => ( + { + setPopperOpen(false) + importClarityTasks(pn) + }} + > + {pn} + + ))} + + + + + + + + (value.clarityTaskComment = e.target.value)} + fullWidth={true} + /> + + + ) + }, +) diff --git a/zedd-app/src/components/TaskSelect.tsx b/zedd-app/src/components/TaskSelect.tsx new file mode 100644 index 0000000..34b060d --- /dev/null +++ b/zedd-app/src/components/TaskSelect.tsx @@ -0,0 +1,194 @@ +import { TextField, TextFieldProps, Popper, PopperProps } from '@material-ui/core' +import { makeStyles } from '@material-ui/core/styles' +import { Autocomplete } from '@material-ui/lab' +import PopperJs from 'popper.js' +import { debounce } from 'lodash' +import { observer } from 'mobx-react-lite' +import { remote } from 'electron' +import * as React from 'react' + +import { useCallback, useState, useRef, useEffect, RefObject } from 'react' +import { Task } from '../AppState' + +const { getCurrentWindow } = remote + +export type TaskSelectProps = { + tasks: Task[] + getTasksForSearchString: (search: string) => Promise + onChange: (event: React.ChangeEvent<{}>, value: Task | string | undefined) => void + value: Task + handleError: (err: Error) => void + textFieldStyle?: React.CSSProperties + hoverMode?: boolean +} & Omit + +type CancellablePromise = Promise & { cancelled: boolean; cancel(): void } + +function cancellable(p: Promise): CancellablePromise { + return { + p, + cancelled: false, + then(onfulfilled) { + return cancellable(p.then((x) => !this.cancelled && onfulfilled && onfulfilled(x))) + }, + finally(onfinally) { + return cancellable(p.finally(() => !this.cancelled && onfinally && onfinally())) + }, + catch(onrejected) { + return cancellable(p.catch((x) => !this.cancelled && onrejected && onrejected(x))) + }, + cancel() { + this.cancelled = true + }, + get [Symbol.toStringTag]() { + return p[Symbol.toStringTag] + }, + } as CancellablePromise + // let cancel: () => void + // const result: CancellablePromise = new Promise((resolve, reject) => { + // let cancelled = false + // p.then(x => !cancelled && resolve(x)).catch(x => !cancelled && reject(x)) + // cancel = () => (cancelled = true) + // }) as any + // result.cancel = cancel! + // return result +} + +function cancellingPrevious Promise>( + x: F, +): (...args: Parameters) => CancellablePromise { + let lastPromise: CancellablePromise | undefined = undefined + return ((...args: any[]) => { + lastPromise && lastPromise.cancel() + return (lastPromise = cancellable(x(...args))) + }) as any +} + +const useDebouncedEffect = () => {} + +const useStyles = makeStyles({ + listbox: { maxHeight: 'calc(max(300px, 80vh))' }, + inputRoot: { color: 'inherit' }, + inputInput: { color: 'inherit' }, + endAdornment: { color: 'inherit', '& *': { color: 'inherit' } }, + underline: { + '&&&:before': { + borderBottom: 'none', + }, + '&&:after': { + borderBottom: 'none', + }, + }, +}) +const CustomPopper = (props: PopperProps) => { + const ref: RefObject = useRef(null) + useEffect(() => { + console.log(ref.current) + setTimeout(() => console.log(ref.current), 2000) + }) + return ( + { + console.log(popper) + getCurrentWindow().setBounds({ height: popper.bottom | 0 }) + }, + onUpdate: ({ popper }) => { + console.log(popper) + getCurrentWindow().setBounds({ height: popper.bottom | 0 }) + }, + }} + ref={ref} + /> + ) +} + +export const TaskSelect = observer( + ({ + onChange, + tasks, + style, + textFieldStyle, + getTasksForSearchString, + value, + handleError, + hoverMode = false, + ...textFieldProps + }: TaskSelectProps) => { + const [options, setOptions] = useState([] as Task[]) + + const [currentRequest] = useState({ id: 0 }) + + const classes = useStyles() + + const getTasksForSearchStringDebounced = useCallback( + debounce((searchString: string) => { + if (searchString.length > 2) { + const requestId = ++currentRequest.id + getTasksForSearchString(searchString) + .then((ts) => requestId === currentRequest.id && setOptions(ts)) + .catch(handleError) + } + }, 1000), + [getTasksForSearchString], + ) + + const onTextFieldChange = useCallback( + (e: React.ChangeEvent) => getTasksForSearchStringDebounced(e.target.value), + [getTasksForSearchStringDebounced], + ) + + if (textFieldProps.inputProps) throw new Error('???') + + return ( + + 'string' === typeof t ? t : 'UNDEFINED' === t.name ? '' : t.name + } + classes={{ listbox: classes.listbox, endAdornment: classes.endAdornment }} + PopperComponent={hoverMode ? CustomPopper : undefined} + onClose={() => hoverMode && getCurrentWindow().setBounds({ height: 32 })} + renderInput={(params) => ( + + )} + renderOption={(t: Task) => ('UNDEFINED' === t.name ? '' : t.name)} + > + ) + }, +) diff --git a/zedd-app/src/components/TitleBar.tsx b/zedd-app/src/components/TitleBar.tsx new file mode 100644 index 0000000..1827a20 --- /dev/null +++ b/zedd-app/src/components/TitleBar.tsx @@ -0,0 +1,171 @@ +import { Button, AppBar, Menu as MuiMenu, MenuItem } from '@material-ui/core' +import { makeStyles, useTheme } from '@material-ui/core/styles' +import { + PlayArrow as PlayArrowIcon, + Stop as StopIcon, + Menu as MenuIcon, + OpenWith as ExpandIcon, + Remove as ToHoverIcon, +} from '@material-ui/icons' +import { remote, BrowserWindow } from 'electron' +import { observer, useLocalStore } from 'mobx-react-lite' +import * as React from 'react' +import { useEffect, useState } from 'react' +import { round } from 'lodash' + +import { AppState, Task } from '../AppState' +import { TaskSelect } from './TaskSelect' +import { ZeddSvgIcon } from './ZeddSvgIcon' +import { formatMinutes } from '../util' + +const { getCurrentWindow } = remote + +interface TitleBarProps { + state: AppState + getTasksForSearchString: (s: string) => Promise + menuItems: { label: string; click: () => void }[] +} + +const useStyles = makeStyles({ + input: { + color: 'inherit', + }, +}) + +const toggleWindowMaximized = (bw: BrowserWindow) => + bw.isMaximized() ? bw.unmaximize() : bw.maximize() + +export const TitleBar = observer(({ state, getTasksForSearchString, menuItems }: TitleBarProps) => { + const [anchorEl, setAnchorEl] = useState(null) + + const theme = useTheme() + + const local = useLocalStore(() => ({ + maximized: getCurrentWindow().isMaximized(), + })) + + useEffect(() => { + const onMaximize = () => (local.maximized = true) + const onUnmaximize = () => !state.hoverMode && (local.maximized = false) + getCurrentWindow().on('maximize', onMaximize) + getCurrentWindow().on('unmaximize', onUnmaximize) + return () => { + getCurrentWindow().removeListener('maximize', onMaximize) + getCurrentWindow().removeListener('unmaximize', onUnmaximize) + } + }) + + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget) + } + + const handleClose = () => { + setAnchorEl(null) + } + + return ( + +
+ +
+ {!state.hoverMode && ( + + )} + + {menuItems.map(({ label, click }) => ( + { + click() + setAnchorEl(null) + }} + > + {label} + + ))} + + + {state.lastAction} +
+ {formatMinutes(state.getTaskMinutes(state.currentTask))} BT +
+ (state.currentTask = state.getTaskForName(t))} + fullWidth + style={{ flex: '1 1 auto', width: '100%', flexGrow: 1, margin: 4 }} + getTasksForSearchString={getTasksForSearchString} + // inputProps={{ classes: classes.input }} + handleError={(err) => state.errors.push(err.message)} + hoverMode={state.hoverMode} + /> + {state.hoverMode && ( + + )} + {!state.hoverMode && ( + + )} + {!state.hoverMode && !state.config.keepHovering && ( + + )} + {!state.hoverMode && state.config.keepHovering && ( + + )} +
+ ) +}) diff --git a/zedd-app/src/components/ZeddSvgIcon.tsx b/zedd-app/src/components/ZeddSvgIcon.tsx new file mode 100644 index 0000000..c861cef --- /dev/null +++ b/zedd-app/src/components/ZeddSvgIcon.tsx @@ -0,0 +1,70 @@ +import * as React from 'react' +import { CSSProperties } from 'react' + +export const ZeddSvgIcon = ({ + res, + progress, + stopped, + background, +}: { + res: number + progress: number + stopped: boolean + background?: string +}) => { + const TAU = 2 * Math.PI + const strokeWidth = res === 24 ? 2 : res === 16 ? 1.2 : Math.round(res * 0.1) + const resHalf = res / 2 + const strokeProps: React.SVGAttributes<{}> = { + strokeWidth, + strokeLinejoin: 'round', + strokeLinecap: 'round', + stroke: 'currentColor', + } + const octRadius = (resHalf - strokeWidth / 2) / Math.cos(TAU / 8 / 2) + const longHandLength = resHalf - strokeWidth + const shortHandLength = resHalf / 2 + + return ( + + {background && } + {stopped ? ( + + { + const rad = (TAU * (i + 0.5)) / 8 + return Math.cos(rad) * octRadius + ' ' + Math.sin(rad) * octRadius + }) + .join(' ')} + {...strokeProps} + fill='none' + /> + + + + ) : ( + + + + + + )} + + ) +} diff --git a/zedd-app/src/feiertage.json b/zedd-app/src/feiertage.json new file mode 100644 index 0000000..7ec95f0 --- /dev/null +++ b/zedd-app/src/feiertage.json @@ -0,0 +1,35 @@ +{ + "2019-01-01": "Neujahr", + "2019-04-19": "Karfreitag (Ostern)", + "2019-04-22": "Ostermontag (Ostern)", + "2019-05-01": "Tag der Arbeit", + "2019-05-30": "Christi Himmelfahrt", + "2019-06-10": "Pfingstmontag (Pfingsten)", + "2019-06-20": "Fronleichnam", + "2019-10-03": "Tag der Deutschen Einheit", + "2019-12-25": "1. Weihnachtstag (Weihnachten)", + "2019-12-26": "2. Weihnachtstag (Weihnachten)", + "2019-10-25": "IWISH", + + "2020-01-01": "Neujahr", + "2020-04-10": "Karfreitag (Ostern)", + "2020-04-13": "Ostermontag (Ostern)", + "2020-05-01": "Tag der Arbeit", + "2020-05-21": "Christi Himmelfahrt", + "2020-06-01": "Pfingstmontag (Pfingsten)", + "2020-06-11": "Fronleichnam", + "2020-10-03": "Tag der Deutschen Einheit", + "2020-12-25": "1. Weihnachtstag (Weihnachten)", + "2020-12-26": "2. Weihnachtstag (Weihnachten)", + + "2021-01-01": "Neujahr", + "2021-04-02": "Karfreitag (Ostern)", + "2021-04-05": "Ostermontag (Ostern)", + "2021-05-01": "Tag der Arbeit", + "2021-05-13": "Christi Himmelfahrt", + "2021-05-24": "Pfingstmontag (Pfingsten)", + "2021-06-03": "Fronleichnam", + "2021-10-03": "Tag der Deutschen Einheit", + "2021-12-25": "1. Weihnachtstag (Weihnachten)", + "2021-12-26": "2. Weihnachtstag (Weihnachten)" +} diff --git a/zedd-app/src/index.css b/zedd-app/src/index.css new file mode 100644 index 0000000..0fd829a --- /dev/null +++ b/zedd-app/src/index.css @@ -0,0 +1,47 @@ +html, +body { + height: 100%; + overflow: hidden; +} + +#react-root { + height: 100%; + display: flex; + flex-direction: column; +} +/* +div:focus { + box-shadow: 0 0 10px blue; */ +/* outline-width: 0px 10px 0px 10px; */ +/* outline-style: solid; */ +/* outline-color: red; */ +/* outline: 0; + z-index: 1000; +} */ + +.block-handle { + position: absolute; + cursor: ns-resize; + border-color: black; + border-style: none; + height: 5px; + width: 30%; +} +.bottom-right { + right: 0; + bottom: 0; + border-width: 0px 2px 2px 0px; +} +.top-left { + top: 0; + left: 0; + border-width: 2px 0px 0px 2px; +} +.top-center { + border-width: 2px; + left: 35%; + top: -2.5px; +} +div:hover > .block-handle { + border-style: solid; +} diff --git a/zedd-app/src/index.html b/zedd-app/src/index.html new file mode 100644 index 0000000..d2c499a --- /dev/null +++ b/zedd-app/src/index.html @@ -0,0 +1,21 @@ + + + + + Zedd! Loading... + + + +
+ + diff --git a/zedd-app/src/main.ts b/zedd-app/src/main.ts new file mode 100644 index 0000000..8818492 --- /dev/null +++ b/zedd-app/src/main.ts @@ -0,0 +1,118 @@ +import { app, ipcMain, BrowserWindow } from 'electron' +import { homedir } from 'os' +import * as path from 'path' + +declare global { + namespace NodeJS { + interface Global { + isDev: boolean + appUserModelId: string + } + } +} + +global.isDev = process.argv.includes('--dev') + +global.appUserModelId = global.isDev ? process.execPath : 'com.squirrel.zedd.zedd-app' +app.setAppUserModelId(global.appUserModelId) +app.allowRendererProcessReuse = false + +process.env.ELECTRON_DISABLE_SECURITY_WARNINGS = '1' + +// Handle creating/removing shortcuts on Windows when installing/uninstalling. +if (require('electron-squirrel-startup')) { + // eslint-disable-line global-require + app.quit() +} +if (!app.requestSingleInstanceLock()) { + app.quit() +} + +app.on('second-instance', (_event, _commandLine, _workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (mainWindow) { + if (mainWindow.isMinimized()) mainWindow.restore() + mainWindow.focus() + } +}) + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let mainWindow: BrowserWindow | undefined +let userQuit: boolean = false +const createWindow = () => { + if (global.isDev) { + BrowserWindow.addDevToolsExtension( + path.join( + homedir(), + // react-devtools + 'AppData/Local/Google/Chrome/User Data/Default/Extensions/fmkadmapgofadopljbjfkapdkoienihi/4.5.0_0', + ), + ) + } + + // Create the browser window. + mainWindow = new BrowserWindow({ + width: 800, + height: 600, + frame: false, + webPreferences: { + nodeIntegration: true, + webSecurity: false, + }, + }) + + mainWindow.loadURL(MAIN_WINDOW_WEBPACK_ENTRY) + + if (global.isDev) { + // Open the DevTools. + mainWindow.webContents.openDevTools() + } + + // This must be done here, because registered callbacks in the renderer + // process are async and preventDefault is ignored + mainWindow.on('close', (e) => { + if (!userQuit) { + e.preventDefault() + } + }) + // mainWindow.on('minimize', () => mainWindow!.hide()) + + // Emitted when the window is closed. + mainWindow.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = undefined + }) +} + +ipcMain.on('user-quit', () => { + userQuit = true + app.quit() +}) + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow) + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit() + } +}) + +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (null === mainWindow) { + createWindow() + } +}) + +// In this file you can include the rest of your app's specific main process +// code. You can also put them in separate files and import them here. diff --git a/zedd-app/src/plJiraConnector.ts b/zedd-app/src/plJiraConnector.ts new file mode 100644 index 0000000..6eff68f --- /dev/null +++ b/zedd-app/src/plJiraConnector.ts @@ -0,0 +1,160 @@ +import { compareDesc, differenceInMinutes } from 'date-fns' +import JiraClient from 'jira-connector' +// @ts-ignore +import * as request from 'request' + +import { Task } from './AppState' +import { ClarityTask } from './ClarityState' +import './index.css' +import { clarityState } from './renderer' +import { ZeddSettings } from './ZeddSettings' + +// Initialize +const jar = request.jar() +let jiraConfig: ZeddSettings['cgJira'] +let jira: JiraClient + +export function initJiraClient(jc: ZeddSettings['cgJira']) { + jiraConfig = jc + const url = new URL(jc.url) + jira = new JiraClient({ + host: url.host, + protocol: url.protocol, + port: url.port ? +url.port : undefined, + path_prefix: url.pathname, + basic_auth: { + username: jc.username, + password: Buffer.from(jc.password, 'base64').toString('utf8'), + }, + cookie_jar: jar, + }) +} + +let lastJiraCall: Date | undefined = undefined + +const externalJiraField = 'customfield_10216' +const clarityTaskField = 'customfield_10301' + +const jiraConnectorErrorToMessage = (x: any) => { + console.error(x) + const { body, request } = JSON.parse(x) + throw new Error(request.method + ' ' + request.uri.href + ' returned ' + body) +} + +export const checkCgJira = (config: ZeddSettings['cgJira']) => { + return new Promise((resolve, reject) => + request( + { + method: 'GET', + jar, + url: config.url, + auth: { + username: config.username, + password: Buffer.from(config.password, 'base64').toString('utf8'), + }, + }, + (err: any, response: any) => { + if (err) { + reject(err) + } else if (response.statusCode >= 400) { + console.error(response) + reject( + new Error( + response.request.method + + ' ' + + response.request.uri.href + + ' returned ' + + response.statusCode + + ' ' + + response.statusMessage, + ), + ) + } else { + resolve(response) + } + }, + ), + ) +} + +const callWithJsessionCookie = async (cb: () => Promise) => { + if (!lastJiraCall || differenceInMinutes(new Date(), lastJiraCall) > 10) { + await checkCgJira(jiraConfig) + lastJiraCall = new Date() + } + + return cb() +} + +export const getTasksFromAssignedJiraIssues = (clarityTasks: ClarityTask[]): Promise => + callWithJsessionCookie(async () => { + const result = await jira.search + .search({ + jql: jiraConfig.currentIssuesJql, + }) + .catch(jiraConnectorErrorToMessage) + console.log(result) + + return Promise.all(result.issues.map((i) => issueInfoToTask(clarityTasks, i))) + }) + +export const getTasksForSearchString = async (s: string): Promise => + callWithJsessionCookie(async () => { + const sClean = s.trim().replace('"', '\\\\"') + const orKeyMatch = sClean.match(/^[a-z]{1,6}-\d+$/i) ? ` OR key = "${sClean}"` : '' + const jql = `(text ~ "${sClean}*"${orKeyMatch}) AND resolution = Unresolved ORDER BY updated DESC` + console.log('searching ' + jql) + const result = await jira.search + .search({ + jql, + }) + .catch(jiraConnectorErrorToMessage) + return Promise.all(result.issues.map((i) => issueInfoToTask(clarityState.tasks, i))) + }) + +const issueInfoToTask = async (clarityTasks: ClarityTask[], i: any): Promise => { + if (i.fields.parent) { + const result = await callWithJsessionCookie(() => + jira.search + .search({ + jql: `key=${i.fields.parent.key}`, + }) + .catch(jiraConnectorErrorToMessage), + ) + return issueInfoToTask(clarityTasks, result.issues[0]) + } + + const externalKey = i.fields[externalJiraField] + const clarityTaskFieldValue = i.fields[clarityTaskField]?.[0]?.trim() + let clarityTaskId: number | undefined + if (clarityTaskFieldValue) { + clarityTaskId = clarityTasks + .filter((t) => t.name === clarityTaskFieldValue) + .sort((a, b) => compareDesc(a.start, b.start))[0]?.intId + if (!clarityTaskId) { + console.warn( + "No clarity-account found for JIRA Clarity-Task Field '" + clarityTaskFieldValue + "'", + ) + } + } else if (externalKey) { + clarityTaskId = clarityTasks + .filter((t) => t.name.includes(externalKey)) + .sort((a, b) => compareDesc(a.start, b.start))[0]?.intId + if (!clarityTaskId) { + console.warn("No clarity-account found for exernal JIRA-Key '" + externalKey + "'") + } + } + console.log( + 'resolved ', + i.fields.summary, + clarityTaskId, + clarityTasks.find((t) => t.intId === clarityTaskId), + ) + return new Task( + (externalKey ? externalKey + '/' : '') + + i.key + + ': ' + + i.fields.summary.replace(new RegExp('^' + externalKey + ':? ?'), ''), + clarityTaskId, + ) +} diff --git a/zedd-app/src/renderer.ts b/zedd-app/src/renderer.ts new file mode 100644 index 0000000..5ad2422 --- /dev/null +++ b/zedd-app/src/renderer.ts @@ -0,0 +1,356 @@ +import { parse as dateParse } from 'date-fns' +import { ipcRenderer, remote, BrowserWindow, MenuItemConstructorOptions, Rectangle } from 'electron' +// @ts-ignore +import { ToastNotification } from 'electron-windows-notifications' +import { promises as fsp } from 'fs' +import { autorun, computed } from 'mobx' +import * as path from 'path' +import * as React from 'react' +import * as ReactDOM from 'react-dom' + +import { dateFormatString, format, AppState, TimeSlice } from './AppState' +import { ClarityState } from './ClarityState' +import { AppGui } from './components/AppGui' +import './index.css' +import { + getTasksForSearchString, + getTasksFromAssignedJiraIssues, + initJiraClient, + checkCgJira, +} from './plJiraConnector' +import toastTemplate from './toast-template.xml' +import { + fileExists, + formatMinutes as formatMinutesBT, + formatMinutesHHmm, + mkdirIfNotExists, + round, +} from './util' +import { ZeddSettings } from './ZeddSettings' +import { floor } from '../out/zedd-app-win32-x64/resources/app/src/util' + +const { Tray, Menu, getCurrentWindow, app, shell, screen: electronScreen, powerMonitor } = remote +const currentWindow = getCurrentWindow() +const saveDir = path.join(app.getPath('home'), 'zedd') + +const clarityDir = path.join(saveDir, 'clarity') + +const userConfigFile = path.join(saveDir, 'zeddconfig.json') + +const d = (...x: any[]) => console.log('renderer.ts', ...x) + +function showNotification( + title: string, + text: string, + [button1Text, button1Args]: [string, string], + [button2Text, button2Args]: [string, string], + cb: (notification: any, args: { arguments: string }) => void, +) { + const notification = new ToastNotification({ + template: toastTemplate, + strings: [title, text, button1Text, button1Args, button2Text, button2Args], + }) + notification.on('activated', cb) + notification.show() +} + +function quit() { + ipcRenderer.send('user-quit') +} + +const menuItems = [ + { + label: 'Open Config Dir', + click: () => shell.showItemInFolder(userConfigFile), + }, + { label: 'Edit Settings', click: () => (state.settingsDialogOpen = true) }, + + { label: 'Github', click: () => shell.openExternal('https://github.com/NaridaL/zedd') }, + { label: 'Open Dev', click: () => getCurrentWindow().webContents.openDevTools() }, + { label: 'Reload Config', click: () => getCurrentWindow().reload() }, + { label: 'Quit', click: () => quit() }, +] +let config: ZeddSettings +let state: AppState +let cleanup: () => void +const saveWindowBounds = ({ sender }: { sender: BrowserWindow }) => { + if (state && !state.hoverMode) { + if (sender.isMaximized()) { + state.bounds.maximized = true + } else { + state.bounds.maximized = false + state.bounds.normal = sender.getBounds() + } + } + if (state && state.hoverMode) { + state.bounds.hover = sender.getBounds() + } +} + +async function setup() { + const currentWindowEvents: [string, Function][] = [] + try { + state = await AppState.loadFromDir(path.join(saveDir, 'data')) + d(state) + d('Cleaning save dir') + const deletedFileCount = await AppState.cleanSaveDir(path.join(saveDir, 'data')) + d(`Deleted ${deletedFileCount} files.`) + } catch (e) { + console.error(e) + console.error('Could not load state from ' + path.join(saveDir, 'data')) + state = new AppState() + } + state.startInterval() + state.config = config + state.idleSliceNotificationCallback = (when) => { + console.log('You were away ' + format(when.start) + ' - ' + format(when.end)) + showNotification( + 'You were away ' + format(when.start) + ' - ' + format(when.end), + 'Close to discard or choose what to assign.', + [ + state.currentTask.name.substring(0), + format(when.start) + ' - ' + format(when.end) + ' ' + state.currentTask.name, + ], + ['Other', 'other'], + (_, wargs) => { + if ('other' === wargs.arguments) { + } else { + const [, startString, endString, taskName] = wargs.arguments.match( + /(.{16}) - (.{16}) (.*)/, + )! + + const now = new Date() + state.addSlice( + new TimeSlice( + dateParse(startString, dateFormatString, now), + dateParse(endString, dateFormatString, now), + state.getTaskForName(taskName), + ), + ) + } + }, + ) + } + + const boundsContained = (outer: Rectangle, inner: Rectangle, margin = 0) => + outer.x - inner.x <= margin && + outer.y - inner.y <= margin && + inner.x + inner.width - (outer.x + outer.width) <= margin && + inner.y + inner.height - (outer.y + outer.height) <= margin + + console.log(electronScreen.getPrimaryDisplay().bounds, state.bounds) + + const saveInterval = setInterval( + () => AppState.saveToDir(state, path.join(saveDir, 'data')), + 10 * 1000, + ) + + const lastActionInterval = setInterval( + () => (state.lastAction = powerMonitor.getSystemIdleTime()), + 1000, + ) + + currentWindowEvents.push([ + 'close', + (e: Electron.Event) => { + if (config.keepHovering) { + state.hoverMode = true + } else { + currentWindow.hide() + } + }, + ]) + + const hoverModeOff = () => (state.hoverMode = false) + const restoreUnmaximizedBoundsIfNotHoverMode = () => + !state.hoverMode && currentWindow.setBounds(state.bounds.normal) + + currentWindowEvents.push(['resize', saveWindowBounds]) + currentWindowEvents.push(['maximize', saveWindowBounds]) + currentWindowEvents.push(['maximize', hoverModeOff]) + currentWindowEvents.push(['unmaximize', restoreUnmaximizedBoundsIfNotHoverMode]) + currentWindowEvents.push(['move', saveWindowBounds]) + const currentIconImage = computed(() => { + const NUMBER_OF_SAMPLES = 12 + if (state.timingInProgess) { + return ( + app.getAppPath() + + '/' + + 'icons/progress' + + floor((state.getDayProgress(new Date()) % 1) * NUMBER_OF_SAMPLES) + + '.ico' + ) + } else { + return app.getAppPath() + '/' + 'icons/paused.ico' + } + }) + const tray = new Tray(currentIconImage.get()) + tray.on('double-click', () => { + getCurrentWindow().show() + }) + + const cleanupTrayMenuAutorun = autorun(() => { + tray.setContextMenu( + Menu.buildFromTemplate([ + // Quit first, so it is the furthest from the mouse + { + label: 'Quit', + type: 'normal', + click: () => quit(), + }, + + { type: 'separator' }, + + ...state.getSuggestedTasks().map( + (t): MenuItemConstructorOptions => ({ + label: t.name, + type: 'checkbox', + checked: state.currentTask === t, + click: (x) => (state.currentTask = state.getTaskForName(x.label)), + }), + ), + + { type: 'separator' }, + + { + label: state.timingInProgess ? '■ Stop Timing' : '▶️ Start Timing', + type: 'normal', + click: () => state.toggleTimingInProgress(), + }, + ]), + ) + }) + const cleanupIconAutorun = autorun(() => { + tray.setImage(currentIconImage.get()) + currentWindow.setIcon(currentIconImage.get()) + }) + const cleanupTrayTooltipAutorun = autorun(() => { + const workedTime = formatMinutesHHmm(state.getDayWorkedMinutes(new Date())) + const timingInfo = + state.timingInProgess && state.currentTask + ? '▶️ Currently Timing: ' + + state.currentTask.name + + ' ' + + formatMinutesBT(state.getTaskMinutes(state.currentTask)) + + 'BT' + : '■ Not Timing' + tray.setToolTip(workedTime + ' ' + timingInfo) + document.title = workedTime + ' ' + timingInfo + }) + + let hoverModeTimer: NodeJS.Timeout | undefined + currentWindowEvents.push( + [ + 'blur', + () => + config.keepHovering && + !state.hoverMode && + (hoverModeTimer = setTimeout(() => (d('uhm'), (state.hoverMode = true)), 15_000)), + ], + ['focus', () => hoverModeTimer && clearTimeout(hoverModeTimer)], + ) + + const cleanupHoverModeAutorun = autorun(() => { + currentWindow.setSkipTaskbar(state.hoverMode) + currentWindow.setAlwaysOnTop(state.hoverMode) + // currentWindow.resizable = !state.hoverMode + console.log('currentWindow.resizable', currentWindow.resizable) + // console.log('showing:', state.hoverMode, !currentWindow.isVisible) + // state.hoverMode && !currentWindow.isVisible && currentWindow.show() + if (state.hoverMode) { + currentWindow.isMaximized && currentWindow.unmaximize() + currentWindow.setBounds({ + ...state.bounds.hover, + height: 32, + width: Math.min(800, state.bounds.hover.width), + }) + } else { + currentWindow.setBounds(state.bounds.normal) + if (state.bounds.maximized) { + currentWindow.maximize() + } + } + }) + + currentWindowEvents.forEach(([x, y]) => currentWindow.on(x as any, y)) + + return () => { + clearInterval(saveInterval) + clearInterval(lastActionInterval) + cleanupIconAutorun() + cleanupTrayMenuAutorun() + cleanupTrayTooltipAutorun() + state.cleanup() + tray.destroy() + cleanupHoverModeAutorun() + currentWindowEvents.forEach(([x, y]) => currentWindow.removeListener(x as any, y)) + } +} + +export const clarityState = new ClarityState(clarityDir) + +function renderDom() { + ReactDOM.render( + React.createElement(AppGui, { + state, + checkCgJira, + clarityState, + menuItems, + getTasksForSearchString: (s) => + getTasksForSearchString(s).then((ts) => + ts.filter((t) => !state.tasks.some((t2) => t2.name === t.name)), + ), + }), + document.getElementById('react-root'), + ) +} + +async function main() { + await mkdirIfNotExists(saveDir) + + config = (await fileExists(userConfigFile)) + ? await ZeddSettings.readFromFile(userConfigFile) + : new ZeddSettings(userConfigFile) + + d('clarityDir=' + clarityDir) + clarityState.init() + clarityState.nikuLink = config.nikuLink + + // await sleep(5000); + // importAndSaveClarityTasks(); + try { + await clarityState.loadStateFromFile() + } catch (e) { + console.error('Could not load clarity tasks') + console.error(e) + } + + try { + initJiraClient(config.cgJira) + } catch (e) { + console.error('Could not init JiraClient') + console.error(e) + } + getTasksFromAssignedJiraIssues(clarityState.tasks) + .then((e) => (state.assignedIssueTasks = e.map((t) => state.normalizeTask(t)))) + .catch((err) => state.errors.push(err.message)) + + cleanup = await setup() + // window.addEventListener('beforeunload', cleanup) + + renderDom() +} +main() + +if (module.hot) { + module.hot.accept('./components/AppGui', () => { + renderDom() + }) + module.hot.accept('./AppState', async () => { + cleanup() + cleanup = await setup() + renderDom() + }) + module.hot.dispose(() => cleanup()) + module.hot.accept() +} diff --git a/zedd-app/src/toast-template.xml b/zedd-app/src/toast-template.xml new file mode 100644 index 0000000..86290a2 --- /dev/null +++ b/zedd-app/src/toast-template.xml @@ -0,0 +1,13 @@ + + + + + %s + %s + + + + + + + \ No newline at end of file diff --git a/zedd-app/src/typings.d.ts b/zedd-app/src/typings.d.ts new file mode 100644 index 0000000..28c2fc6 --- /dev/null +++ b/zedd-app/src/typings.d.ts @@ -0,0 +1,4 @@ +declare const MAIN_WINDOW_WEBPACK_ENTRY: string +declare module '*.xml' { + export default string +} diff --git a/zedd-app/src/util.test.ts b/zedd-app/src/util.test.ts new file mode 100644 index 0000000..9b70d48 --- /dev/null +++ b/zedd-app/src/util.test.ts @@ -0,0 +1,28 @@ +import * as assert from 'assert' +import { parseISO } from 'date-fns' +import { splitIntervalIntoCalendarDays } from './util' + +describe('splitIntervalIntoCalendarDays', () => { + it('works', () => { + assert.deepStrictEqual( + splitIntervalIntoCalendarDays({ + start: parseISO('2019-10-20T11:35'), + end: parseISO('2019-10-22T10:00'), + }), + [ + { + start: parseISO('2019-10-20T11:35'), + end: parseISO('2019-10-21T00:00'), + }, + { + start: parseISO('2019-10-21T00:00'), + end: parseISO('2019-10-22T00:00'), + }, + { + start: parseISO('2019-10-22T00:00'), + end: parseISO('2019-10-22T10:00'), + }, + ], + ) + }) +}) diff --git a/zedd-app/src/util.ts b/zedd-app/src/util.ts new file mode 100644 index 0000000..0b96bae --- /dev/null +++ b/zedd-app/src/util.ts @@ -0,0 +1,189 @@ +import * as chroma from 'chroma.ts' +import { + addDays, + addMinutes, + addSeconds, + compareDesc, + endOfMonth, + format as formatDate, + isBefore, + isEqual, + lastDayOfISOWeek, + parse as parseDate, + roundToNearestMinutes, + startOfDay, + startOfISOWeek, + startOfMinute, + startOfMonth, +} from 'date-fns' +import { promises as fsp, PathLike } from 'fs' +import * as fs from 'fs' +import { promisify } from 'util' + +export const FILE_DATE_FORMAT = "yyyyMMdd'T'HHmm" + +export const fileExists = promisify(fs.exists) + +/** + * + * @param dir + * @param regex The first capturing group must match a Date in the format FILE_DATE_FORMAT. + */ +export const getLatestFileInDir = async (dir: PathLike, regex: RegExp): Promise<[string, Date]> => { + const filesWithDate = await readFilesWithDate(dir, regex) + if (0 === filesWithDate.length) { + throw new Error( + `Could not find file matching ${regex} in ${dir}. files=${filesWithDate.map(([f]) => f)}`, + ) + } + return filesWithDate[0] +} +export const readFilesWithDate = async ( + dir: PathLike, + regex: RegExp, +): Promise<[string, Date][]> => { + const files = await fsp.readdir(dir) + return files + .filter((f) => regex.test(f)) + .map((f) => [f, parseDate(regex.exec(f)![1], FILE_DATE_FORMAT, new Date())] as [string, Date]) + .sort(([_bFile, aDate], [_aFile, bDate]) => compareDesc(aDate, bDate)) +} + +/** + * Sorts the files in a directory descendingly by the parsed date. Calls the callback on the first + * file. If an error is thrown, the callback is called on the second file, etc... + * + * @param dir Directory from which to read/parse the date from files. + * @param regex Regex matching the filenames to consider. The first capturing group must match a + * Date in the format FILE_DATE_FORMAT. + * @param cb The callback called with file and date. + */ +export const tryWithFilesInDir = async ( + dir: PathLike, + regex: RegExp, + cb: (f: string, date: Date) => Promise, +): Promise => { + const filesWithDate = await readFilesWithDate(dir, regex) + for (const [f, date] of filesWithDate) { + try { + return await cb(f, date) + } catch (e) { + console.warn('Error calling callback with', f, e) + } + } + throw new Error( + `Tried ${filesWithDate.length} files. None returned a value. See log for exceptions.`, + ) +} + +export const { abs, floor, ceil, round, imul, min } = Math + +export async function mkdirIfNotExists( + dir: PathLike, + options?: number | string | fs.MakeDirectoryOptions | null, +) { + const dirExists = await fileExists(dir) + if (!dirExists) { + await fsp.mkdir(dir, options) + } + return !dirExists +} + +export const startOfNextMinute = (d: Date | number) => startOfMinute(addMinutes(d, 1)) + +export const startOfNextDay = (d: Date | number) => startOfDay(addDays(d, 1)) + +export function splitIntervalIntoCalendarDays(interval: Interval): Interval[] { + const result = [] + let { start, end } = interval + while (end > startOfNextDay(start)) { + result.push({ start: start, end: startOfNextDay(start) }) + start = startOfNextDay(start) + } + result.push({ start, end }) + return result +} +export const sum = (nums: number[]) => nums.reduce((a, b) => a + b, 0) + +export const formatMinutesHHmm = (mins: number) => { + return ((mins / 60) | 0) + ':' + ('' + (mins % 60)).padStart(2, '0') +} +export const formatMinutes = (mins: number) => { + return (mins / (60 * 8)).toLocaleString('de-DE', { + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }) +} + +export const isoWeekInterval = (d: Date | number) => ({ + start: startOfISOWeek(d), + end: lastDayOfISOWeek(d), +}) + +export const toggle = (arr: any[], value: any) => { + const idx = arr.indexOf(value) + if (idx !== -1) { + arr.splice(idx, 1) + } else { + arr.push(value) + } +} + +export const intRange = (startIncl: number, endExcl: number) => + Array(endExcl - startIncl) + .fill(undefined) + .map((_, i) => startIncl + i) + +export const monthInterval = (d: Date | number) => ({ start: startOfMonth(d), end: endOfMonth(d) }) + +/** + * Given an array `input`, returns a new array such that for all pairs (s, t) of the + * new array, cmp(s, t) == false + */ +export const uniqCustom = (input: T[], equals: (s: T, t: T) => boolean): T[] => { + const result: T[] = [] + for (const s of input) { + if (!result.some((t) => equals(s, t))) { + result.push(s) + } + } + return result +} + +export const businessWeekInterval = (d: Date | number) => ({ + start: startOfISOWeek(d), + end: addDays(lastDayOfISOWeek(d), -2), +}) + +export const getDayInterval = (date: Date) => { + const start = startOfDay(date) + return { start, end: addDays(start, 1) } +} + +export const isBeforeOrEqual = (d: Date, d2: Date) => isBefore(d, d2) || isEqual(d, d2) + +export const ilog = (x: T, ...more: any[]) => (console.log(x, ...more), x) + +export const roundDownToQuarterHour = (date: Date) => { + return roundToNearestMinutes(addSeconds(date, -7.5 * 60), { nearestTo: 15 }) +} + +export const isoDay = (date: Date) => { + return formatDate(date, 'yyyy-MM-dd') +} + +export function omap(x: { [P in K]: T }, f: (t: T) => M) { + const result: { [P in K]: M } = {} as any + for (const k of Object.keys(x)) result[k as K] = f(x[k as K]) + return result +} + +export const stringHash = (str: string) => { + let h: number = 0 + for (let i = 0; i < str.length; i++) h = (imul(31, h) + str.charCodeAt(i)) | 0 + return h +} + +export const stringHashColor = (str: string) => { + return chroma.num(stringHash(str) & 0xffffff) +} diff --git a/zedd-app/tsconfig.json b/zedd-app/tsconfig.json new file mode 100644 index 0000000..11f7c76 --- /dev/null +++ b/zedd-app/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "removeComments": false, + "preserveConstEnums": true, + "sourceMap": true, + "declaration": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "suppressImplicitAnyIndexErrors": true, + "strictNullChecks": true, + "noUnusedLocals": true, + "noImplicitThis": true, + "allowJs": true, + "noUnusedParameters": true, + "importHelpers": true, + "noEmitHelpers": true, + "module": "esnext", + "skipLibCheck": true, + "resolveJsonModule": true, + "noEmit": true, + "moduleResolution": "node", + "pretty": true, + "target": "es2019", + "jsx": "react", + "allowSyntheticDefaultImports": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "formatCodeOptions": { + "indentSize": 2, + "tabSize": 2 + } +} \ No newline at end of file diff --git a/zedd-app/tslint.json b/zedd-app/tslint.json new file mode 100644 index 0000000..f13f46f --- /dev/null +++ b/zedd-app/tslint.json @@ -0,0 +1,36 @@ +{ + "defaultSeverity": "error", + "extends": ["tslint-config-prettier"], + "jsRules": {}, + "rules": { + "no-var-keyword": true, + "yoda": true, + "triple-equals": true, + "member-access": true, + "member-ordering": [ + true, + { + "order": "fields-first" + } + ], + "prefer-const": [ + true, + { + "destructuring": "all" + } + ], + "no-unused-expression": true, + "no-unnecessary-qualifier": true, + "no-null-keyword": true, + "no-unnecessary-type-assertion": true, + "no-string-throw": true, + "ordered-imports": [ + true, + { + "import-sources-order": "lowercase-last", + "named-imports-order": "lowercase-first" + } + ] + }, + "rulesDirectory": [] +} diff --git a/zedd-app/webpack.main.config.js b/zedd-app/webpack.main.config.js new file mode 100644 index 0000000..7dd447a --- /dev/null +++ b/zedd-app/webpack.main.config.js @@ -0,0 +1,11 @@ +module.exports = { + /** + * This is the main entry point for your application, it's the first file + * that runs in the main process. + */ + entry: "./src/main.ts", + // Put your normal webpack config below here + module: { + rules: require("./webpack.rules") + } +}; diff --git a/zedd-app/webpack.renderer.config.js b/zedd-app/webpack.renderer.config.js new file mode 100644 index 0000000..c94615a --- /dev/null +++ b/zedd-app/webpack.renderer.config.js @@ -0,0 +1,37 @@ +const rules = require('./webpack.rules') + +rules.push({ + test: /\.css$/, + use: [{ loader: 'style-loader' }, { loader: 'css-loader' }], +}) +module.exports = { + // Put your normal webpack config below here + resolve: { + // Add `.ts` and `.tsx` as a resolvable extension. + extensions: ['.ts', '.tsx', '.js', '.xml'], + }, + module: { + rules, + }, + externals: [ + function(context, request, callback) { + if ( + [ + 'bindings', + // 'mobx-react', + // 'mobx', + // 'react-dom', + // 'react', + 'selenium-webdriver', + 'selenium-webdriver/chrome', + 'electron-windows-notifications', + 'zedd-win32', + ].includes(request) || + /^\w:\\.*/.test(request) + ) { + return callback(null, 'commonjs ' + request) + } + callback() + }, + ], +} diff --git a/zedd-app/webpack.rules.js b/zedd-app/webpack.rules.js new file mode 100644 index 0000000..f0a727c --- /dev/null +++ b/zedd-app/webpack.rules.js @@ -0,0 +1,62 @@ +module.exports = [ + { + test: /\.(txt|xml)$/i, + use: 'raw-loader', + }, + // Add support for native node modules + { + test: /\.node$/, + use: 'node-loader', + }, + { + test: /\.(m?js|node|selenium-webdriver)$/, + parser: { amd: false }, + use: { + loader: '@marshallofsound/webpack-asset-relocator-loader', + options: { + outputAssetBase: 'native_modules', + }, + }, + }, + { + test: /\.tsx?$/, + exclude: /(node_modules|.webpack)/, + loaders: [ + // use babel-plugin-import to convert import {...} from '@material-ui/icons' + // to default icons. REMOVING THIS WILL LEAD TO LONG REBUILD TIMES! + // see https://material-ui.com/guides/minimizing-bundle-size/ + { + loader: 'babel-loader', + options: { + presets: [], + plugins: [ + [ + 'babel-plugin-import', + { + libraryName: '@material-ui/core', + libraryDirectory: 'esm', + camel2DashComponentName: false, + }, + 'core', + ], + [ + 'babel-plugin-import', + { + libraryName: '@material-ui/icons', + libraryDirectory: 'esm', + camel2DashComponentName: false, + }, + 'icons', + ], + ], + }, + }, + { + loader: 'ts-loader', + options: { + transpileOnly: true, + }, + }, + ], + }, +] diff --git a/zedd-clarity/.gitignore b/zedd-clarity/.gitignore new file mode 100644 index 0000000..9209ef5 --- /dev/null +++ b/zedd-clarity/.gitignore @@ -0,0 +1,2 @@ +node_modules +out diff --git a/zedd-clarity/package-lock.json b/zedd-clarity/package-lock.json new file mode 100644 index 0000000..59136a3 --- /dev/null +++ b/zedd-clarity/package-lock.json @@ -0,0 +1,633 @@ +{ + "name": "zedd-clarity", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@fast-csv/format": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.1.2.tgz", + "integrity": "sha512-ERW7QuIEYa/eJArjzEKWe8Sdj9aNBLDjMfZw+EpcIb9CFOMz7SNZl8ElWOjcUU8Gj088TerBSGvUoCZN0SoXig==", + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.1.2.tgz", + "integrity": "sha512-GmgHo1EHB5/M2v3tAj83l77PxGCxxYvx0s/PoWM/fp5PrS8ECtX0THKsuJ0jO3+BkpaHhX3/UZFOBnfcEw1FkQ==", + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "@types/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-mMUu4nWHLBlHtxXY17Fg6+ucS/MnndyOWyOe7MmwkoMYxvfQU2ajtRaEvqSUv+aVkMqH/C0NCI8UoVfRNQ10yg==" + }, + "@types/lodash": { + "version": "4.14.149", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz", + "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ==" + }, + "@types/node": { + "version": "12.12.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz", + "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==" + }, + "@types/selenium-webdriver": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.0.9.tgz", + "integrity": "sha512-HopIwBE7GUXsscmt/J0DhnFXLSmO04AfxT6b8HAprknwka7pqEWquWDMXxCjd+NUHK9MkCe1SDKKsMiNmCItbQ==" + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "date-fns": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.11.1.tgz", + "integrity": "sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w==" + }, + "deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.1.tgz", + "integrity": "sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g==", + "requires": { + "es-abstract": "^1.16.3", + "es-get-iterator": "^1.0.1", + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "isarray": "^2.0.5", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0", + "side-channel": "^1.0.1", + "which-boxed-primitive": "^1.0.1", + "which-collection": "^1.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-get-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz", + "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==", + "requires": { + "es-abstract": "^1.17.4", + "has-symbols": "^1.0.1", + "is-arguments": "^1.0.4", + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-string": "^1.0.5", + "isarray": "^2.0.5" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "fast-csv": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.1.3.tgz", + "integrity": "sha512-W2ifln3p+/Fv2tPRQq5Et8BdRb6/f4EhncmRMZHWlvZHr/s9uMe7ZVDtwD1kskwKDmTLsq63hPcJDtO4NYZr9w==", + "requires": { + "@fast-csv/format": "^4.1.2", + "@fast-csv/parse": "^4.1.2", + "@types/node": "^12.12.17" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "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" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==" + }, + "is-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz", + "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==" + }, + "is-boolean-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz", + "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==" + }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" + }, + "is-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", + "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==" + }, + "is-number-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz", + "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==" + }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-set": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", + "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==" + }, + "is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==" + }, + "is-weakset": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz", + "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==" + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "jszip": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz", + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" + }, + "object-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", + "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "selenium-webdriver": { + "version": "4.0.0-alpha.7", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.0.0-alpha.7.tgz", + "integrity": "sha512-D4qnTsyTr91jT8f7MfN+OwY0IlU5+5FmlO5xlgRUV6hDEV8JyYx2NerdTEqDDkNq7RZDYc4VoPALk8l578RBHw==", + "requires": { + "jszip": "^3.2.2", + "rimraf": "^2.7.1", + "tmp": "0.0.30" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "side-channel": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz", + "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==", + "requires": { + "es-abstract": "^1.17.0-next.1", + "object-inspect": "^1.7.0" + } + }, + "sleep-promise": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-8.0.1.tgz", + "integrity": "sha1-jXlaJ+ojlT32tSuRCB5eImZZk8U=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz", + "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz", + "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "ts-node": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.8.1.tgz", + "integrity": "sha512-10DE9ONho06QORKAaCBpPiFCdW+tZJuY/84tyypGtl6r+/C7Asq0dhqbRZURuUlLQtZxxDvT8eoj8cGW0ha6Bg==", + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "3.1.1" + } + }, + "typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "which-boxed-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz", + "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==", + "requires": { + "is-bigint": "^1.0.0", + "is-boolean-object": "^1.0.0", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-symbol": "^1.0.2" + } + }, + "which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "requires": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" + } + } +} diff --git a/zedd-clarity/package.json b/zedd-clarity/package.json new file mode 100644 index 0000000..3185820 --- /dev/null +++ b/zedd-clarity/package.json @@ -0,0 +1,41 @@ +{ + "name": "zedd-clarity", + "version": "1.0.0", + "description": "", + "main": "out/index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "tsc", + "watch": "tsc --watch" + }, + "types": "out/index.d.ts", + "keywords": [], + "author": { + "name": "Adrian Leonhard", + "email": "adrianleonhard@gmail.com" + }, + "license": "UNLICENSED", + "private": true, + "prettier": { + "semi": false, + "trailingComma": "all", + "printWidth": 100, + "singleQuote": true, + "proseWrap": "always" + }, + "dependencies": { + "@types/deep-equal": "^1.0.1", + "@types/lodash": "^4.14.149", + "@types/node": "^12.12.21", + "@types/selenium-webdriver": "^4.0.9", + "date-fns": "^2.11.1", + "deep-equal": "^2.0.1", + "fast-csv": "^4.1.3", + "lodash": "^4.17.15", + "selenium-webdriver": "^4.0.0-alpha.7", + "sleep-promise": "^8.0.1", + "ts-node": "^8.8.1", + "typescript": "^3.8.3" + }, + "devDependencies": {} +} diff --git a/zedd-clarity/src/index.ts b/zedd-clarity/src/index.ts new file mode 100644 index 0000000..e607746 --- /dev/null +++ b/zedd-clarity/src/index.ts @@ -0,0 +1,713 @@ +import { + By, + until, + Builder as WebDriverBuilder, + Capabilities, + WebDriver, + WebElement, + Key, + WebElementPromise, +} from 'selenium-webdriver' +import * as path from 'path' +import * as url from 'url' +import * as chrome from 'selenium-webdriver/chrome' +import partition from 'lodash/partition' +import uniqBy from 'lodash/uniqBy' +import sleep from 'sleep-promise' +import * as fs from 'fs' +import * as csv from 'fast-csv' +import { promises as fsp } from 'fs' +import deepEqual from 'deep-equal' +import 'selenium-webdriver/lib/atoms/get-attribute' +import 'selenium-webdriver/lib/atoms/is-displayed' +import { homedir } from 'os' +import { + min as dateMin, + format, + parse as parseDate, + isWithinInterval, + isSameDay, + parseISO, + compareAsc, + differenceInCalendarDays, +} from 'date-fns' +import { de } from 'date-fns/locale' +import uniq from 'lodash/uniq' + +export class NikuUrlInvalidError extends Error { + constructor(url: string) { + super(`url ${JSON.stringify(url)} is not valid`) + } +} + +const logSleep = async (ms: number) => { + console.warn('sleeping for ' + ((ms / 1000) | 0) + 's') + await sleep(ms) +} + +function checkNikuUrl(urlToCheck: any) { + if (!urlToCheck) { + throw new NikuUrlInvalidError(urlToCheck) + } + const urlParts = url.parse(urlToCheck) + if (!urlParts.protocol || !urlParts.host || !urlParts.path) { + throw new NikuUrlInvalidError(urlToCheck) + } +} + +async function makeContext(headless: boolean, downloadDir?: string) { + d('making context headless=' + headless) + const chromeOptions = new chrome.Options().addArguments('--no-sandbox') + if (downloadDir) { + await fsp.mkdir(downloadDir, { recursive: true }) + chromeOptions.setUserPreferences({ 'download.default_directory': downloadDir }) + } + d(`download.default_directory="${downloadDir}"`) + + if (headless) { + chromeOptions.headless() + } + const driver = new WebDriverBuilder() + .setChromeOptions(chromeOptions) + .withCapabilities(Capabilities.chrome()) + .build() + + await driver.manage().setTimeouts({ implicit: 5000 }) + + return wrapDriver(driver) +} +function wrapDriver(driver: WebDriver) { + function $$(css: string): Promise + function $$(root: WebElement, css: string): Promise + function $$(a: WebElement | string, css?: string) { + if ('string' === typeof a) { + return driver.findElements(By.css(a)) + } else { + return a.findElements(By.css(css!)) + } + } + function $(css: string): WebElementPromise + function $(root: WebElement | undefined, css: string): WebElementPromise + function $(a: WebElement | string | undefined, css?: string) { + if ('string' === typeof a) { + return driver.findElement(By.css(a)) + } else { + return (a || driver).findElement(By.css(css!)) + } + } + return [$, $$, driver] as [typeof $, typeof $$, WebDriver] +} +type Context = ReturnType + +export async function getProjectInfo( + nikuLink: string, + excludeProject?: (projectName: string) => boolean, + headless: boolean = false, + downloadDir: string = __dirname + '/downloads', +): Promise { + return withErrorHandling('getProjectInfo', nikuLink, headless, downloadDir, ctx => + getProjectInfoInternal(nikuLink, ctx, downloadDir, excludeProject), + ) +} +const pageLoad = async ([$, $$, driver]: Context) => { + // await driver.wait(until.elementIsVisible(await $("#ppm_header_wait"))) + await sleep(200) // give it time to show the loading icon + await driver.wait(until.elementLocated({ css: '#ppm_header_wait' })) + await driver.wait(until.elementIsNotVisible(await $('#ppm_header_wait'))) + await sleep(1000) +} + +function escapeRegExp(string: string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // $& means the whole matched string +} + +const urlHashQueryParam = (url: string, p: string) => + new URL(new URL(url).hash.replace(/^#/, 'http://example.com?')).searchParams.get(p) + +export interface Project { + name: string + intId: number + tasks: Task[] +} +export interface Task { + sortNo: number + name: string + strId?: string + projectName: string + intId: number + start: Date + end: Date + openForTimeEntry: boolean +} +async function forceGetSSO(ctx: Context, url: string) { + const [$, $$, driver] = ctx + do { + await driver.get(url) + await pageLoad(ctx) + } while (url != (await driver.getCurrentUrl())) +} +async function getProjects(ctx: Context, nikuLink: string): Promise { + const [$, $$, driver] = ctx + d('getting projects') + await forceGetSSO(ctx, nikuLink + '#action:mainnav.work&classCode=project') + await driver.wait(until.elementLocated({ css: '.ppm_workspace_title' })) + await pageLoad(ctx) + + d('locating project links') + const as = await $$('a[href^="#action:projmgr.projectDefaultTab"]') + d(`located ${as.length} project links`) + + return Promise.all( + as.map( + async a => + ({ + name: await a.getText(), + intId: +(await a.getAttribute('href')).replace( + new RegExp('^' + escapeRegExp(nikuLink) + '#action:projmgr\\.projectDefaultTab&id='), + '', + ), + } as Project), + ), + ) +} + +async function getProjectTasks( + nikuLink: string, + ctx: Context, + { name: pName, intId: projectIntId }: Project, + openForTimeEntry: 'yes' | 'no' | 'all', + downloadDir: string, +): Promise { + const [$, $$, driver] = ctx + const tasks: Task[] = [] + d('get tasks for project ' + pName + ' ' + projectIntId) + const headerWaitIcon = await $('#ppm_header_wait') + await driver.get(nikuLink + '#action:projmgr.keyTaskList&id=' + projectIntId) + await driver.wait(until.elementIsVisible(await $('#ppm_header_wait'))) + await pageLoad(ctx) + await $('[name=is_open_te]').sendKeys({ all: 'Alle', no: 'Nein', yes: 'Ja' }[openForTimeEntry]) + await $('[name=filter]').click() + await pageLoad(ctx) + // const ersteSeiteButton = await $$( + // "#grid-content-projmgr\\.odfKeyTaskList .ppm_pagination *[title='Erste Seite']", + // ).then(bs => bs[0]) + // if (ersteSeiteButton) { + // d('clicking ersteSeiteButton') + // await ersteSeiteButton.click() + // await pageLoad(ctx) + // } + d(' emptying download dir') + for (const file of await fsp.readdir(downloadDir)) { + await fsp.unlink(path.join(downloadDir, file)) + } + d(' clicking on CSV export') + await $('.ppm_portlet_header_btn[title=Optionen]').click() + await $('[alt="In CSV exportieren"]').click() + d(' waiting for new file in downloadDir') + let files + do { + await sleep(1000) + files = await fsp.readdir(downloadDir) + } while (files.length == 0) + const csvPath = path.join(downloadDir, files[0]) + const ilog = (x: any) => (console.log(x), x) + const magic = fs + .createReadStream(csvPath) + .pipe( + csv.parse({ + headers: (headersFromCsv: csv.ParserHeaderArray) => { + if (headersFromCsv.filter(h => h === 'Aufgabe').length === 2) { + const indexFirstAufgabe = headersFromCsv.indexOf('Aufgabe') + headersFromCsv[indexFirstAufgabe] = 'AufgabeJaNein' + } + return headersFromCsv + }, + }), + ) + .on('data', (row: { [header: string]: string }) => { + if (row['AufgabeJaNein'] === 'Nein') return + if (row['Für Zeiteintrag geöffnet'] === 'Nein') return + const [_, intIdStr, name] = /id=(\d+).*"(.*)"\)/.exec(row['Aufgabe'])! + tasks.push({ + sortNo: +row['PSP-Sortierung'], + name: name, + strId: row['ID'], + intId: +intIdStr, + projectName: pName, + start: parseDate(row['Anfang'], 'dd.MM.yy', new Date()), + end: parseDate(row['Ende'], 'dd.MM.yy', new Date()), + openForTimeEntry: row['Für Zeiteintrag geöffnet'] == 'Ja', + }) + }) + .on('error', console.error) + await new Promise(resolve => magic.on('end', resolve)) + await fsp.unlink(csvPath) + d(` found ${tasks.length} tasks`) + return tasks +} +function getPagination(ctx: Context, where?: WebElement) { + const [$, $$, driver] = ctx + return $(where, '.ppm_pagination_display_of') + .then(d => d && d.getText()) + .then(t => { + const [_, fromStr, toStr, ofStr] = t.match(/(\d+)\s*-\s+(\d+)\s*von\s*(\d+) angezeigt/)! + return { + from: +fromStr, + to: +toStr, + of: +ofStr, + } + }) +} + +function hasClass(e: WebElement, c: string) { + return e.getAttribute('class').then(classString => classString.split('\\s+').includes(c)) +} + +async function getProjectInfoInternal( + nikuLink: string, + ctx: Context, + downloadDir: string, + excludeProject: (projectName: string) => boolean = () => false, +) { + const [$, $$, driver] = ctx + + const projects = (await getProjects(ctx, nikuLink)).filter(p => !excludeProject(p.name)) + + const tasks: Task[] = [] + for (const project of projects) { + project.tasks = await getProjectTasks(nikuLink, ctx, project, 'yes', downloadDir) + } + + return projects +} + +async function addTasks( + ctx: Context, + tasks: Pick[], +) { + const [$, $$, driver] = ctx + + const as = await $$('#portlet-table-timeadmin\\.editTimesheet tbody td[column="9"] a') + const addedIds = await Promise.all( + as.map(a => a.getAttribute('href').then(href => +urlHashQueryParam(href, 'id')!)), + ) + d('already have tasks with ids ' + addedIds) + tasks = tasks.filter(t => !addedIds.includes(t.intId)) + d(`adding ${tasks.length} tasks...`) + if (tasks.length == 0) { + return + } + + await $(`button[onclick*="'timeadmin.timesheetAddTask'"]`).click() + await pageLoad(ctx) + await $('select[name=ff_assigned]').sendKeys('Alle') + await $('select[name=ff_task_status]').sendKeys('Alle') + for (let i = 0; i < tasks.length; i++) { + const taskIdInput = await $('input[name=ff_task_id]') + const taskNameInput = await $('input[name=ff_task_name]') + const projectNameInput = await $('input[name=ff_project_name]') + // const projectIdInput = await $('input[name=ff_project_id]') + const applyFilterButton = await $('button[name=applyFilter]') + const task = tasks[i] + await projectNameInput.sendKeys(Key.chord(Key.CONTROL, 'a'), task.projectName) + if (task.strId) { + await taskIdInput.sendKeys(Key.chord(Key.CONTROL, 'a'), task.strId) + await taskNameInput.sendKeys(Key.chord(Key.CONTROL, 'a'), Key.BACK_SPACE) + } else { + await taskIdInput.sendKeys(Key.chord(Key.CONTROL, 'a'), Key.BACK_SPACE) + await taskNameInput.sendKeys(Key.chord(Key.CONTROL, 'a'), task.name) + } + await applyFilterButton.click() + await pageLoad(ctx) + const taskRows = await $$( + '#ppm-portlet-grid-content-timeadmin\\.selectTimesheetTask tbody table tbody tr', + ) + d(`found ${taskRows.length} taskRows`) + for (const tr of taskRows) { + const taskRowTaskId = +(await $(tr, 'input[name=selitem_id]').getAttribute('value')) + d('taskRowTaskId', taskRowTaskId) + if (taskRowTaskId === task.intId) { + await $(tr, 'input[name=selitem]').click() + break + } + } + + // select thingy + if (i == tasks.length - 1) { + await $(`.ppm_button_bar button[onclick*="'timeadmin.addTimesheetTask'"]`).click() + } else { + await $(`.ppm_button_bar button[onclick*="'timeadmin.addTimesheetTaskMore'"]`).click() + } + await pageLoad(ctx) + } + // await sleep(30000) +} + +interface WorkEntry { + projectName: string + taskName: string + taskIntId: number + hours: number + comment?: string +} +export type ClarityExportFormat = { + [day: string]: WorkEntry[] +} + +async function exportToClarity( + ctx: Context, + whatt: ClarityExportFormat, + submitTimesheets: boolean, + nikuLink: string, +): Promise { + const [$, $$, driver] = ctx + type ThenArg = T extends Promise ? U : T + + let what = Object.keys(whatt).map((dateString: string) => ({ + day: parseISO(dateString), + work: whatt[dateString], + })) + + async function getRowInfos(editMode: boolean) { + const trs = await $$( + '#portlet-table-timeadmin\\.editTimesheet div.ppm_gridcontent ' + + '> table > tbody > tr:not(:first-child):not(:last-child)', + ) + d(`found ${trs.length} trs`) + return Promise.all( + trs.map(async tr => { + const projectNameTd = await $(tr, `td[column="${editMode ? 8 : 7}"]`) + const rowNum = await projectNameTd.getAttribute('rownum') + const projectName = await $(projectNameTd, 'a').getText() + const taskNameA = await $(tr, `td[column="${editMode ? 9 : 8}"] a`) + const taskName = await taskNameA.getText() + const taskIntId = await taskNameA + .getAttribute('href') + .then(href => +urlHashQueryParam(href, 'id')!) + const hasComments = await hasClass( + await $(tr, `td[column="${editMode ? 7 : 6}"] img`), + 'caui-ndeNotes', + ) + return { rowNum, projectName, taskName, taskIntId, tr, hasComments } + }), + ) + } + + type RowInfo = ThenArg>[number] + + async function openCommentsDialogAndGetComments(rowInfo: RowInfo) { + d(" comments aren't empty/empty, opening dialog") + await $(rowInfo.tr, 'td > a#notes').click() + await pageLoad(ctx) + + const comments = await Promise.all( + ( + await $$('#ppm-portlet-grid-content-timeadmin\\.notesBrowser .ppm_gridcontent tbody tr') + ).map(async tr => { + const checkbox = await $(tr, 'input[type=checkbox]') + const content = await $(tr, 'td[column="6"]').getText() + return { checkbox, content } + }), + ) + + return comments + } + + async function correctComments( + relevant: typeof what, + rowInfo: ThenArg>[number], + ) { + d('fixing comments for ' + rowInfo.taskName) + const targetComments: { [dayString: string]: string } = {} + for (const what of relevant) { + const dayStr = format(what.day, 'EEEEEE', { locale: de }).toUpperCase() + const comment = (what.work.find(s => s.taskIntId == rowInfo.taskIntId) || {}).comment || '' + targetComments[dayStr] = comment + } + + d(targetComments, rowInfo) + + if (!Object.values(targetComments).some(x => x) && !rowInfo.hasComments) { + // don't need to do anything + return + } + d(" comments aren't empty/empty, opening dialog") + await $(rowInfo.tr, 'td[column="7"] a').click() + await pageLoad(ctx) + + const comments = await Promise.all( + ( + await $$('#ppm-portlet-grid-content-timeadmin\\.notesBrowser .ppm_gridcontent tbody tr') + ).map(async tr => { + const checkbox = await $(tr, 'input[type=checkbox]') + const content = await $(tr, 'td[column="6"]').getText() + return { checkbox, content } + }), + ) + + // delete wrong comments + const [delComments, keepComments] = partition(comments, c => { + const x = Object.keys(targetComments).find(dayString => + new RegExp('^\\[' + dayString + '\\]', 'i').test(c.content), + ) + return x && (!targetComments[x] || x + ': ' + targetComments[x] != c.content) + }) + if (delComments.length != 0) { + await Promise.all( + delComments.map(c => { + d(' selecting for deletion ' + c.content) + return c.checkbox.click() + }), + ) + + d(' clicking delete') + await $( + `#ppm-portlet-grid-content-timeadmin\\.notesBrowser button[onclick*="'timeadmin.deleteItemsConfirmPopup'"]`, + ).click() + await pageLoad(ctx) + + d(' confirming') + await $( + `#ppm-portlet-grid-content-timeadmin\\.deleteItemsConfirmPopup button[onclick*="'timeadmin.deleteNotes'"]`, + ).click() + await pageLoad(ctx) + } + + // add missing comments + for (const dayString of Object.keys(targetComments)) { + if (targetComments[dayString]) { + const comment = '[' + dayString + '] ' + targetComments[dayString] + if (!keepComments.some(c => c.content == comment)) { + const noteInput = await $('#portlet-timeadmin\\.notesBrowser textarea[name=note]') + await noteInput.sendKeys(comment) + const catInput = await $('#portlet-timeadmin\\.notesBrowser input[name=category]') + await catInput.sendKeys('BOT') + d(' adding comment ' + comment) + await $( + `#portlet-timeadmin\\.notesBrowser button[onclick*="'timeadmin.addNote'"]`, + ).click() + + await pageLoad(ctx) + } + } + } + + await $('#portlet-timeadmin\\.notesBrowser button[onclick="closeWindow();"]').click() + } + + async function exportTimesheet(timesheetStartDate: Date, rowInfos: RowInfo[], days: Date[]) { + d('exporting timesheet starting at ' + formatDayYYYY(timesheetStartDate)) + d('for days ' + days) + const daysInfo: { day: Date; work: WorkEntry[] }[] = days.map(d => ({ day: d, work: [] })) + for (const rowInfo of rowInfos) { + let comments: string[] = [] + if (rowInfo.hasComments) { + comments = await openCommentsDialogAndGetComments(rowInfo).then(cs => + cs.map(c => c.content), + ) + await $('#portlet-timeadmin\\.notesBrowser button[onclick="closeWindow();"]').click() + } + + for (const day of days) { + const dayStr = format(day, 'EEEEEE', { locale: de }) + const dayComment = comments.find(c => c.startsWith(dayStr + ': ')) + const columnIndex = 13 + differenceInCalendarDays(day, timesheetStartDate) + const hoursStr = await $(rowInfo.tr, `td[column="${columnIndex}"]`).getText() + const hours = +hoursStr.replace(',', '.') + if (hours != 0) + daysInfo + .find(di => di.day == day)! + .work.push({ + taskIntId: rowInfo.taskIntId, + taskName: rowInfo.taskName, + projectName: rowInfo.projectName, + hours, + comment: dayComment && dayComment.substring(4), + }) + } + } + return daysInfo + } + + function formatDayYYYY(d: Date) { + return format(d, 'dd.MM.yyyy') + } + + interface What { + day: Date + work: WorkEntry[] + } + + function normalizeWhatArray(ws: What[]) { + ws.sort((a, b) => compareAsc(a.day, b.day)) + for (const w of ws) { + w.work.sort((a, b) => a.taskIntId - b.taskIntId) + for (const y of w.work) { + y.comment = y.comment || undefined + } + } + } + + function timeSheetDataEqual(a: What[], b: What[]) { + normalizeWhatArray(a) + normalizeWhatArray(b) + return deepEqual(a, b) + } + + // DEFINITIONS END + + d('submitTimesheets = ' + submitTimesheets) + + while (what.length) { + d(`${what.length} days left to submit`) + await forceGetSSO(ctx, nikuLink + '#action:timeadmin.timesheetBrowserReturn') + + const minDate = dateMin(what.map(w => w.day)) + d(`minDate is ${formatDayYYYY(minDate)}`) + await $('input[name=ff_date_type][value=userdefined]').click() + await $('input[name=ff_from_date]').sendKeys( + Key.chord(Key.CONTROL, 'a'), + formatDayYYYY(minDate), + ) + await $('select[name=ff_status]').sendKeys(Key.chord(Key.CONTROL, 'a')) + await $('button[name=applyFilter]').click() + await pageLoad(ctx) + + // click on the first timesheet + await $('#manageTimesheet').click() + await pageLoad(ctx) + const txt = await $('select[name=timeperiod] > option[selected=true]').getText() + const [start, end] = txt + .split(' - ') + .map(ds => parseDate(ds, 'dd.MM.yy', Date.now(), { locale: de })) + d('start ' + start) + d('end ' + end) + d('in timesheet ' + format(start, 'EEEEEE dd.MM') + ' - ' + format(end, 'EEEEEE dd.MM')) + + const [relevant, others] = partition(what, w => isWithinInterval(w.day, { start, end })) + + const saveTimesheetExitButton = ( + await $$(`button[onclick*="'timeadmin.saveTimesheetExit','status=2'"]`) + )[0] + const createAdjustmentTimesheetButton = ( + await $$(`button[onclick*="'timeadmin.createAdjustmentTimesheet'"]`) + )[0] + if (saveTimesheetExitButton || createAdjustmentTimesheetButton) { + d('reading timesheet data...') + const data = await exportTimesheet( + start, + await getRowInfos(false), + relevant.map(w => w.day), + ) + d(' done') + if (timeSheetDataEqual(data, relevant)) { + d('timesheet data is already correct') + what = others + continue + } else { + if (saveTimesheetExitButton) { + d('sende Zeitformular zurück') + await saveTimesheetExitButton.click() + await pageLoad(ctx) + continue + } + if (createAdjustmentTimesheetButton) { + d('passe Zeitformular an') + await createAdjustmentTimesheetButton.click() + await pageLoad(ctx) + } + } + } + + await addTasks( + ctx, + uniqBy( + relevant.flatMap(w => w.work), + t => t.taskIntId, + ).map(({ taskName, taskIntId, projectName }) => ({ + name: taskName, + intId: taskIntId, + projectName, + })), + ) + const rowInfos = await getRowInfos(true) + for (const ri of rowInfos) { + await correctComments(relevant, ri) + } + // d('' + eachDayOfInterval({ start, end })) + d('' + relevant.map(w => w.day)) + for (const day of uniq(relevant.map(w => w.day)).sort(compareAsc)) { + d(' filling out ' + format(day, 'EEEEEE dd.MM')) + const daySlices = (relevant.find(w => isSameDay(w.day, day)) || { work: [] }).work + await Promise.all( + rowInfos.map(async rowInfo => { + const hours = daySlices + .filter(s => s.taskIntId === rowInfo.taskIntId) + .map(s => s.hours) + .reduce((a, b) => a + b, 0) + .toLocaleString('de-DE', { maximumFractionDigits: 2 }) + .replace('.', ',') + d(` setting ${hours} hours for task ${rowInfo.taskIntId} ${rowInfo.taskName}`) + await $( + rowInfo.tr, + `input[alt^="${format(day, 'EEEEEE, dd.MM', { locale: de })}"]`, + ).sendKeys(Key.chord(Key.CONTROL, 'a'), hours) + }), + ) + } + + if (submitTimesheets) { + d(' submitting timesheet') + await $(`button[onclick*="'timeadmin.saveTimesheetExit','status=1'"]`).click() + } else { + d(' saving timesheet') + await $(`button[onclick="submitForm('page','timeadmin.saveTimesheet');"]`).click() + } + await pageLoad(ctx) + what = others + } + await logSleep(5000) +} + +function d(...x: any) { + console.log('zedd-clarity', ...x) +} + +export async function fillClarity( + nikuLink: string, + data: ClarityExportFormat, + submitTimesheets: boolean, + headless: boolean = false, + downloadDir?: string, +): Promise { + return withErrorHandling('fillClarity', nikuLink, headless, downloadDir, ctx => + exportToClarity(ctx, data, submitTimesheets, nikuLink), + ) +} +export async function withErrorHandling( + name: string, + nikuLink: string, + headless: boolean, + downloadDir: string | undefined, + cb: (ctx: Context) => Promise, +): Promise { + checkNikuUrl(nikuLink) + const ctx = await makeContext(headless, downloadDir) + try { + return await cb(ctx) + } catch (err) { + console.error(err) + const ssDir = path.join(homedir(), 'zedd') + await fsp.mkdir(ssDir, { recursive: true }) + const ssFile = path.join(ssDir, name + '_' + format(new Date(), 'yyyy-MM-dd_HHmm') + '.png') + console.warn('Saving screenshot to', ssFile) + await fsp.writeFile(ssFile, await ctx[2].takeScreenshot(), 'base64') + const htmlFile = path.join(ssDir, name + '_' + format(new Date(), 'yyyy-MM-dd_HHmm') + '.html') + console.warn('Saving HTML to', htmlFile) + await fsp.writeFile(htmlFile, await ctx[2].getPageSource(), 'utf8') + await logSleep(30_000) + throw err + } finally { + await ctx[2].quit() + } +} diff --git a/zedd-clarity/tsconfig.json b/zedd-clarity/tsconfig.json new file mode 100644 index 0000000..ba8371f --- /dev/null +++ b/zedd-clarity/tsconfig.json @@ -0,0 +1,58 @@ +{ + "compilerOptions": { + /* Basic Options */ + // "incremental": true, /* Enable incremental compilation */ + "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */, + "module": "es2015" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + // "lib": [], /* 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'. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, + "declarationMap": true /* Generates a sourcemap for each corresponding '.d.ts' file. */, + "sourceMap": true /* Generates corresponding '.map' file. */, + // "outFile": "./", /* Concatenate and emit output to single file. */ + "outDir": "./out" /* Redirect output structure to the directory. */, + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + /* Strict Type-Checking Options */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + /* Module Resolution Options */ + "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + } +} \ No newline at end of file diff --git a/zedd-win32/.gitignore b/zedd-win32/.gitignore new file mode 100644 index 0000000..12820bb --- /dev/null +++ b/zedd-win32/.gitignore @@ -0,0 +1,17 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results +lib/binding +*.tgz +npm-debug.log +node_modules +build \ No newline at end of file diff --git a/zedd-win32/.npmignore b/zedd-win32/.npmignore new file mode 100644 index 0000000..cf68f30 --- /dev/null +++ b/zedd-win32/.npmignore @@ -0,0 +1,9 @@ +node_modules +lib/binding +build +test +*.tgz +npm-debug.log +.npmignore +.gitignore +.travis.yml \ No newline at end of file diff --git a/zedd-win32/LICENSE b/zedd-win32/LICENSE new file mode 100644 index 0000000..1149654 --- /dev/null +++ b/zedd-win32/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2014, Dane Springmeyer +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/zedd-win32/README.md b/zedd-win32/README.md new file mode 100644 index 0000000..e38ae14 --- /dev/null +++ b/zedd-win32/README.md @@ -0,0 +1,40 @@ +node-addon +================== + +[![Build Status](https://travis-ci.org/springmeyer/node-addon.svg?branch=master)](https://travis-ci.org/springmeyer/node-addon) + +Sample application of a Node C++ addon packaged with [node-pre-gyp](https://github.com/mapbox/node-pre-gyp). + +If you are interested in learning how to write C++ addons see the [official guide](http://nodejs.org/api/addons.html#addons_hello_world). + +This repo is intended as starter code for your own C++ module - feel free to copy and modify. The docs below are meant to be a template for how you might document your module once packaged with `node-pre-gyp`. + +## Depends + +- Node.js 0.10.x, 0.12.x, 4, or 5 + +## Install + +Install from binary: + + npm install + +Install from source: + + npm install --build-from-source + +## Developing + +The [node-pre-gyp](https://github.com/mapbox/node-pre-gyp#usage) tool is used to handle building from source and packaging. + +Simply run: + + ./node_modules/.bin/node-pre-gyp build + +### Packaging + + ./node_modules/.bin/node-pre-gyp build package + +### Publishing + + ./node_modules/.bin/node-pre-gyp publish diff --git a/zedd-win32/bin/win32-x64-75/zedd-win32.node b/zedd-win32/bin/win32-x64-75/zedd-win32.node new file mode 100644 index 0000000000000000000000000000000000000000..cd6432a1af51157011037eac697179182d6b02bb GIT binary patch literal 136704 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 +#include + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include + + + +Napi::Number GetMillisSinceLastUserInput(const Napi::CallbackInfo& info) { + Napi::Env env = info.Env(); + + + LASTINPUTINFO lii; + lii.cbSize = sizeof(LASTINPUTINFO); + BOOL result = GetLastInputInfo(&lii); + + DWORDLONG lastUserInputTick = lii.dwTime; + DWORDLONG tickCount = GetTickCount(); + if (tickCount < lastUserInputTick) { + // this means that tickCount overflowed, but lastUserInputTick didn't. + tickCount += MAXDWORD; + } + + std::string x = std::to_string(lii.dwTime); + + return Napi::Number::New(env, tickCount - lastUserInputTick); +} + +struct SpeichereFensterParams { + const Napi::Env env; + std::vector& objects; + HWND foregroundWindow; + + SpeichereFensterParams( + const Napi::Env env, + std::vector& objects, + const HWND foregroundWindow) + : env(env) + , objects(objects) + , foregroundWindow(foregroundWindow) {} +}; + +std::string ProcessIdToName(DWORD processId) { + std::string ret; + HANDLE handle = OpenProcess( + PROCESS_QUERY_LIMITED_INFORMATION, + FALSE, + processId /* This is the PID, you can find one from windows task manager */ + ); + if (handle) + { + DWORD buffSize = 1024; + CHAR buffer[1024]; + if (QueryFullProcessImageNameA(handle, 0, buffer, &buffSize)) + { + ret = buffer; + } + else + { + printf("Error GetModuleBaseNameA : %lu", GetLastError()); + } + CloseHandle(handle); + } + else + { + printf("Error OpenProcess : %lu", GetLastError()); + } + return ret; +} + +Napi::String GetWindowProcessImageName(const Napi::Env &env, HWND hWnd) { + DWORD processId; + DWORD threadId = GetWindowThreadProcessId(hWnd, &processId); + + std::string processName = ProcessIdToName(processId); + return Napi::String::New(env, processName); +} + +Napi::String GetWindowPlacementAsNapiString(const Napi::Env &env, HWND hWnd) { + WINDOWPLACEMENT windowPlacement; + windowPlacement.length = sizeof(WINDOWPLACEMENT); + + GetWindowPlacement(hWnd, &windowPlacement); + + if (windowPlacement.showCmd == SW_SHOWMAXIMIZED) { + return Napi::String::New(env, "maximized"); + } + if (windowPlacement.showCmd == SW_SHOWNORMAL) { + return Napi::String::New(env, "normal"); + } + if (windowPlacement.showCmd == SW_SHOWMINIMIZED) { + return Napi::String::New(env, "minimized"); + } + return Napi::String::New(env, "ERROR!"); +} + +BOOL CALLBACK GetWindowInfosEnumCallback(HWND hWnd, LPARAM lParam) { + SpeichereFensterParams& params = + *reinterpret_cast(lParam); + + const DWORD TITLE_SIZE = 1024; + WCHAR windowTitle[TITLE_SIZE]; + + GetWindowTextW(hWnd, windowTitle, TITLE_SIZE); + int length = ::GetWindowTextLength(hWnd); + if (!IsWindowVisible(hWnd) || length == 0) { + return TRUE; + } + + Napi::Object obj = Napi::Object::New(params.env); + obj["name"] = Napi::String::New(params.env, (char16_t *)windowTitle); + obj["foreground"] = Napi::Boolean::New(params.env, params.foregroundWindow == hWnd); + obj["placement"] = GetWindowPlacementAsNapiString(params.env, hWnd); + obj["processName"] = GetWindowProcessImageName(params.env, hWnd); + + // Retrieve the pointer passed into this callback, and re-'type' it. + // The only way for a C API to pass arbitrary data is by means of a void*. + params.objects.push_back(obj); + + return TRUE; +} + +Napi::Array vectorToNapiArray(Napi::Env env, std::vector& vec) { + Napi::Array array = Napi::Array::New(env, vec.size()); + + for (int i = 0; i < vec.size(); i++) { + array.Set((uint32_t)i, vec[i]); + } + + return array; +} + +Napi::Array GetWindowInfos(const Napi::CallbackInfo& info) { + std::vector objects; + + SpeichereFensterParams params = SpeichereFensterParams(info.Env(), objects, GetForegroundWindow()); + + EnumWindows(GetWindowInfosEnumCallback, reinterpret_cast(¶ms)); + + return vectorToNapiArray(info.Env(), objects); +} + +Napi::Object Init(Napi::Env env, Napi::Object exports) { + exports.Set("getMillisSinceLastUserInput", + Napi::Function::New(env, GetMillisSinceLastUserInput)); + exports.Set("getWindowInfos", Napi::Function::New(env, GetWindowInfos)); + return exports; +} + +NODE_API_MODULE(hello, Init) \ No newline at end of file