diff --git a/.eslintrc.js b/.eslintrc.js index 06f3866fd..6319501e3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -126,7 +126,7 @@ const appConfig = { ignoreParameters: true, }, ], - '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-non-null-assertion': 'warn', '@typescript-eslint/no-redeclare': 'error', '@typescript-eslint/no-this-alias': 'error', '@typescript-eslint/no-unused-vars': 'error', @@ -139,7 +139,6 @@ const appConfig = { 'always', ], '@typescript-eslint/type-annotation-spacing': 'error', - '@typescript-eslint/unified-signatures': 'error', 'header/header': [ 2, 'line', @@ -235,6 +234,11 @@ const appConfig = { prev: '*', next: 'return', }, + { + blankLine: 'always', + prev: '*', + next: 'function', + }, ], 'prefer-arrow/prefer-arrow-functions': [ 'error', @@ -271,6 +275,7 @@ testsConfig['rules']['padded-blocks'] = [ switches: 'never', }, ]; +testsConfig['rules']['jest/expect-expect'] = 'off'; testsConfig['plugins'].push('jest'); testsConfig['extends'].push('plugin:jest/recommended'); @@ -291,6 +296,7 @@ module.exports = { '@angular-eslint/template/no-positive-tabindex': 'error', '@angular-eslint/template/accessibility-table-scope': 'error', '@angular-eslint/template/accessibility-valid-aria': 'error', + '@angular-eslint/template/no-duplicate-attributes': 'error', }, }, { diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dac53350e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +* text=auto +*.ts eol=lf diff --git a/.github/workflows/migration.yml b/.github/workflows/migration.yml index 32899b4a6..585b297c0 100644 --- a/.github/workflows/migration.yml +++ b/.github/workflows/migration.yml @@ -12,7 +12,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v1 with: - node-version: '12.x' + node-version: '14.x' - run: npm ci - run: result=$(find src -type f -iname '*.html' -exec sh -c 'cat {} | tr "\n" " " | grep -Eo "class=\"[^\"]+\"[^>]+class=\"" ' \; | wc -l); test $result -eq 0 - run: npm install -D @ionic/v4-migration-tslint diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml new file mode 100644 index 000000000..2652fda51 --- /dev/null +++ b/.github/workflows/performance.yml @@ -0,0 +1,63 @@ +name: Performance + +on: [push, pull_request] + +jobs: + performance: + runs-on: ubuntu-latest + env: + MOODLE_DOCKER_DB: pgsql + MOODLE_DOCKER_BROWSER: chrome + MOODLE_DOCKER_PHP_VERSION: 7.3 + steps: + - uses: actions/checkout@v2 + - id: nvmrc + uses: browniebroke/read-nvmrc-action@v1 + - uses: actions/setup-node@v1 + with: + node-version: '${{ steps.nvmrc.outputs.node_version }}' + - name: Additional checkouts + run: | + git clone --branch master --depth 1 https://github.com/moodle/moodle $GITHUB_WORKSPACE/moodle + git clone --branch integration --depth 1 https://github.com/moodlehq/moodle-local_moodlemobileapp $GITHUB_WORKSPACE/moodle/local/moodlemobileapp + git clone --branch master --depth 1 https://github.com/moodlehq/moodle-docker $GITHUB_WORKSPACE/moodle-docker + - name: Install npm packages + run: | + npm install -g npm@7 + npm ci --no-audit + - name: Generate Behat tests plugin + run: | + export MOODLE_DOCKER_WWWROOT=$GITHUB_WORKSPACE/moodle + npx gulp behat + - name: Configure & launch Moodle with Docker + run: | + export MOODLE_DOCKER_WWWROOT=$GITHUB_WORKSPACE/moodle + cp $GITHUB_WORKSPACE/moodle-docker/config.docker-template.php $GITHUB_WORKSPACE/moodle/config.php + sed -i "59i\ 'capabilities' => [" $GITHUB_WORKSPACE/moodle/config.php + sed -i "60i\ 'extra_capabilities' => [" $GITHUB_WORKSPACE/moodle/config.php + sed -i "61i\ 'goog:loggingPrefs' => ['performance' => 'ALL']," $GITHUB_WORKSPACE/moodle/config.php + sed -i "62i\ 'chromeOptions' => ['perfLoggingPrefs' => ['traceCategories' => 'devtools.timeline']]," $GITHUB_WORKSPACE/moodle/config.php + sed -i "63i\ ]," $GITHUB_WORKSPACE/moodle/config.php + sed -i "64i\ ]," $GITHUB_WORKSPACE/moodle/config.php + sed -i "76i\$CFG->behat_ionic_wwwroot = 'http://moodleapp';" $GITHUB_WORKSPACE/moodle/config.php + $GITHUB_WORKSPACE/moodle-docker/bin/moodle-docker-compose pull + $GITHUB_WORKSPACE/moodle-docker/bin/moodle-docker-compose up -d + $GITHUB_WORKSPACE/moodle-docker/bin/moodle-docker-wait-for-db + - name: Compile & launch production app with Docker + run: | + docker build -t moodlehq/moodleapp:performance . + docker run -d --rm --name moodleapp moodlehq/moodleapp:performance + docker network connect moodle-docker_default moodleapp --alias moodleapp + - name: Init Behat + run: | + export MOODLE_DOCKER_WWWROOT=$GITHUB_WORKSPACE/moodle + $GITHUB_WORKSPACE/moodle-docker/bin/moodle-docker-compose exec -T webserver sh -c "php admin/tool/behat/cli/init.php" + - name: Run performance tests + run: | + export MOODLE_DOCKER_WWWROOT=$GITHUB_WORKSPACE/moodle + for i in {0..2} + do + $GITHUB_WORKSPACE/moodle-docker/bin/moodle-docker-compose exec -T webserver sh -c "php admin/tool/behat/cli/run.php --tags="@performance" --auto-rerun" + done + - name: Show performance results + run: node ./scripts/print-performance-measures.js $GITHUB_WORKSPACE/moodle/behatperformancemeasures/ diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 1534b363c..6e5aed17e 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -12,9 +12,11 @@ jobs: - name: Use Node.js uses: actions/setup-node@v1 with: - node-version: '12.x' + node-version: '14' - name: Install npm packages - run: npm ci + run: | + npm install -g npm@7 + npm ci --no-audit - name: Check langindex run: | result=$(cat scripts/langindex.json | grep \"TBD\" | wc -l); test $result -eq 0 @@ -49,11 +51,11 @@ jobs: echo "Found $found missing langkeys" exit 1 fi - - name: Run Linter - run: npm run lint + - name: Run Linter (ignore warnings) + run: npm run lint -- --quiet - name: Run tests run: npm run test:ci - name: Production builds run: npm run build:prod - name: JavaScript code compatibility - run: result=$(npx check-es-compat www/*.js 2> /dev/null | grep -v -E "Array\.prototype\.includes|Promise\.prototype\.finally|String\.prototype\.(matchAll|trimRight)|globalThis" | grep -Po "(?<=error).*?(?=\s+ecmascript)" | wc -l); test $result -eq 0 + run: result=$(npx check-es-compat www/*.js 2> /dev/null | grep -v -E "Array\.prototype\.includes|Promise\.prototype\.finally|String\.prototype\.(matchAll|trimRight)|globalThis" | grep -Po "(?<=error).*?(?=\s+ecmascript)" | wc -l); test $result -eq 1 diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..55d178216 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v14.15.0 diff --git a/.travis.yml b/.travis.yml index dd479ea5a..e66761bab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ os: linux dist: trusty -node_js: 12 +node_js: 14 git: depth: 3 @@ -18,12 +18,12 @@ cache: - $HOME/.android/build-cache before_install: - - nvm install 12 + - nvm install + - npm install npm@^7 -g - node --version - npm --version - nvm --version - npm ci - - npm install npm@^6 -g before_script: - npx gulp @@ -46,16 +46,30 @@ jobs: - extra-google-google_play_services - extra-google-m2repository - extra-android-m2repository + before_install: + - nvm install + - npm install npm@^7 -g + - node --version + - npm --version + - nvm --version + - npm ci + - yes | sdkmanager "build-tools;30.0.3" addons: apt: packages: - libsecret-1-dev + - php5-cli + - php5-common - stage: build name: "Build iOS" language: node_js if: env(BUILD_IOS) = 1 AND (env(DEPLOY) = 1 OR (env(DEPLOY) = 2 AND tag IS NOT blank)) os: osx - osx_image: xcode12.5 + osx_image: xcode13.1 + addons: + homebrew: + packages: + - jq - stage: test name: "End to end tests (mod_forum and mod_messages)" services: diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..12ffc2065 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index e2f79e54b..8c748420b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,24 @@ { + /** + * Formatting. + */ + "editor.defaultFormatter": "dbaeumer.vscode-eslint", + "[html]": { + "editor.defaultFormatter": "vscode.html-language-features", + }, + "editor.formatOnSave": true, + "eslint.format.enable": true, + "html.format.endWithNewline": true, + "html.format.wrapLineLength": 140, + "files.eol": "\n", + "files.trimFinalNewlines": true, + "files.insertFinalNewline": true, + "files.trimTrailingWhitespace": true, + + /** + * Config files. + */ "files.associations": { "moodle.config.json": "jsonc", "moodle.config.*.json": "jsonc", diff --git a/Dockerfile b/Dockerfile index 82f4e6ec9..f0b8c56b0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,8 @@ WORKDIR /app # Prepare node dependencies RUN apt-get update && apt-get install libsecret-1-0 -y COPY package*.json ./ -RUN npm ci +RUN npm install -g npm@7 +RUN npm ci --no-audit # Build source ARG build_command="npm run build:prod" diff --git a/README.md b/README.md index 886c6cbae..ae0e4be9f 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,15 @@ -Moodle Mobile +Moodle App ================= -This is the primary repository of source code for the official Moodle Mobile app. +This is the primary repository of source code for the official mobile app for Moodle. -* [User documentation](http://docs.moodle.org/en/Moodle_Mobile) -* [Developer documentation](http://docs.moodle.org/dev/Moodle_Mobile) -* [Development environment setup](http://docs.moodle.org/dev/Setting_up_your_development_environment_for_Moodle_Mobile_2) +* [User documentation](https://docs.moodle.org/en/Moodle_app) +* [Developer documentation](http://docs.moodle.org/dev/Moodle_App) +* [Development environment setup](https://docs.moodle.org/dev/Setting_up_your_development_environment_for_the_Moodle_App) * [Bug Tracker](https://tracker.moodle.org/browse/MOBILE) -* [Release Notes](http://docs.moodle.org/dev/Moodle_Mobile_Release_Notes) +* [Release Notes](https://docs.moodle.org/dev/Moodle_App_Release_Notes) License ------- [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0) - -Big Thanks ------------ - -Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs](https://saucelabs.com) - -![Sauce Labs Logo](https://user-images.githubusercontent.com/557037/43443976-d88d5a78-94a2-11e8-8915-9f06521423dd.png) \ No newline at end of file diff --git a/angular.json b/angular.json index c1275f42d..e27e74ea2 100644 --- a/angular.json +++ b/angular.json @@ -12,8 +12,14 @@ "schematics": {}, "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-builders/custom-webpack:browser", "options": { + "customWebpackConfig": { + "path": "./webpack.config.js" + }, + "allowedCommonJsDependencies":[ + "chart.js" + ], "outputPath": "www", "index": "src/index.html", "main": "src/main.ts", @@ -55,11 +61,25 @@ "budgets": [ { "type": "initial", - "maximumWarning": "50mb", - "maximumError": "100mb" + "maximumWarning": "5mb", + "maximumError": "20mb" } ] }, + "testing": { + "optimization": { + "scripts": false, + "styles": true + }, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + }, "ci": { "progress": false } diff --git a/config.xml b/config.xml index d166d130d..4bab48e54 100644 --- a/config.xml +++ b/config.xml @@ -1,5 +1,5 @@ - + Moodle Moodle official app Moodle Mobile team @@ -27,7 +27,7 @@ - + @@ -47,6 +47,11 @@ + + + + + @@ -57,11 +62,12 @@ + - + @@ -124,11 +130,6 @@ - - - - - @@ -185,12 +186,6 @@ - - - - - - @@ -256,7 +251,7 @@ - 3.9.5 + 4.0.0 @@ -288,6 +283,9 @@ This app needs third party cookies to correctly render embedded content from the Moodle site. + + + diff --git a/gulpfile.js b/gulpfile.js index 9f3f5f93f..31db54239 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -69,3 +69,7 @@ gulp.task('watch', () => { gulp.watch(['./tests/behat'], { interval: 500 }, gulp.parallel('behat')); } }); + +gulp.task('watch-behat', () => { + gulp.watch(['./tests/behat'], { interval: 500 }, gulp.parallel('behat')); +}); diff --git a/licenses.json b/licenses.json index a05f284ed..f9ea6b245 100644 --- a/licenses.json +++ b/licenses.json @@ -1,291 +1,331 @@ { - "@angular/animations@11.0.1": { + "@angular/animations@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/animations", - "licenseFile": "node_modules/@angular/animations/README.md" + "licenseFile": "README.md" }, "@angular/common@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/common", - "licenseFile": "node_modules/@angular/common/README.md" + "licenseFile": "README.md" }, "@angular/compiler@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/compiler", - "licenseFile": "node_modules/@angular/compiler/README.md" + "licenseFile": "README.md" }, "@angular/core@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/core", - "licenseFile": "node_modules/@angular/core/README.md" + "licenseFile": "README.md" }, "@angular/forms@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/forms", - "licenseFile": "node_modules/@angular/forms/README.md" + "licenseFile": "README.md" }, "@angular/platform-browser-dynamic@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/platform-browser-dynamic", - "licenseFile": "node_modules/@angular/platform-browser-dynamic/README.md" + "licenseFile": "README.md" }, "@angular/platform-browser@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/platform-browser", - "licenseFile": "node_modules/@angular/platform-browser/README.md" + "licenseFile": "README.md" }, "@angular/router@10.0.14": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "angular", - "path": "/Users/pau/git/moodleapp5/node_modules/@angular/router", - "licenseFile": "node_modules/@angular/router/README.md" + "licenseFile": "README.md" }, "@ionic-native/badge@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/badge", - "licenseFile": "node_modules/@ionic-native/badge/README.md" + "licenseFile": "README.md" }, "@ionic-native/camera@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/camera", - "licenseFile": "node_modules/@ionic-native/camera/README.md" + "licenseFile": "README.md" }, "@ionic-native/chooser@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/chooser", - "licenseFile": "node_modules/@ionic-native/chooser/README.md" + "licenseFile": "README.md" }, "@ionic-native/clipboard@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/clipboard", - "licenseFile": "node_modules/@ionic-native/clipboard/README.md" + "licenseFile": "README.md" }, "@ionic-native/core@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/core" + "licenseFile": "null" }, "@ionic-native/device@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/device", - "licenseFile": "node_modules/@ionic-native/device/README.md" + "licenseFile": "README.md" }, "@ionic-native/diagnostic@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/diagnostic", - "licenseFile": "node_modules/@ionic-native/diagnostic/README.md" + "licenseFile": "README.md" }, "@ionic-native/file-opener@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/file-opener", - "licenseFile": "node_modules/@ionic-native/file-opener/README.md" + "licenseFile": "README.md" }, "@ionic-native/file-transfer@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/file-transfer", - "licenseFile": "node_modules/@ionic-native/file-transfer/README.md" + "licenseFile": "README.md" }, "@ionic-native/file@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/file", - "licenseFile": "node_modules/@ionic-native/file/README.md" + "licenseFile": "README.md" }, "@ionic-native/geolocation@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/geolocation", - "licenseFile": "node_modules/@ionic-native/geolocation/README.md" + "licenseFile": "README.md" }, "@ionic-native/http@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/http", - "licenseFile": "node_modules/@ionic-native/http/README.md" + "licenseFile": "README.md" }, "@ionic-native/in-app-browser@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/in-app-browser", - "licenseFile": "node_modules/@ionic-native/in-app-browser/README.md" + "licenseFile": "README.md" }, "@ionic-native/ionic-webview@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/ionic-webview", - "licenseFile": "node_modules/@ionic-native/ionic-webview/README.md" + "licenseFile": "README.md" }, "@ionic-native/keyboard@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/keyboard", - "licenseFile": "node_modules/@ionic-native/keyboard/README.md" + "licenseFile": "README.md" }, "@ionic-native/local-notifications@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/local-notifications", - "licenseFile": "node_modules/@ionic-native/local-notifications/README.md" + "licenseFile": "README.md" }, "@ionic-native/media-capture@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/media-capture", - "licenseFile": "node_modules/@ionic-native/media-capture/README.md" + "licenseFile": "README.md" }, "@ionic-native/media@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/media", - "licenseFile": "node_modules/@ionic-native/media/README.md" + "licenseFile": "README.md" }, "@ionic-native/network@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/network", - "licenseFile": "node_modules/@ionic-native/network/README.md" + "licenseFile": "README.md" }, "@ionic-native/push@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/push", - "licenseFile": "node_modules/@ionic-native/push/README.md" + "licenseFile": "README.md" }, "@ionic-native/qr-scanner@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/qr-scanner", - "licenseFile": "node_modules/@ionic-native/qr-scanner/README.md" + "licenseFile": "README.md" }, "@ionic-native/splash-screen@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/splash-screen", - "licenseFile": "node_modules/@ionic-native/splash-screen/README.md" + "licenseFile": "README.md" }, "@ionic-native/sqlite@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/sqlite", - "licenseFile": "node_modules/@ionic-native/sqlite/README.md" + "licenseFile": "README.md" }, "@ionic-native/status-bar@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/status-bar", - "licenseFile": "node_modules/@ionic-native/status-bar/README.md" + "licenseFile": "README.md" }, "@ionic-native/web-intent@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/web-intent", - "licenseFile": "node_modules/@ionic-native/web-intent/README.md" + "licenseFile": "README.md" }, "@ionic-native/zip@5.33.0": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic-native", "publisher": "ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/zip", - "licenseFile": "node_modules/@ionic-native/zip/README.md" + "licenseFile": "README.md" }, "@ionic/angular@5.6.6": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic/angular", - "licenseFile": "node_modules/@ionic/angular/README.md" + "licenseFile": "README.md" }, "@ionic/core@5.6.6": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionic", "publisher": "Ionic Team", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic/core", - "licenseFile": "node_modules/@ionic/core/LICENSE" + "licenseFile": "LICENSE" + }, + "@moodlehq/cordova-plugin-file-transfer@1.7.1-moodle.2": { + "licenses": "Apache-2.0", + "repository": "https://github.com/moodlemobile/cordova-plugin-file-transfer", + "publisher": "Apache Software Foundation", + "licenseFile": "LICENSE", + "noticeFile": "node_modules/@moodlehq/cordova-plugin-file-transfer/NOTICE" + }, + "@moodlehq/cordova-plugin-inappbrowser@5.0.0-moodle.2": { + "licenses": "Apache-2.0", + "repository": "https://github.com/moodlemobile/cordova-plugin-inappbrowser", + "publisher": "Apache Software Foundation", + "licenseFile": "LICENSE", + "noticeFile": "node_modules/@moodlehq/cordova-plugin-inappbrowser/NOTICE" + }, + "@moodlehq/cordova-plugin-ionic-webview@5.0.0-moodle.1": { + "licenses": "Apache-2.0", + "repository": "https://github.com/moodlemobile/cordova-plugin-ionic-webview", + "publisher": "Ionic Team", + "licenseFile": "LICENSE" + }, + "@moodlehq/cordova-plugin-local-notification@0.9.0-moodle.3": { + "licenses": "Apache*", + "repository": "https://github.com/moodlemobile/cordova-plugin-local-notification", + "publisher": "Sebastián Katzer", + "licenseFile": "LICENSE" + }, + "@moodlehq/cordova-plugin-qrscanner@3.0.1-moodle.2": { + "licenses": "MIT", + "repository": "https://github.com/moodlemobile/cordova-plugin-qrscanner", + "publisher": "Jason Dreyzehner", + "licenseFile": "LICENSE" + }, + "@moodlehq/phonegap-plugin-push@2.0.0-moodle.2": { + "licenses": "MIT", + "repository": "https://github.com/moodlemobile/phonegap-plugin-push", + "publisher": "Erisu", + "licenseFile": "README.md" }, "@netflix/nerror@1.1.3": { "licenses": "MIT", "repository": "https://github.com/Netflix/nerror", - "path": "/Users/pau/git/moodleapp5/node_modules/@netflix/nerror", - "licenseFile": "node_modules/@netflix/nerror/LICENSE" + "licenseFile": "LICENSE" }, "@ngx-translate/core@13.0.0": { "licenses": "MIT", "repository": "https://github.com/ngx-translate/core", "publisher": "Olivier Combe", - "path": "/Users/pau/git/moodleapp5/node_modules/@ngx-translate/core", - "licenseFile": "node_modules/@ngx-translate/core/README.md" + "licenseFile": "README.md" }, "@ngx-translate/http-loader@6.0.0": { "licenses": "MIT", "repository": "https://github.com/ngx-translate/http-loader", "publisher": "Olivier Combe", - "path": "/Users/pau/git/moodleapp5/node_modules/@ngx-translate/http-loader", - "licenseFile": "node_modules/@ngx-translate/http-loader/README.md" + "licenseFile": "README.md" }, "@nodelib/fs.scandir@2.1.3": { "licenses": "MIT", "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.scandir", - "path": "/Users/pau/git/moodleapp5/node_modules/@nodelib/fs.scandir", - "licenseFile": "node_modules/@nodelib/fs.scandir/LICENSE" + "licenseFile": "LICENSE" }, "@nodelib/fs.stat@2.0.3": { "licenses": "MIT", "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.stat", - "path": "/Users/pau/git/moodleapp5/node_modules/@nodelib/fs.stat", - "licenseFile": "node_modules/@nodelib/fs.stat/LICENSE" + "licenseFile": "LICENSE" }, "@nodelib/fs.walk@1.2.4": { "licenses": "MIT", "repository": "https://github.com/nodelib/nodelib/tree/master/packages/fs/fs.walk", - "path": "/Users/pau/git/moodleapp5/node_modules/@nodelib/fs.walk", - "licenseFile": "node_modules/@nodelib/fs.walk/LICENSE" + "licenseFile": "LICENSE" + }, + "@npmcli/git@2.1.0": { + "licenses": "ISC", + "repository": "https://github.com/npm/git", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "@npmcli/installed-package-contents@1.0.7": { + "licenses": "ISC", + "repository": "https://github.com/npm/installed-package-contents", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "@npmcli/move-file@1.0.1": { + "licenses": "MIT", + "repository": "https://github.com/npm/move-file", + "licenseFile": "LICENSE.md" + }, + "@npmcli/node-gyp@1.0.2": { + "licenses": "ISC", + "publisher": "Brian Jenkins", + "email": "bonkydog@bonkydog.com", + "licenseFile": "README.md" + }, + "@npmcli/promise-spawn@1.3.2": { + "licenses": "ISC", + "repository": "https://github.com/npm/promise-spawn", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "@npmcli/run-script@1.8.5": { + "licenses": "ISC", + "repository": "https://github.com/npm/run-script", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" }, "@sindresorhus/is@0.14.0": { "licenses": "MIT", @@ -293,84 +333,99 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/@sindresorhus/is", - "licenseFile": "node_modules/@sindresorhus/is/license" + "licenseFile": "license" }, "@stencil/core@2.5.2": { "licenses": "MIT", "repository": "https://github.com/ionic-team/stencil", "publisher": "Ionic Team", - "path": "/Users/pau/git/moodleapp5/node_modules/@stencil/core", - "licenseFile": "node_modules/@stencil/core/LICENSE.md", + "licenseFile": "LICENSE.md", "noticeFile": "node_modules/@stencil/core/NOTICE.md" }, "@szmarczak/http-timer@1.1.2": { "licenses": "MIT", "repository": "https://github.com/szmarczak/http-timer", "publisher": "Szymon Marczak", - "path": "/Users/pau/git/moodleapp5/node_modules/@szmarczak/http-timer", - "licenseFile": "node_modules/@szmarczak/http-timer/LICENSE" + "licenseFile": "LICENSE" + }, + "@tootallnate/once@1.1.2": { + "licenses": "MIT", + "repository": "https://github.com/TooTallNate/once", + "publisher": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/", + "licenseFile": "null" }, "@types/chart.js@2.9.31": { "licenses": "MIT", "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped", - "path": "/Users/pau/git/moodleapp5/node_modules/@types/chart.js", - "licenseFile": "node_modules/@types/chart.js/LICENSE" - }, - "@types/cordova-plugin-file-transfer@1.6.2": { - "licenses": "MIT", - "repository": "https://github.com/apache/cordova-plugin-file-transfer", - "path": "/Users/pau/git/moodleapp5/node_modules/@types/cordova-plugin-file-transfer", - "licenseFile": "node_modules/@types/cordova-plugin-file-transfer/LICENSE" + "licenseFile": "LICENSE" }, "@types/cordova@0.0.34": { "licenses": "MIT", "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped", "publisher": "Microsoft Open Technologies Inc", "email": "http://msopentech.com", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic-native/badge/node_modules/@types/cordova", - "licenseFile": "node_modules/@ionic-native/badge/node_modules/@types/cordova/README.md" + "licenseFile": "README.md" }, "@types/dom-mediacapture-record@1.0.7": { "licenses": "MIT", "repository": "https://github.com/DefinitelyTyped/DefinitelyTyped", - "path": "/Users/pau/git/moodleapp5/node_modules/@types/dom-mediacapture-record", - "licenseFile": "node_modules/@types/dom-mediacapture-record/LICENSE" + "licenseFile": "LICENSE" }, "abbrev@1.1.1": { "licenses": "ISC", "repository": "https://github.com/isaacs/abbrev-js", "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", - "path": "/Users/pau/git/moodleapp5/node_modules/abbrev", - "licenseFile": "node_modules/abbrev/LICENSE" + "licenseFile": "LICENSE" }, "accepts@1.3.7": { "licenses": "MIT", "repository": "https://github.com/jshttp/accepts", - "path": "/Users/pau/git/moodleapp5/node_modules/accepts", - "licenseFile": "node_modules/accepts/LICENSE" + "licenseFile": "LICENSE" + }, + "agent-base@6.0.2": { + "licenses": "MIT", + "repository": "https://github.com/TooTallNate/node-agent-base", + "publisher": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/", + "licenseFile": "README.md" + }, + "agentkeepalive@4.1.4": { + "licenses": "MIT", + "repository": "https://github.com/node-modules/agentkeepalive", + "publisher": "fengmk2", + "email": "fengmk2@gmail.com", + "url": "https://fengmk2.com", + "licenseFile": "LICENSE" + }, + "aggregate-error@3.1.0": { + "licenses": "MIT", + "repository": "https://github.com/sindresorhus/aggregate-error", + "publisher": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com", + "licenseFile": "license" }, "ajv@6.12.5": { "licenses": "MIT", "repository": "https://github.com/ajv-validator/ajv", "publisher": "Evgeny Poberezkin", - "path": "/Users/pau/git/moodleapp5/node_modules/ajv", - "licenseFile": "node_modules/ajv/LICENSE" + "licenseFile": "LICENSE" }, "android-versions@1.6.0": { "licenses": "MIT", "repository": "https://github.com/dvoiss/android-versions", "publisher": "dvoiss", - "path": "/Users/pau/git/moodleapp5/node_modules/android-versions", - "licenseFile": "node_modules/android-versions/README.md" + "licenseFile": "README.md" }, "ansi-align@3.0.0": { "licenses": "ISC", "repository": "https://github.com/nexdrew/ansi-align", "publisher": "nexdrew", - "path": "/Users/pau/git/moodleapp5/node_modules/ansi-align", - "licenseFile": "node_modules/ansi-align/LICENSE" + "licenseFile": "LICENSE" }, "ansi-escapes@3.2.0": { "licenses": "MIT", @@ -378,8 +433,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/ansi-escapes", - "licenseFile": "node_modules/ansi-escapes/license" + "licenseFile": "license" }, "ansi-regex@2.1.1": { "licenses": "MIT", @@ -387,8 +441,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/gauge/node_modules/ansi-regex", - "licenseFile": "node_modules/gauge/node_modules/ansi-regex/license" + "licenseFile": "license" }, "ansi-regex@3.0.0": { "licenses": "MIT", @@ -396,8 +449,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/ansi-regex", - "licenseFile": "node_modules/ansi-regex/license" + "licenseFile": "license" }, "ansi-regex@4.1.0": { "licenses": "MIT", @@ -405,8 +457,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/strip-ansi/node_modules/ansi-regex", - "licenseFile": "node_modules/strip-ansi/node_modules/ansi-regex/license" + "licenseFile": "license" }, "ansi-regex@5.0.0": { "licenses": "MIT", @@ -414,8 +465,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/boxen/node_modules/ansi-regex", - "licenseFile": "node_modules/boxen/node_modules/ansi-regex/license" + "licenseFile": "license" }, "ansi-styles@3.2.1": { "licenses": "MIT", @@ -423,8 +473,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/insight/node_modules/ansi-styles", - "licenseFile": "node_modules/insight/node_modules/ansi-styles/license" + "licenseFile": "license" }, "ansi-styles@4.3.0": { "licenses": "MIT", @@ -432,8 +481,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/ansi-styles", - "licenseFile": "node_modules/ansi-styles/license" + "licenseFile": "license" }, "ansi@0.3.1": { "licenses": "MIT", @@ -441,24 +489,21 @@ "publisher": "Nathan Rajlich", "email": "nathan@tootallnate.net", "url": "http://tootallnate.net", - "path": "/Users/pau/git/moodleapp5/node_modules/ansi", - "licenseFile": "node_modules/ansi/LICENSE" + "licenseFile": "LICENSE" }, "aproba@1.2.0": { "licenses": "ISC", "repository": "https://github.com/iarna/aproba", "publisher": "Rebecca Turner", "email": "me@re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/aproba", - "licenseFile": "node_modules/aproba/LICENSE" + "licenseFile": "LICENSE" }, "are-we-there-yet@1.1.5": { "licenses": "ISC", "repository": "https://github.com/iarna/are-we-there-yet", "publisher": "Rebecca Turner", "url": "http://re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/are-we-there-yet", - "licenseFile": "node_modules/are-we-there-yet/LICENSE" + "licenseFile": "LICENSE" }, "array-find-index@1.0.2": { "licenses": "MIT", @@ -466,8 +511,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/array-find-index", - "licenseFile": "node_modules/array-find-index/license" + "licenseFile": "license" }, "array-flatten@1.1.1": { "licenses": "MIT", @@ -475,8 +519,7 @@ "publisher": "Blake Embrey", "email": "hello@blakeembrey.com", "url": "http://blakeembrey.me", - "path": "/Users/pau/git/moodleapp5/node_modules/array-flatten", - "licenseFile": "node_modules/array-flatten/LICENSE" + "licenseFile": "LICENSE" }, "array-union@2.1.0": { "licenses": "MIT", @@ -484,47 +527,41 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/array-union", - "licenseFile": "node_modules/array-union/license" + "licenseFile": "license" }, "asn1@0.2.4": { "licenses": "MIT", "repository": "https://github.com/joyent/node-asn1", "publisher": "Joyent", "url": "joyent.com", - "path": "/Users/pau/git/moodleapp5/node_modules/asn1", - "licenseFile": "node_modules/asn1/LICENSE" + "licenseFile": "LICENSE" }, "assert-plus@1.0.0": { "licenses": "MIT", "repository": "https://github.com/mcavage/node-assert-plus", "publisher": "Mark Cavage", "email": "mcavage@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/assert-plus", - "licenseFile": "node_modules/assert-plus/README.md" + "licenseFile": "README.md" }, "async@2.6.3": { "licenses": "MIT", "repository": "https://github.com/caolan/async", "publisher": "Caolan McMahon", - "path": "/Users/pau/git/moodleapp5/node_modules/async", - "licenseFile": "node_modules/async/LICENSE" + "licenseFile": "LICENSE" }, "asynckit@0.4.0": { "licenses": "MIT", "repository": "https://github.com/alexindigo/asynckit", "publisher": "Alex Indigo", "email": "iam@alexindigo.com", - "path": "/Users/pau/git/moodleapp5/node_modules/asynckit", - "licenseFile": "node_modules/asynckit/LICENSE" + "licenseFile": "LICENSE" }, "at-least-node@1.0.0": { "licenses": "ISC", "repository": "https://github.com/RyanZim/at-least-node", "publisher": "Ryan Zimmerman", "email": "opensrc@ryanzim.com", - "path": "/Users/pau/git/moodleapp5/node_modules/at-least-node", - "licenseFile": "node_modules/at-least-node/LICENSE" + "licenseFile": "LICENSE" }, "aws-sign2@0.7.0": { "licenses": "Apache-2.0", @@ -532,8 +569,7 @@ "publisher": "Mikeal Rogers", "email": "mikeal.rogers@gmail.com", "url": "http://www.futurealoof.com", - "path": "/Users/pau/git/moodleapp5/node_modules/aws-sign2", - "licenseFile": "node_modules/aws-sign2/LICENSE" + "licenseFile": "LICENSE" }, "aws4@1.10.1": { "licenses": "MIT", @@ -541,15 +577,7 @@ "publisher": "Michael Hart", "email": "michael.hart.au@gmail.com", "url": "https://github.com/mhart", - "path": "/Users/pau/git/moodleapp5/node_modules/aws4", - "licenseFile": "node_modules/aws4/LICENSE" - }, - "babel-plugin-add-header-comment@1.0.3": { - "licenses": "MIT", - "repository": "https://github.com/shopify/babel-plugin-add-header-comment", - "publisher": "Shopify Inc.", - "path": "/Users/pau/git/moodleapp5/node_modules/babel-plugin-add-header-comment", - "licenseFile": "node_modules/babel-plugin-add-header-comment/LICENSE.md" + "licenseFile": "LICENSE" }, "balanced-match@1.0.0": { "licenses": "MIT", @@ -557,42 +585,36 @@ "publisher": "Julian Gruber", "email": "mail@juliangruber.com", "url": "http://juliangruber.com", - "path": "/Users/pau/git/moodleapp5/node_modules/balanced-match", - "licenseFile": "node_modules/balanced-match/LICENSE.md" + "licenseFile": "LICENSE.md" }, "base64-js@1.3.1": { "licenses": "MIT", "repository": "https://github.com/beatgammit/base64-js", "publisher": "T. Jameson Little", "email": "t.jameson.little@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/base64-js", - "licenseFile": "node_modules/base64-js/LICENSE" + "licenseFile": "LICENSE" }, "bcrypt-pbkdf@1.0.2": { "licenses": "BSD-3-Clause", "repository": "https://github.com/joyent/node-bcrypt-pbkdf", - "path": "/Users/pau/git/moodleapp5/node_modules/bcrypt-pbkdf", - "licenseFile": "node_modules/bcrypt-pbkdf/LICENSE" + "licenseFile": "LICENSE" }, "big-integer@1.6.48": { "licenses": "Unlicense", "repository": "https://github.com/peterolson/BigInteger.js", "publisher": "Peter Olson", "email": "peter.e.c.olson+npm@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/big-integer", - "licenseFile": "node_modules/big-integer/LICENSE" + "licenseFile": "LICENSE" }, "bl@4.0.3": { "licenses": "MIT", "repository": "https://github.com/rvagg/bl", - "path": "/Users/pau/git/moodleapp5/node_modules/bl", - "licenseFile": "node_modules/bl/LICENSE.md" + "licenseFile": "LICENSE.md" }, "body-parser@1.19.0": { "licenses": "MIT", "repository": "https://github.com/expressjs/body-parser", - "path": "/Users/pau/git/moodleapp5/node_modules/body-parser", - "licenseFile": "node_modules/body-parser/LICENSE" + "licenseFile": "LICENSE" }, "boxen@4.2.0": { "licenses": "MIT", @@ -600,31 +622,27 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/boxen", - "licenseFile": "node_modules/boxen/license" + "licenseFile": "license" }, "bplist-creator@0.0.8": { "licenses": "MIT", "repository": "https://github.com/nearinfinity/node-bplist-creator", "publisher": "Joe Ferner", - "path": "/Users/pau/git/moodleapp5/node_modules/bplist-creator", - "licenseFile": "node_modules/bplist-creator/LICENSE" + "licenseFile": "LICENSE" }, "bplist-parser@0.0.6": { "licenses": "MIT", "repository": "https://github.com/nearinfinity/node-bplist-parser", "publisher": "Joe Ferner", "email": "joe.ferner@nearinfinity.com", - "path": "/Users/pau/git/moodleapp5/node_modules/ios-sim/node_modules/bplist-parser", - "licenseFile": "node_modules/ios-sim/node_modules/bplist-parser/README.md" + "licenseFile": "README.md" }, "bplist-parser@0.2.0": { "licenses": "MIT", "repository": "https://github.com/nearinfinity/node-bplist-parser", "publisher": "Joe Ferner", "email": "joe.ferner@nearinfinity.com", - "path": "/Users/pau/git/moodleapp5/node_modules/bplist-parser", - "licenseFile": "node_modules/bplist-parser/README.md" + "licenseFile": "README.md" }, "brace-expansion@1.1.11": { "licenses": "MIT", @@ -632,16 +650,14 @@ "publisher": "Julian Gruber", "email": "mail@juliangruber.com", "url": "http://juliangruber.com", - "path": "/Users/pau/git/moodleapp5/node_modules/brace-expansion", - "licenseFile": "node_modules/brace-expansion/LICENSE" + "licenseFile": "LICENSE" }, "braces@3.0.2": { "licenses": "MIT", "repository": "https://github.com/micromatch/braces", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/braces", - "licenseFile": "node_modules/braces/LICENSE" + "licenseFile": "LICENSE" }, "buffer@5.7.1": { "licenses": "MIT", @@ -649,14 +665,12 @@ "publisher": "Feross Aboukhadijeh", "email": "feross@feross.org", "url": "https://feross.org", - "path": "/Users/pau/git/moodleapp5/node_modules/bl/node_modules/buffer", - "licenseFile": "node_modules/bl/node_modules/buffer/LICENSE" + "licenseFile": "LICENSE" }, "builtins@1.0.3": { "licenses": "MIT", "repository": "https://github.com/juliangruber/builtins", - "path": "/Users/pau/git/moodleapp5/node_modules/builtins", - "licenseFile": "node_modules/builtins/License" + "licenseFile": "License" }, "bytes@3.0.0": { "licenses": "MIT", @@ -664,8 +678,7 @@ "publisher": "TJ Holowaychuk", "email": "tj@vision-media.ca", "url": "http://tjholowaychuk.com", - "path": "/Users/pau/git/moodleapp5/node_modules/bytes", - "licenseFile": "node_modules/bytes/LICENSE" + "licenseFile": "LICENSE" }, "bytes@3.1.0": { "licenses": "MIT", @@ -673,8 +686,12 @@ "publisher": "TJ Holowaychuk", "email": "tj@vision-media.ca", "url": "http://tjholowaychuk.com", - "path": "/Users/pau/git/moodleapp5/node_modules/body-parser/node_modules/bytes", - "licenseFile": "node_modules/body-parser/node_modules/bytes/LICENSE" + "licenseFile": "LICENSE" + }, + "cacache@15.2.0": { + "licenses": "ISC", + "repository": "https://github.com/npm/cacache", + "licenseFile": "LICENSE.md" }, "cacheable-request@6.1.0": { "licenses": "MIT", @@ -682,8 +699,7 @@ "publisher": "Luke Childs", "email": "lukechilds123@gmail.com", "url": "http://lukechilds.co.uk", - "path": "/Users/pau/git/moodleapp5/node_modules/cacheable-request", - "licenseFile": "node_modules/cacheable-request/LICENSE" + "licenseFile": "LICENSE" }, "callsites@3.1.0": { "licenses": "MIT", @@ -691,8 +707,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/callsites", - "licenseFile": "node_modules/callsites/license" + "licenseFile": "license" }, "camelcase@5.3.1": { "licenses": "MIT", @@ -700,56 +715,48 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/camelcase", - "licenseFile": "node_modules/camelcase/license" + "licenseFile": "license" }, "caseless@0.12.0": { "licenses": "Apache-2.0", "repository": "https://github.com/mikeal/caseless", "publisher": "Mikeal Rogers", "email": "mikeal.rogers@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/caseless", - "licenseFile": "node_modules/caseless/LICENSE" + "licenseFile": "LICENSE" }, "chalk@2.4.2": { "licenses": "MIT", "repository": "https://github.com/chalk/chalk", - "path": "/Users/pau/git/moodleapp5/node_modules/insight/node_modules/chalk", - "licenseFile": "node_modules/insight/node_modules/chalk/license" + "licenseFile": "license" }, "chalk@3.0.0": { "licenses": "MIT", "repository": "https://github.com/chalk/chalk", - "path": "/Users/pau/git/moodleapp5/node_modules/chalk", - "licenseFile": "node_modules/chalk/license" + "licenseFile": "license" }, "chardet@0.7.0": { "licenses": "MIT", "repository": "https://github.com/runk/node-chardet", "publisher": "Dmitry Shirokov", "email": "deadrunk@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/chardet", - "licenseFile": "node_modules/chardet/LICENSE" + "licenseFile": "LICENSE" }, "chart.js@2.9.4": { "licenses": "MIT", "repository": "https://github.com/chartjs/Chart.js", - "path": "/Users/pau/git/moodleapp5/node_modules/chart.js", - "licenseFile": "node_modules/chart.js/LICENSE.md" + "licenseFile": "LICENSE.md" }, "chartjs-color-string@0.6.0": { "licenses": "MIT", "repository": "https://github.com/chartjs/chartjs-color-string", "publisher": "Heather Arthur", "email": "fayearthur@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/chartjs-color-string", - "licenseFile": "node_modules/chartjs-color-string/LICENSE" + "licenseFile": "LICENSE" }, "chartjs-color@2.4.1": { "licenses": "MIT", "repository": "https://github.com/chartjs/chartjs-color", - "path": "/Users/pau/git/moodleapp5/node_modules/chartjs-color", - "licenseFile": "node_modules/chartjs-color/LICENSE" + "licenseFile": "LICENSE" }, "chownr@1.1.4": { "licenses": "ISC", @@ -757,8 +764,15 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/tar-fs/node_modules/chownr", - "licenseFile": "node_modules/tar-fs/node_modules/chownr/LICENSE" + "licenseFile": "LICENSE" + }, + "chownr@2.0.0": { + "licenses": "ISC", + "repository": "https://github.com/isaacs/chownr", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" }, "ci-info@2.0.0": { "licenses": "MIT", @@ -766,8 +780,15 @@ "publisher": "Thomas Watson Steen", "email": "w@tson.dk", "url": "https://twitter.com/wa7son", - "path": "/Users/pau/git/moodleapp5/node_modules/ci-info", - "licenseFile": "node_modules/ci-info/LICENSE" + "licenseFile": "LICENSE" + }, + "clean-stack@2.2.0": { + "licenses": "MIT", + "repository": "https://github.com/sindresorhus/clean-stack", + "publisher": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com", + "licenseFile": "license" }, "cli-boxes@2.2.1": { "licenses": "MIT", @@ -775,8 +796,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cli-boxes", - "licenseFile": "node_modules/cli-boxes/license" + "licenseFile": "license" }, "cli-cursor@2.1.0": { "licenses": "MIT", @@ -784,16 +804,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cli-cursor", - "licenseFile": "node_modules/cli-cursor/license" + "licenseFile": "license" }, "cli-width@2.2.1": { "licenses": "ISC", "repository": "https://github.com/knownasilya/cli-width", "publisher": "Ilya Radchenko", "email": "knownasilya@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cli-width", - "licenseFile": "node_modules/cli-width/LICENSE" + "licenseFile": "LICENSE" }, "clone-response@1.0.2": { "licenses": "MIT", @@ -801,8 +819,7 @@ "publisher": "Luke Childs", "email": "lukechilds123@gmail.com", "url": "http://lukechilds.co.uk", - "path": "/Users/pau/git/moodleapp5/node_modules/clone-response", - "licenseFile": "node_modules/clone-response/LICENSE" + "licenseFile": "LICENSE" }, "code-point-at@1.1.0": { "licenses": "MIT", @@ -810,54 +827,47 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/code-point-at", - "licenseFile": "node_modules/code-point-at/license" + "licenseFile": "license" }, "color-convert@1.9.3": { "licenses": "MIT", "repository": "https://github.com/Qix-/color-convert", "publisher": "Heather Arthur", "email": "fayearthur@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/chartjs-color/node_modules/color-convert", - "licenseFile": "node_modules/chartjs-color/node_modules/color-convert/LICENSE" + "licenseFile": "LICENSE" }, "color-convert@2.0.1": { "licenses": "MIT", "repository": "https://github.com/Qix-/color-convert", "publisher": "Heather Arthur", "email": "fayearthur@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/color-convert", - "licenseFile": "node_modules/color-convert/LICENSE" + "licenseFile": "LICENSE" }, "color-name@1.1.3": { "licenses": "MIT", "repository": "https://github.com/dfcreative/color-name", "publisher": "DY", "email": "dfcreative@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/chartjs-color/node_modules/color-name", - "licenseFile": "node_modules/chartjs-color/node_modules/color-name/LICENSE" + "licenseFile": "LICENSE" }, "color-name@1.1.4": { "licenses": "MIT", "repository": "https://github.com/colorjs/color-name", "publisher": "DY", "email": "dfcreative@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/color-name", - "licenseFile": "node_modules/color-name/LICENSE" + "licenseFile": "LICENSE" }, "colors@1.4.0": { "licenses": "MIT", "repository": "https://github.com/Marak/colors.js", "publisher": "Marak Squires", - "path": "/Users/pau/git/moodleapp5/node_modules/colors", - "licenseFile": "node_modules/colors/LICENSE" + "licenseFile": "LICENSE" }, "com-darryncampbell-cordova-plugin-intent@1.3.0": { "licenses": "MIT", "repository": "https://github.com/darryncampbell/darryncampbell-cordova-plugin-intent", "publisher": "Darryn Campbell", - "path": "/Users/pau/git/moodleapp5/node_modules/com-darryncampbell-cordova-plugin-intent", - "licenseFile": "node_modules/com-darryncampbell-cordova-plugin-intent/LICENSE" + "licenseFile": "LICENSE" }, "combined-stream@1.0.8": { "licenses": "MIT", @@ -865,20 +875,17 @@ "publisher": "Felix Geisendörfer", "email": "felix@debuggable.com", "url": "http://debuggable.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/combined-stream", - "licenseFile": "node_modules/combined-stream/License" + "licenseFile": "License" }, "compressible@2.0.18": { "licenses": "MIT", "repository": "https://github.com/jshttp/compressible", - "path": "/Users/pau/git/moodleapp5/node_modules/compressible", - "licenseFile": "node_modules/compressible/LICENSE" + "licenseFile": "LICENSE" }, "compression@1.7.4": { "licenses": "MIT", "repository": "https://github.com/expressjs/compression", - "path": "/Users/pau/git/moodleapp5/node_modules/compression", - "licenseFile": "node_modules/compression/LICENSE" + "licenseFile": "LICENSE" }, "concat-map@0.0.1": { "licenses": "MIT", @@ -886,8 +893,7 @@ "publisher": "James Halliday", "email": "mail@substack.net", "url": "http://substack.net", - "path": "/Users/pau/git/moodleapp5/node_modules/concat-map", - "licenseFile": "node_modules/concat-map/LICENSE" + "licenseFile": "LICENSE" }, "conf@1.4.0": { "licenses": "MIT", @@ -895,8 +901,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/conf", - "licenseFile": "node_modules/conf/license" + "licenseFile": "license" }, "configstore@5.0.1": { "licenses": "BSD-2-Clause", @@ -904,8 +909,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/configstore", - "licenseFile": "node_modules/configstore/license" + "licenseFile": "license" }, "console-control-strings@1.1.0": { "licenses": "ISC", @@ -913,108 +917,94 @@ "publisher": "Rebecca Turner", "email": "me@re-becca.org", "url": "http://re-becca.org/", - "path": "/Users/pau/git/moodleapp5/node_modules/console-control-strings", - "licenseFile": "node_modules/console-control-strings/LICENSE" + "licenseFile": "LICENSE" }, "content-disposition@0.5.3": { "licenses": "MIT", "repository": "https://github.com/jshttp/content-disposition", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/content-disposition", - "licenseFile": "node_modules/content-disposition/LICENSE" + "licenseFile": "LICENSE" }, "content-type@1.0.4": { "licenses": "MIT", "repository": "https://github.com/jshttp/content-type", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/content-type", - "licenseFile": "node_modules/content-type/LICENSE" + "licenseFile": "LICENSE" }, "cookie-signature@1.0.6": { "licenses": "MIT", "repository": "https://github.com/visionmedia/node-cookie-signature", "publisher": "TJ Holowaychuk", "email": "tj@learnboost.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cookie-signature", - "licenseFile": "node_modules/cookie-signature/Readme.md" + "licenseFile": "Readme.md" }, "cookie@0.4.0": { "licenses": "MIT", "repository": "https://github.com/jshttp/cookie", "publisher": "Roman Shtylman", "email": "shtylman@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cookie", - "licenseFile": "node_modules/cookie/LICENSE" + "licenseFile": "LICENSE" }, "cordova-android-support-gradle-release@3.0.1": { "licenses": "MIT", "publisher": "Dave Alden", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-android-support-gradle-release", - "licenseFile": "node_modules/cordova-android-support-gradle-release/README.md" + "licenseFile": "README.md" }, "cordova-android@9.1.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-android", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-android", - "licenseFile": "node_modules/cordova-android/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-android/NOTICE" }, "cordova-app-hello-world@5.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-app-hello-world", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-app-hello-world", - "licenseFile": "node_modules/cordova-app-hello-world/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-app-hello-world/NOTICE" }, "cordova-clipboard@1.3.0": { "licenses": "MIT", "repository": "https://github.com/ihadeed/cordova-clipboard", "publisher": "Ibrahim Hadeed", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-clipboard", - "licenseFile": "node_modules/cordova-clipboard/LICENSE" + "licenseFile": "LICENSE" }, "cordova-common@4.0.2": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-common", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-common", - "licenseFile": "node_modules/cordova-common/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-common/NOTICE" }, "cordova-create@3.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-create", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-create", - "licenseFile": "node_modules/cordova-create/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-create/NOTICE" }, - "cordova-fetch@3.0.0": { + "cordova-fetch@3.0.1": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-fetch", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-fetch", - "licenseFile": "node_modules/cordova-fetch/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-fetch/NOTICE" }, "cordova-ios@6.2.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-ios", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-ios", - "licenseFile": "node_modules/cordova-ios/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-ios/NOTICE" }, "cordova-lib@10.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-lib", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-lib", - "licenseFile": "node_modules/cordova-lib/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-lib/NOTICE" }, "cordova-plugin-add-swift-support@2.0.2": { @@ -1023,29 +1013,25 @@ "publisher": "Alexis Kofman", "email": "alexis.kofman@gmail.com", "url": "http://twitter.com/alexiskofman", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-add-swift-support", - "licenseFile": "node_modules/cordova-plugin-add-swift-support/LICENSE" + "licenseFile": "LICENSE" }, "cordova-plugin-advanced-http@3.1.0": { "licenses": "MIT", "repository": "https://github.com/silkimen/cordova-plugin-advanced-http", "publisher": "Wymsee", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-advanced-http", - "licenseFile": "node_modules/cordova-plugin-advanced-http/LICENSE" + "licenseFile": "LICENSE" }, "cordova-plugin-badge@0.8.8": { "licenses": "Apache*", "repository": "https://github.com/katzer/cordova-plugin-badge", "publisher": "Sebastián Katzer", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-badge", - "licenseFile": "node_modules/cordova-plugin-badge/LICENSE" + "licenseFile": "LICENSE" }, "cordova-plugin-camera@5.0.1": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-camera", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-camera", - "licenseFile": "node_modules/cordova-plugin-camera/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-camera/NOTICE" }, "cordova-plugin-chooser@1.3.2": { @@ -1054,8 +1040,7 @@ "publisher": "Cyph, Inc.", "email": "cordova-plugin-chooser@cyph.com", "url": "https://github.com/cyph", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-chooser", - "licenseFile": "node_modules/cordova-plugin-chooser/LICENSE" + "licenseFile": "LICENSE" }, "cordova-plugin-customurlscheme@5.0.2": { "licenses": "MIT", @@ -1063,218 +1048,157 @@ "publisher": "Eddy Verbruggen", "email": "eddyverbruggen@gmail.com", "url": "https://github.com/EddyVerbruggen", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-customurlscheme", - "licenseFile": "node_modules/cordova-plugin-customurlscheme/README.md" + "licenseFile": "README.md" }, "cordova-plugin-device@2.0.3": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-device", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-device", - "licenseFile": "node_modules/cordova-plugin-device/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-device/NOTICE" }, "cordova-plugin-file-opener2@3.0.5": { "licenses": "MIT", "repository": "https://github.com/pwlin/cordova-plugin-file-opener2", "publisher": "pwlin05@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-file-opener2", - "licenseFile": "node_modules/cordova-plugin-file-opener2/LICENSE" - }, - "cordova-plugin-file-transfer@2.0.0-dev": { - "licenses": "Apache-2.0", - "repository": "https://github.com/apache/cordova-plugin-file-transfer", - "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-file-transfer", - "licenseFile": "node_modules/cordova-plugin-file-transfer/LICENSE", - "noticeFile": "node_modules/cordova-plugin-file-transfer/NOTICE" + "licenseFile": "LICENSE" }, "cordova-plugin-file@6.0.2": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-file", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-file", - "licenseFile": "node_modules/cordova-plugin-file/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-file/NOTICE" }, "cordova-plugin-geolocation@4.1.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-geolocation", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-geolocation", - "licenseFile": "node_modules/cordova-plugin-geolocation/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-geolocation/NOTICE" }, "cordova-plugin-globalization@1.11.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-globalization", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-globalization", - "licenseFile": "node_modules/cordova-plugin-globalization/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-globalization/NOTICE" }, - "cordova-plugin-inappbrowser@5.0.0": { - "licenses": "Apache-2.0", - "repository": "https://github.com/apache/cordova-plugin-inappbrowser", - "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-inappbrowser", - "licenseFile": "node_modules/cordova-plugin-inappbrowser/LICENSE", - "noticeFile": "node_modules/cordova-plugin-inappbrowser/NOTICE" - }, "cordova-plugin-ionic-keyboard@2.2.0": { "licenses": "MIT*", "repository": "https://github.com/ionic-team/cordova-plugin-ionic-keyboard", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-ionic-keyboard", - "licenseFile": "node_modules/cordova-plugin-ionic-keyboard/LICENSE" - }, - "cordova-plugin-ionic-webview@5.0.0": { - "licenses": "Apache-2.0", - "repository": "https://github.com/ionic-team/cordova-plugin-ionic-webview", - "publisher": "Ionic Team", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-ionic-webview", - "licenseFile": "node_modules/cordova-plugin-ionic-webview/LICENSE" - }, - "cordova-plugin-local-notification@0.9.0-beta.3": { - "licenses": "Apache*", - "repository": "https://github.com/katzer/cordova-plugin-local-notifications", - "publisher": "Sebastián Katzer", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-local-notification", - "licenseFile": "node_modules/cordova-plugin-local-notification/LICENSE" + "licenseFile": "LICENSE" }, "cordova-plugin-media-capture@3.0.3": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-media-capture", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-media-capture", - "licenseFile": "node_modules/cordova-plugin-media-capture/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-media-capture/NOTICE" }, "cordova-plugin-media@5.0.3": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-media", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-media", - "licenseFile": "node_modules/cordova-plugin-media/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-media/NOTICE" }, "cordova-plugin-network-information@2.0.2": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-network-information", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-network-information", - "licenseFile": "node_modules/cordova-plugin-network-information/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-network-information/NOTICE" }, - "cordova-plugin-qrscanner@3.0.1": { - "licenses": "MIT", - "repository": "https://github.com/bitpay/cordova-plugin-qrscanner", - "publisher": "Jason Dreyzehner", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-qrscanner", - "licenseFile": "node_modules/cordova-plugin-qrscanner/LICENSE" - }, - "cordova-plugin-screen-orientation@3.0.2": { + "cordova-plugin-prevent-override@1.0.0": { "licenses": "Apache-2.0", - "repository": "https://github.com/apache/cordova-plugin-screen-orientation", - "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-screen-orientation", - "licenseFile": "node_modules/cordova-plugin-screen-orientation/LICENSE" + "repository": "https://github.com/moodlemobile/cordova-plugin-prevent-override", + "publisher": "Moodle Pty Ltd", + "licenseFile": "LICENSE" }, "cordova-plugin-splashscreen@6.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-splashscreen", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-splashscreen", - "licenseFile": "node_modules/cordova-plugin-splashscreen/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-splashscreen/NOTICE" }, "cordova-plugin-statusbar@2.4.3": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-statusbar", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-statusbar", - "licenseFile": "node_modules/cordova-plugin-statusbar/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-statusbar/NOTICE" }, "cordova-plugin-whitelist@1.3.4": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-plugin-whitelist", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-whitelist", - "licenseFile": "node_modules/cordova-plugin-whitelist/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-plugin-whitelist/NOTICE" }, "cordova-plugin-wkuserscript@1.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/moodlemobile/cordova-plugin-wkuserscript", "publisher": "Moodle Pty Ltd", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-wkuserscript", - "licenseFile": "node_modules/cordova-plugin-wkuserscript/LICENSE" + "licenseFile": "LICENSE" }, "cordova-plugin-wkwebview-cookies@1.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/moodlemobile/cordova-plugin-wkwebview-cookies", "publisher": "Moodle Pty Ltd", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-wkwebview-cookies", - "licenseFile": "node_modules/cordova-plugin-wkwebview-cookies/LICENSE" + "licenseFile": "LICENSE" }, "cordova-plugin-zip@3.1.0": { "licenses": "BSD*", "repository": "https://github.com/MobileChromeApps/cordova-plugin-zip", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-plugin-zip", - "licenseFile": "node_modules/cordova-plugin-zip/LICENSE" + "licenseFile": "LICENSE" }, "cordova-serve@4.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-serve", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-serve", - "licenseFile": "node_modules/cordova-serve/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-serve/NOTICE" }, "cordova-sqlite-storage-dependencies@4.0.0": { "licenses": "MIT", "repository": "https://github.com/brodybits/cordova-sqlite-storage-dependencies", "publisher": "Christopher J. Brody", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-sqlite-storage-dependencies", - "licenseFile": "node_modules/cordova-sqlite-storage-dependencies/README.md" + "licenseFile": "README.md" }, "cordova-sqlite-storage@6.0.0": { "licenses": "MIT", "repository": "https://github.com/xpbrew/cordova-sqlite-storage", "publisher": "various", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-sqlite-storage", - "licenseFile": "node_modules/cordova-sqlite-storage/LICENSE.md" + "licenseFile": "LICENSE.md" }, - "cordova-support-google-services@1.3.2": { + "cordova-support-google-services@1.2.1": { "licenses": "MIT", "repository": "https://github.com/chemerisuk/cordova-support-google-services", "publisher": "Maksim Chemerisuk", "email": "chemerisuk@gmail.com", "url": "https://github.com/chemerisuk", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-support-google-services", - "licenseFile": "node_modules/cordova-support-google-services/LICENSE" + "licenseFile": "LICENSE" }, "cordova.plugins.diagnostic@5.0.2": { "licenses": "MIT", "repository": "https://github.com/dpa99c/cordova-diagnostic-plugin", "publisher": "Dave Alden", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova.plugins.diagnostic", - "licenseFile": "node_modules/cordova.plugins.diagnostic/README.md" + "licenseFile": "README.md" }, "cordova@10.0.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-cli", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova", - "licenseFile": "node_modules/cordova/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova/NOTICE" }, "core-js@3.9.1": { "licenses": "MIT", "repository": "https://github.com/zloirock/core-js", - "path": "/Users/pau/git/moodleapp5/node_modules/core-js", - "licenseFile": "node_modules/core-js/LICENSE" + "licenseFile": "LICENSE" }, "core-util-is@1.0.2": { "licenses": "MIT", @@ -1282,24 +1206,21 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/core-util-is", - "licenseFile": "node_modules/core-util-is/LICENSE" + "licenseFile": "LICENSE" }, "cross-spawn@6.0.5": { "licenses": "MIT", "repository": "https://github.com/moxystudio/node-cross-spawn", "publisher": "André Cruz", "email": "andre@moxy.studio", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/cross-spawn", - "licenseFile": "node_modules/windows-release/node_modules/cross-spawn/LICENSE" + "licenseFile": "LICENSE" }, "cross-spawn@7.0.3": { "licenses": "MIT", "repository": "https://github.com/moxystudio/node-cross-spawn", "publisher": "André Cruz", "email": "andre@moxy.studio", - "path": "/Users/pau/git/moodleapp5/node_modules/cross-spawn", - "licenseFile": "node_modules/cross-spawn/LICENSE" + "licenseFile": "LICENSE" }, "crypto-random-string@2.0.0": { "licenses": "MIT", @@ -1307,8 +1228,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/crypto-random-string", - "licenseFile": "node_modules/crypto-random-string/license" + "licenseFile": "license" }, "currently-unhandled@0.4.1": { "licenses": "MIT", @@ -1316,8 +1236,7 @@ "publisher": "James Talmage", "email": "james@talmage.io", "url": "github.com/jamestalmage", - "path": "/Users/pau/git/moodleapp5/node_modules/currently-unhandled", - "licenseFile": "node_modules/currently-unhandled/license" + "licenseFile": "license" }, "dashdash@1.14.1": { "licenses": "MIT", @@ -1325,22 +1244,26 @@ "publisher": "Trent Mick", "email": "trentm@gmail.com", "url": "http://trentm.com", - "path": "/Users/pau/git/moodleapp5/node_modules/dashdash", - "licenseFile": "node_modules/dashdash/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "debug@2.6.9": { "licenses": "MIT", "repository": "https://github.com/visionmedia/debug", "publisher": "TJ Holowaychuk", "email": "tj@vision-media.ca", - "path": "/Users/pau/git/moodleapp5/node_modules/debug", - "licenseFile": "node_modules/debug/LICENSE" + "licenseFile": "LICENSE" + }, + "debug@4.3.2": { + "licenses": "MIT", + "repository": "https://github.com/visionmedia/debug", + "publisher": "TJ Holowaychuk", + "email": "tj@vision-media.ca", + "licenseFile": "LICENSE" }, "decompress-response@3.3.0": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/decompress-response", - "path": "/Users/pau/git/moodleapp5/node_modules/decompress-response", - "licenseFile": "node_modules/decompress-response/license" + "licenseFile": "license" }, "decompress-response@4.2.1": { "licenses": "MIT", @@ -1348,8 +1271,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/simple-get/node_modules/decompress-response", - "licenseFile": "node_modules/simple-get/node_modules/decompress-response/license" + "licenseFile": "license" }, "dedent@0.7.0": { "licenses": "MIT", @@ -1357,23 +1279,20 @@ "publisher": "Desmond Brand", "email": "dmnd@desmondbrand.com", "url": "http://desmondbrand.com", - "path": "/Users/pau/git/moodleapp5/node_modules/dedent", - "licenseFile": "node_modules/dedent/LICENSE" + "licenseFile": "LICENSE" }, "deep-extend@0.6.0": { "licenses": "MIT", "repository": "https://github.com/unclechu/node-deep-extend", "publisher": "Viacheslav Lotsmanov", "email": "lotsmanov89@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/deep-extend", - "licenseFile": "node_modules/deep-extend/LICENSE" + "licenseFile": "LICENSE" }, "defer-to-connect@1.1.3": { "licenses": "MIT", "repository": "https://github.com/szmarczak/defer-to-connect", "publisher": "Szymon Marczak", - "path": "/Users/pau/git/moodleapp5/node_modules/defer-to-connect", - "licenseFile": "node_modules/defer-to-connect/LICENSE" + "licenseFile": "LICENSE" }, "delayed-stream@1.0.0": { "licenses": "MIT", @@ -1381,30 +1300,26 @@ "publisher": "Felix Geisendörfer", "email": "felix@debuggable.com", "url": "http://debuggable.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/delayed-stream", - "licenseFile": "node_modules/delayed-stream/License" + "licenseFile": "License" }, "delegates@1.0.0": { "licenses": "MIT", "repository": "https://github.com/visionmedia/node-delegates", - "path": "/Users/pau/git/moodleapp5/node_modules/delegates", - "licenseFile": "node_modules/delegates/License" + "licenseFile": "License" }, "dep-graph@1.1.0": { "licenses": "MIT*", "repository": "https://github.com/TrevorBurnham/dep-graph", "publisher": "Trevor Burnham", "url": "http://trevorburnham.com", - "path": "/Users/pau/git/moodleapp5/node_modules/dep-graph", - "licenseFile": "node_modules/dep-graph/README.mdown" + "licenseFile": "README.mdown" }, "depd@1.1.2": { "licenses": "MIT", "repository": "https://github.com/dougwilson/nodejs-depd", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/depd", - "licenseFile": "node_modules/depd/LICENSE" + "licenseFile": "LICENSE" }, "destroy@1.0.4": { "licenses": "MIT", @@ -1412,25 +1327,22 @@ "publisher": "Jonathan Ong", "email": "me@jongleberry.com", "url": "http://jongleberry.com", - "path": "/Users/pau/git/moodleapp5/node_modules/destroy", - "licenseFile": "node_modules/destroy/LICENSE" + "licenseFile": "LICENSE" }, - "detect-indent@6.0.0": { + "detect-indent@6.1.0": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/detect-indent", "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/detect-indent", - "licenseFile": "node_modules/detect-indent/license" + "licenseFile": "license" }, "detect-libc@1.0.3": { "licenses": "Apache-2.0", "repository": "https://github.com/lovell/detect-libc", "publisher": "Lovell Fuller", "email": "npm@lovell.info", - "path": "/Users/pau/git/moodleapp5/node_modules/detect-libc", - "licenseFile": "node_modules/detect-libc/LICENSE" + "licenseFile": "LICENSE" }, "detect-newline@3.1.0": { "licenses": "MIT", @@ -1438,8 +1350,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/detect-newline", - "licenseFile": "node_modules/detect-newline/license" + "licenseFile": "license" }, "dir-glob@3.0.1": { "licenses": "MIT", @@ -1447,8 +1358,7 @@ "publisher": "Kevin Mårtensson", "email": "kevinmartensson@gmail.com", "url": "github.com/kevva", - "path": "/Users/pau/git/moodleapp5/node_modules/dir-glob", - "licenseFile": "node_modules/dir-glob/license" + "licenseFile": "license" }, "dot-prop@4.2.1": { "licenses": "MIT", @@ -1456,8 +1366,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/conf/node_modules/dot-prop", - "licenseFile": "node_modules/conf/node_modules/dot-prop/license" + "licenseFile": "license" }, "dot-prop@5.3.0": { "licenses": "MIT", @@ -1465,8 +1374,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/dot-prop", - "licenseFile": "node_modules/dot-prop/license" + "licenseFile": "license" }, "duplexer3@0.1.4": { "licenses": "BSD-3-Clause", @@ -1474,8 +1382,7 @@ "publisher": "Conrad Pankoff", "email": "deoxxa@fknsrs.biz", "url": "http://www.fknsrs.biz/", - "path": "/Users/pau/git/moodleapp5/node_modules/duplexer3", - "licenseFile": "node_modules/duplexer3/LICENSE.md" + "licenseFile": "LICENSE.md" }, "ecc-jsbn@0.1.2": { "licenses": "MIT", @@ -1483,8 +1390,7 @@ "publisher": "Jeremie Miller", "email": "jeremie@jabber.org", "url": "http://jeremie.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/ecc-jsbn", - "licenseFile": "node_modules/ecc-jsbn/LICENSE" + "licenseFile": "LICENSE" }, "editor@1.0.0": { "licenses": "MIT", @@ -1492,8 +1398,7 @@ "publisher": "James Halliday", "email": "mail@substack.net", "url": "http://substack.net", - "path": "/Users/pau/git/moodleapp5/node_modules/editor", - "licenseFile": "node_modules/editor/LICENSE" + "licenseFile": "LICENSE" }, "ee-first@1.1.1": { "licenses": "MIT", @@ -1501,15 +1406,13 @@ "publisher": "Jonathan Ong", "email": "me@jongleberry.com", "url": "http://jongleberry.com", - "path": "/Users/pau/git/moodleapp5/node_modules/ee-first", - "licenseFile": "node_modules/ee-first/LICENSE" + "licenseFile": "LICENSE" }, "elementtree@0.1.7": { "licenses": "Apache-2.0", "repository": "https://github.com/racker/node-elementtree", "publisher": "Rackspace US, Inc.", - "path": "/Users/pau/git/moodleapp5/node_modules/elementtree", - "licenseFile": "node_modules/elementtree/LICENSE.txt", + "licenseFile": "LICENSE.txt", "noticeFile": "node_modules/elementtree/NOTICE" }, "emoji-regex@7.0.3": { @@ -1517,38 +1420,39 @@ "repository": "https://github.com/mathiasbynens/emoji-regex", "publisher": "Mathias Bynens", "url": "https://mathiasbynens.be/", - "path": "/Users/pau/git/moodleapp5/node_modules/emoji-regex", - "licenseFile": "node_modules/emoji-regex/LICENSE-MIT.txt" + "licenseFile": "LICENSE-MIT.txt" }, "emoji-regex@8.0.0": { "licenses": "MIT", "repository": "https://github.com/mathiasbynens/emoji-regex", "publisher": "Mathias Bynens", "url": "https://mathiasbynens.be/", - "path": "/Users/pau/git/moodleapp5/node_modules/boxen/node_modules/emoji-regex", - "licenseFile": "node_modules/boxen/node_modules/emoji-regex/LICENSE-MIT.txt" + "licenseFile": "LICENSE-MIT.txt" }, "encodeurl@1.0.2": { "licenses": "MIT", "repository": "https://github.com/pillarjs/encodeurl", - "path": "/Users/pau/git/moodleapp5/node_modules/encodeurl", - "licenseFile": "node_modules/encodeurl/LICENSE" + "licenseFile": "LICENSE" + }, + "encoding@0.1.13": { + "licenses": "MIT", + "repository": "https://github.com/andris9/encoding", + "publisher": "Andris Reinman", + "licenseFile": "LICENSE" }, "end-of-stream@1.4.4": { "licenses": "MIT", "repository": "https://github.com/mafintosh/end-of-stream", "publisher": "Mathias Buus", "email": "mathiasbuus@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/end-of-stream", - "licenseFile": "node_modules/end-of-stream/LICENSE" + "licenseFile": "LICENSE" }, "endent@1.4.1": { "licenses": "MIT", "repository": "https://github.com/ZhouHansen/endent", "publisher": "zhouhancheng", "email": "z308114274@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/endent", - "licenseFile": "node_modules/endent/LICENSE" + "licenseFile": "LICENSE" }, "env-paths@1.0.0": { "licenses": "MIT", @@ -1556,14 +1460,28 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/env-paths", - "licenseFile": "node_modules/env-paths/license" + "licenseFile": "license" + }, + "env-paths@2.2.1": { + "licenses": "MIT", + "repository": "https://github.com/sindresorhus/env-paths", + "publisher": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com", + "licenseFile": "license" + }, + "err-code@2.0.3": { + "licenses": "MIT", + "repository": "https://github.com/IndigoUnited/js-err-code", + "publisher": "IndigoUnited", + "email": "hello@indigounited.com", + "url": "http://indigounited.com", + "licenseFile": "README.md" }, "es6-promise-plugin@4.2.2": { "licenses": "MIT", "repository": "https://github.com/vstirbu/PromisesPlugin", - "path": "/Users/pau/git/moodleapp5/node_modules/es6-promise-plugin", - "licenseFile": "node_modules/es6-promise-plugin/LICENSE" + "licenseFile": "LICENSE" }, "escape-goat@2.1.1": { "licenses": "MIT", @@ -1571,14 +1489,12 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/escape-goat", - "licenseFile": "node_modules/escape-goat/license" + "licenseFile": "license" }, "escape-html@1.0.3": { "licenses": "MIT", "repository": "https://github.com/component/escape-html", - "path": "/Users/pau/git/moodleapp5/node_modules/escape-html", - "licenseFile": "node_modules/escape-html/LICENSE" + "licenseFile": "LICENSE" }, "escape-string-regexp@1.0.5": { "licenses": "MIT", @@ -1586,14 +1502,12 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/escape-string-regexp", - "licenseFile": "node_modules/escape-string-regexp/license" + "licenseFile": "license" }, "etag@1.8.1": { "licenses": "MIT", "repository": "https://github.com/jshttp/etag", - "path": "/Users/pau/git/moodleapp5/node_modules/etag", - "licenseFile": "node_modules/etag/LICENSE" + "licenseFile": "LICENSE" }, "execa@1.0.0": { "licenses": "MIT", @@ -1601,8 +1515,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/execa", - "licenseFile": "node_modules/windows-release/node_modules/execa/license" + "licenseFile": "license" }, "execa@4.0.3": { "licenses": "MIT", @@ -1610,24 +1523,21 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/execa", - "licenseFile": "node_modules/execa/license" + "licenseFile": "license" }, "expand-template@2.0.3": { "licenses": "(MIT OR WTFPL)", "repository": "https://github.com/ralphtheninja/expand-template", "publisher": "LM", "email": "ralphtheninja@riseup.net", - "path": "/Users/pau/git/moodleapp5/node_modules/expand-template", - "licenseFile": "node_modules/expand-template/LICENSE" + "licenseFile": "LICENSE" }, "express@4.17.1": { "licenses": "MIT", "repository": "https://github.com/expressjs/express", "publisher": "TJ Holowaychuk", "email": "tj@vision-media.ca", - "path": "/Users/pau/git/moodleapp5/node_modules/express", - "licenseFile": "node_modules/express/LICENSE" + "licenseFile": "LICENSE" }, "extend@3.0.2": { "licenses": "MIT", @@ -1635,8 +1545,7 @@ "publisher": "Stefan Thomas", "email": "justmoon@members.fsf.org", "url": "http://www.justmoon.net", - "path": "/Users/pau/git/moodleapp5/node_modules/extend", - "licenseFile": "node_modules/extend/LICENSE" + "licenseFile": "LICENSE" }, "external-editor@3.1.0": { "licenses": "MIT", @@ -1644,43 +1553,37 @@ "publisher": "Kevin Gravier", "email": "kevin@mrkmg.com", "url": "https://mrkmg.com", - "path": "/Users/pau/git/moodleapp5/node_modules/external-editor", - "licenseFile": "node_modules/external-editor/LICENSE" + "licenseFile": "LICENSE" }, "extsprintf@1.3.0": { "licenses": "MIT", "repository": "https://github.com/davepacheco/node-extsprintf", - "path": "/Users/pau/git/moodleapp5/node_modules/jsprim/node_modules/extsprintf", - "licenseFile": "node_modules/jsprim/node_modules/extsprintf/LICENSE" + "licenseFile": "LICENSE" }, "extsprintf@1.4.0": { "licenses": "MIT", "repository": "https://github.com/davepacheco/node-extsprintf", - "path": "/Users/pau/git/moodleapp5/node_modules/extsprintf", - "licenseFile": "node_modules/extsprintf/LICENSE" + "licenseFile": "LICENSE" }, "fast-deep-equal@3.1.3": { "licenses": "MIT", "repository": "https://github.com/epoberezkin/fast-deep-equal", "publisher": "Evgeny Poberezkin", - "path": "/Users/pau/git/moodleapp5/node_modules/fast-deep-equal", - "licenseFile": "node_modules/fast-deep-equal/LICENSE" + "licenseFile": "LICENSE" }, "fast-glob@3.2.4": { "licenses": "MIT", "repository": "https://github.com/mrmlnc/fast-glob", "publisher": "Denis Malinochkin", "url": "https://mrmlnc.com", - "path": "/Users/pau/git/moodleapp5/node_modules/fast-glob", - "licenseFile": "node_modules/fast-glob/LICENSE" + "licenseFile": "LICENSE" }, "fast-json-parse@1.0.3": { "licenses": "MIT", "repository": "https://github.com/mcollina/fast-json-parse", "publisher": "Matteo Collina", "email": "hello@matteocollina.com", - "path": "/Users/pau/git/moodleapp5/node_modules/fast-json-parse", - "licenseFile": "node_modules/fast-json-parse/LICENSE" + "licenseFile": "LICENSE" }, "fast-json-stable-stringify@2.1.0": { "licenses": "MIT", @@ -1688,16 +1591,14 @@ "publisher": "James Halliday", "email": "mail@substack.net", "url": "http://substack.net", - "path": "/Users/pau/git/moodleapp5/node_modules/fast-json-stable-stringify", - "licenseFile": "node_modules/fast-json-stable-stringify/LICENSE" + "licenseFile": "LICENSE" }, "fastq@1.8.0": { "licenses": "ISC", "repository": "https://github.com/mcollina/fastq", "publisher": "Matteo Collina", "email": "hello@matteocollina.com", - "path": "/Users/pau/git/moodleapp5/node_modules/fastq", - "licenseFile": "node_modules/fastq/LICENSE" + "licenseFile": "LICENSE" }, "figures@2.0.0": { "licenses": "MIT", @@ -1705,24 +1606,21 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/figures", - "licenseFile": "node_modules/figures/license" + "licenseFile": "license" }, "fill-range@7.0.1": { "licenses": "MIT", "repository": "https://github.com/jonschlinkert/fill-range", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/fill-range", - "licenseFile": "node_modules/fill-range/LICENSE" + "licenseFile": "LICENSE" }, "finalhandler@1.1.2": { "licenses": "MIT", "repository": "https://github.com/pillarjs/finalhandler", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/finalhandler", - "licenseFile": "node_modules/finalhandler/LICENSE" + "licenseFile": "LICENSE" }, "find-up@2.1.0": { "licenses": "MIT", @@ -1730,8 +1628,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/find-up", - "licenseFile": "node_modules/find-up/license" + "licenseFile": "license" }, "forever-agent@0.6.1": { "licenses": "Apache-2.0", @@ -1739,8 +1636,7 @@ "publisher": "Mikeal Rogers", "email": "mikeal.rogers@gmail.com", "url": "http://www.futurealoof.com", - "path": "/Users/pau/git/moodleapp5/node_modules/forever-agent", - "licenseFile": "node_modules/forever-agent/LICENSE" + "licenseFile": "LICENSE" }, "form-data@2.3.3": { "licenses": "MIT", @@ -1748,14 +1644,12 @@ "publisher": "Felix Geisendörfer", "email": "felix@debuggable.com", "url": "http://debuggable.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/form-data", - "licenseFile": "node_modules/form-data/License" + "licenseFile": "License" }, "forwarded@0.1.2": { "licenses": "MIT", "repository": "https://github.com/jshttp/forwarded", - "path": "/Users/pau/git/moodleapp5/node_modules/forwarded", - "licenseFile": "node_modules/forwarded/LICENSE" + "licenseFile": "LICENSE" }, "fresh@0.5.2": { "licenses": "MIT", @@ -1763,24 +1657,29 @@ "publisher": "TJ Holowaychuk", "email": "tj@vision-media.ca", "url": "http://tjholowaychuk.com", - "path": "/Users/pau/git/moodleapp5/node_modules/fresh", - "licenseFile": "node_modules/fresh/LICENSE" + "licenseFile": "LICENSE" }, "fs-constants@1.0.0": { "licenses": "MIT", "repository": "https://github.com/mafintosh/fs-constants", "publisher": "Mathias Buus", "url": "@mafintosh", - "path": "/Users/pau/git/moodleapp5/node_modules/fs-constants", - "licenseFile": "node_modules/fs-constants/LICENSE" + "licenseFile": "LICENSE" }, "fs-extra@9.1.0": { "licenses": "MIT", "repository": "https://github.com/jprichardson/node-fs-extra", "publisher": "JP Richardson", "email": "jprichardson@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/fs-extra", - "licenseFile": "node_modules/fs-extra/LICENSE" + "licenseFile": "LICENSE" + }, + "fs-minipass@2.1.0": { + "licenses": "ISC", + "repository": "https://github.com/npm/fs-minipass", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" }, "fs.realpath@1.0.0": { "licenses": "ISC", @@ -1788,16 +1687,14 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/fs.realpath", - "licenseFile": "node_modules/fs.realpath/LICENSE" + "licenseFile": "LICENSE" }, "gauge@2.7.4": { "licenses": "ISC", "repository": "https://github.com/iarna/gauge", "publisher": "Rebecca Turner", "email": "me@re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/gauge", - "licenseFile": "node_modules/gauge/LICENSE" + "licenseFile": "LICENSE" }, "get-stream@4.1.0": { "licenses": "MIT", @@ -1805,8 +1702,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/get-stream", - "licenseFile": "node_modules/windows-release/node_modules/get-stream/license" + "licenseFile": "license" }, "get-stream@5.2.0": { "licenses": "MIT", @@ -1814,16 +1710,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/get-stream", - "licenseFile": "node_modules/get-stream/license" + "licenseFile": "license" }, "getpass@0.1.7": { "licenses": "MIT", "repository": "https://github.com/arekinath/node-getpass", "publisher": "Alex Wilson", "email": "alex.wilson@joyent.com", - "path": "/Users/pau/git/moodleapp5/node_modules/getpass", - "licenseFile": "node_modules/getpass/LICENSE" + "licenseFile": "LICENSE" }, "github-from-package@0.0.0": { "licenses": "MIT", @@ -1831,8 +1725,7 @@ "publisher": "James Halliday", "email": "mail@substack.net", "url": "http://substack.net", - "path": "/Users/pau/git/moodleapp5/node_modules/github-from-package", - "licenseFile": "node_modules/github-from-package/LICENSE" + "licenseFile": "LICENSE" }, "glob-parent@5.1.1": { "licenses": "ISC", @@ -1840,8 +1733,7 @@ "publisher": "Gulp Team", "email": "team@gulpjs.com", "url": "https://gulpjs.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/glob-parent", - "licenseFile": "node_modules/glob-parent/LICENSE" + "licenseFile": "LICENSE" }, "glob@7.1.6": { "licenses": "ISC", @@ -1849,17 +1741,15 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/glob", - "licenseFile": "node_modules/glob/LICENSE" + "licenseFile": "LICENSE" }, - "global-dirs@2.0.1": { + "global-dirs@2.1.0": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/global-dirs", "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/global-dirs", - "licenseFile": "node_modules/global-dirs/license" + "url": "https://sindresorhus.com", + "licenseFile": "license" }, "globby@11.0.1": { "licenses": "MIT", @@ -1867,20 +1757,24 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/globby", - "licenseFile": "node_modules/globby/license" + "licenseFile": "license" }, "got@9.6.0": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/got", - "path": "/Users/pau/git/moodleapp5/node_modules/got", - "licenseFile": "node_modules/got/license" + "licenseFile": "license" }, "graceful-fs@4.2.4": { "licenses": "ISC", "repository": "https://github.com/isaacs/node-graceful-fs", - "path": "/Users/pau/git/moodleapp5/node_modules/graceful-fs", - "licenseFile": "node_modules/graceful-fs/LICENSE" + "licenseFile": "LICENSE" + }, + "hammerjs@2.0.8": { + "licenses": "MIT", + "repository": "https://github.com/hammerjs/hammer.js", + "publisher": "Jorik Tangelder", + "email": "j.tangelder@gmail.com", + "licenseFile": "LICENSE.md" }, "har-schema@2.0.0": { "licenses": "ISC", @@ -1888,8 +1782,7 @@ "publisher": "Ahmad Nassri", "email": "ahmad@ahmadnassri.com", "url": "https://www.ahmadnassri.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/har-schema", - "licenseFile": "node_modules/har-schema/LICENSE" + "licenseFile": "LICENSE" }, "har-validator@5.1.5": { "licenses": "MIT", @@ -1897,8 +1790,7 @@ "publisher": "Ahmad Nassri", "email": "ahmad@ahmadnassri.com", "url": "https://www.ahmadnassri.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/har-validator", - "licenseFile": "node_modules/har-validator/LICENSE" + "licenseFile": "LICENSE" }, "has-flag@3.0.0": { "licenses": "MIT", @@ -1906,8 +1798,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/insight/node_modules/has-flag", - "licenseFile": "node_modules/insight/node_modules/has-flag/license" + "licenseFile": "license" }, "has-flag@4.0.0": { "licenses": "MIT", @@ -1915,16 +1806,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/has-flag", - "licenseFile": "node_modules/has-flag/license" + "licenseFile": "license" }, "has-unicode@2.0.1": { "licenses": "ISC", "repository": "https://github.com/iarna/has-unicode", "publisher": "Rebecca Turner", "email": "me@re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/has-unicode", - "licenseFile": "node_modules/has-unicode/LICENSE" + "licenseFile": "LICENSE" }, "has-yarn@2.1.0": { "licenses": "MIT", @@ -1932,8 +1821,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/has-yarn", - "licenseFile": "node_modules/has-yarn/license" + "licenseFile": "license" }, "hosted-git-info@2.8.8": { "licenses": "ISC", @@ -1941,8 +1829,15 @@ "publisher": "Rebecca Turner", "email": "me@re-becca.org", "url": "http://re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/init-package-json/node_modules/hosted-git-info", - "licenseFile": "node_modules/init-package-json/node_modules/hosted-git-info/LICENSE" + "licenseFile": "LICENSE" + }, + "hosted-git-info@2.8.9": { + "licenses": "ISC", + "repository": "https://github.com/npm/hosted-git-info", + "publisher": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org", + "licenseFile": "LICENSE" }, "hosted-git-info@3.0.5": { "licenses": "ISC", @@ -1950,8 +1845,15 @@ "publisher": "Rebecca Turner", "email": "me@re-becca.org", "url": "http://re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/hosted-git-info", - "licenseFile": "node_modules/hosted-git-info/LICENSE" + "licenseFile": "LICENSE" + }, + "hosted-git-info@4.0.2": { + "licenses": "ISC", + "repository": "https://github.com/npm/hosted-git-info", + "publisher": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org", + "licenseFile": "LICENSE" }, "http-cache-semantics@4.1.0": { "licenses": "BSD-2-Clause", @@ -1959,8 +1861,7 @@ "publisher": "Kornel Lesiński", "email": "kornel@geekhood.net", "url": "https://kornel.ski/", - "path": "/Users/pau/git/moodleapp5/node_modules/http-cache-semantics", - "licenseFile": "node_modules/http-cache-semantics/LICENSE" + "licenseFile": "LICENSE" }, "http-errors@1.7.2": { "licenses": "MIT", @@ -1968,15 +1869,29 @@ "publisher": "Jonathan Ong", "email": "me@jongleberry.com", "url": "http://jongleberry.com", - "path": "/Users/pau/git/moodleapp5/node_modules/http-errors", - "licenseFile": "node_modules/http-errors/LICENSE" + "licenseFile": "LICENSE" + }, + "http-proxy-agent@4.0.1": { + "licenses": "MIT", + "repository": "https://github.com/TooTallNate/node-http-proxy-agent", + "publisher": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/", + "licenseFile": "README.md" }, "http-signature@1.2.0": { "licenses": "MIT", "repository": "https://github.com/joyent/node-http-signature", "publisher": "Joyent, Inc", - "path": "/Users/pau/git/moodleapp5/node_modules/http-signature", - "licenseFile": "node_modules/http-signature/LICENSE" + "licenseFile": "LICENSE" + }, + "https-proxy-agent@5.0.0": { + "licenses": "MIT", + "repository": "https://github.com/TooTallNate/node-https-proxy-agent", + "publisher": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/", + "licenseFile": "README.md" }, "human-signals@1.1.1": { "licenses": "Apache-2.0", @@ -1984,16 +1899,29 @@ "publisher": "ehmicky", "email": "ehmicky@gmail.com", "url": "https://github.com/ehmicky", - "path": "/Users/pau/git/moodleapp5/node_modules/human-signals", - "licenseFile": "node_modules/human-signals/LICENSE" + "licenseFile": "LICENSE" + }, + "humanize-ms@1.2.1": { + "licenses": "MIT", + "repository": "https://github.com/node-modules/humanize-ms", + "publisher": "dead-horse", + "email": "dead_horse@qq.com", + "url": "http://deadhorse.me", + "licenseFile": "LICENSE" }, "iconv-lite@0.4.24": { "licenses": "MIT", "repository": "https://github.com/ashtuchkin/iconv-lite", "publisher": "Alexander Shtuchkin", "email": "ashtuchkin@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/iconv-lite", - "licenseFile": "node_modules/iconv-lite/LICENSE" + "licenseFile": "LICENSE" + }, + "iconv-lite@0.6.2": { + "licenses": "MIT", + "repository": "https://github.com/ashtuchkin/iconv-lite", + "publisher": "Alexander Shtuchkin", + "email": "ashtuchkin@gmail.com", + "licenseFile": "LICENSE" }, "ieee754@1.1.13": { "licenses": "BSD-3-Clause", @@ -2001,21 +1929,26 @@ "publisher": "Feross Aboukhadijeh", "email": "feross@feross.org", "url": "http://feross.org", - "path": "/Users/pau/git/moodleapp5/node_modules/ieee754", - "licenseFile": "node_modules/ieee754/LICENSE" + "licenseFile": "LICENSE" + }, + "ignore-walk@3.0.3": { + "licenses": "ISC", + "repository": "https://github.com/isaacs/ignore-walk", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" }, "ignore@5.1.8": { "licenses": "MIT", "repository": "https://github.com/kaelzhang/node-ignore", "publisher": "kael", - "path": "/Users/pau/git/moodleapp5/node_modules/ignore", - "licenseFile": "node_modules/ignore/LICENSE-MIT" + "licenseFile": "LICENSE-MIT" }, "immediate@3.0.6": { "licenses": "MIT", "repository": "https://github.com/calvinmetcalf/immediate", - "path": "/Users/pau/git/moodleapp5/node_modules/immediate", - "licenseFile": "node_modules/immediate/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "import-fresh@3.2.1": { "licenses": "MIT", @@ -2023,8 +1956,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/import-fresh", - "licenseFile": "node_modules/import-fresh/license" + "licenseFile": "license" }, "import-lazy@2.1.0": { "licenses": "MIT", @@ -2032,8 +1964,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/import-lazy", - "licenseFile": "node_modules/import-lazy/license" + "licenseFile": "license" }, "imurmurhash@0.1.4": { "licenses": "MIT", @@ -2041,8 +1972,23 @@ "publisher": "Jens Taylor", "email": "jensyt@gmail.com", "url": "https://github.com/homebrewing", - "path": "/Users/pau/git/moodleapp5/node_modules/imurmurhash", - "licenseFile": "node_modules/imurmurhash/README.md" + "licenseFile": "README.md" + }, + "indent-string@4.0.0": { + "licenses": "MIT", + "repository": "https://github.com/sindresorhus/indent-string", + "publisher": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "sindresorhus.com", + "licenseFile": "license" + }, + "infer-owner@1.0.4": { + "licenses": "ISC", + "repository": "https://github.com/npm/infer-owner", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" }, "inflight@1.0.6": { "licenses": "ISC", @@ -2050,20 +1996,17 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/inflight", - "licenseFile": "node_modules/inflight/LICENSE" + "licenseFile": "LICENSE" }, "inherits@2.0.3": { "licenses": "ISC", "repository": "https://github.com/isaacs/inherits", - "path": "/Users/pau/git/moodleapp5/node_modules/http-errors/node_modules/inherits", - "licenseFile": "node_modules/http-errors/node_modules/inherits/LICENSE" + "licenseFile": "LICENSE" }, "inherits@2.0.4": { "licenses": "ISC", "repository": "https://github.com/isaacs/inherits", - "path": "/Users/pau/git/moodleapp5/node_modules/inherits", - "licenseFile": "node_modules/inherits/LICENSE" + "licenseFile": "LICENSE" }, "ini@1.3.5": { "licenses": "ISC", @@ -2071,8 +2014,15 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/ini", - "licenseFile": "node_modules/ini/LICENSE" + "licenseFile": "LICENSE" + }, + "ini@1.3.7": { + "licenses": "ISC", + "repository": "https://github.com/isaacs/ini", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" }, "init-package-json@1.10.3": { "licenses": "ISC", @@ -2080,16 +2030,14 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/init-package-json", - "licenseFile": "node_modules/init-package-json/LICENSE" + "licenseFile": "LICENSE" }, "inquirer@6.5.2": { "licenses": "MIT", "repository": "https://github.com/SBoudrias/Inquirer.js", "publisher": "Simon Boudrias", "email": "admin@simonboudrias.com", - "path": "/Users/pau/git/moodleapp5/node_modules/inquirer", - "licenseFile": "node_modules/inquirer/LICENSE" + "licenseFile": "LICENSE" }, "insight@0.10.3": { "licenses": "BSD-2-Clause", @@ -2097,31 +2045,20 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/insight", - "licenseFile": "node_modules/insight/license" - }, - "install@0.8.9": { - "licenses": "MIT", - "repository": "https://github.com/benjamn/install", - "publisher": "Ben Newman", - "email": "bn@cs.stanford.edu", - "path": "/Users/pau/git/moodleapp5/node_modules/install", - "licenseFile": "node_modules/install/LICENSE" + "licenseFile": "license" }, "ionicons@5.5.1": { "licenses": "MIT", "repository": "https://github.com/ionic-team/ionicons", "publisher": "Ben Sperry", "url": "https://twitter.com/benjsperry", - "path": "/Users/pau/git/moodleapp5/node_modules/ionicons", - "licenseFile": "node_modules/ionicons/LICENSE" + "licenseFile": "LICENSE" }, "ios-sim@8.0.2": { "licenses": "MIT", "repository": "https://github.com/ios-control/ios-sim", "publisher": "Shazron Abdullah", - "path": "/Users/pau/git/moodleapp5/node_modules/ios-sim", - "licenseFile": "node_modules/ios-sim/LICENSE" + "licenseFile": "LICENSE" }, "ip-regex@2.1.0": { "licenses": "MIT", @@ -2129,16 +2066,21 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/ip-regex", - "licenseFile": "node_modules/ip-regex/license" + "licenseFile": "license" + }, + "ip@1.1.5": { + "licenses": "MIT", + "repository": "https://github.com/indutny/node-ip", + "publisher": "Fedor Indutny", + "email": "fedor@indutny.com", + "licenseFile": "README.md" }, "ipaddr.js@1.9.1": { "licenses": "MIT", "repository": "https://github.com/whitequark/ipaddr.js", "publisher": "whitequark", "email": "whitequark@whitequark.org", - "path": "/Users/pau/git/moodleapp5/node_modules/ipaddr.js", - "licenseFile": "node_modules/ipaddr.js/LICENSE" + "licenseFile": "LICENSE" }, "is-ci@2.0.0": { "licenses": "MIT", @@ -2146,8 +2088,7 @@ "publisher": "Thomas Watson Steen", "email": "w@tson.dk", "url": "https://twitter.com/wa7son", - "path": "/Users/pau/git/moodleapp5/node_modules/is-ci", - "licenseFile": "node_modules/is-ci/LICENSE" + "licenseFile": "LICENSE" }, "is-docker@2.1.1": { "licenses": "MIT", @@ -2155,16 +2096,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-docker", - "licenseFile": "node_modules/is-docker/license" + "licenseFile": "license" }, "is-extglob@2.1.1": { "licenses": "MIT", "repository": "https://github.com/jonschlinkert/is-extglob", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/is-extglob", - "licenseFile": "node_modules/is-extglob/LICENSE" + "licenseFile": "LICENSE" }, "is-fullwidth-code-point@1.0.0": { "licenses": "MIT", @@ -2172,8 +2111,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/gauge/node_modules/is-fullwidth-code-point", - "licenseFile": "node_modules/gauge/node_modules/is-fullwidth-code-point/license" + "licenseFile": "license" }, "is-fullwidth-code-point@2.0.0": { "licenses": "MIT", @@ -2181,8 +2119,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-fullwidth-code-point", - "licenseFile": "node_modules/is-fullwidth-code-point/license" + "licenseFile": "license" }, "is-fullwidth-code-point@3.0.0": { "licenses": "MIT", @@ -2190,16 +2127,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/boxen/node_modules/is-fullwidth-code-point", - "licenseFile": "node_modules/boxen/node_modules/is-fullwidth-code-point/license" + "licenseFile": "license" }, "is-glob@4.0.1": { "licenses": "MIT", "repository": "https://github.com/micromatch/is-glob", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/is-glob", - "licenseFile": "node_modules/is-glob/LICENSE" + "licenseFile": "LICENSE" }, "is-installed-globally@0.3.2": { "licenses": "MIT", @@ -2207,8 +2142,15 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-installed-globally", - "licenseFile": "node_modules/is-installed-globally/license" + "licenseFile": "license" + }, + "is-lambda@1.0.1": { + "licenses": "MIT", + "repository": "https://github.com/watson/is-lambda", + "publisher": "Thomas Watson Steen", + "email": "w@tson.dk", + "url": "https://twitter.com/wa7son", + "licenseFile": "LICENSE" }, "is-npm@4.0.0": { "licenses": "MIT", @@ -2216,16 +2158,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-npm", - "licenseFile": "node_modules/is-npm/license" + "licenseFile": "license" }, "is-number@7.0.0": { "licenses": "MIT", "repository": "https://github.com/jonschlinkert/is-number", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/is-number", - "licenseFile": "node_modules/is-number/LICENSE" + "licenseFile": "LICENSE" }, "is-obj@1.0.1": { "licenses": "MIT", @@ -2233,8 +2173,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/conf/node_modules/is-obj", - "licenseFile": "node_modules/conf/node_modules/is-obj/license" + "licenseFile": "license" }, "is-obj@2.0.0": { "licenses": "MIT", @@ -2242,8 +2181,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-obj", - "licenseFile": "node_modules/is-obj/license" + "licenseFile": "license" }, "is-path-inside@3.0.2": { "licenses": "MIT", @@ -2251,8 +2189,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-path-inside", - "licenseFile": "node_modules/is-path-inside/license" + "licenseFile": "license" }, "is-stream@1.1.0": { "licenses": "MIT", @@ -2260,8 +2197,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/is-stream", - "licenseFile": "node_modules/windows-release/node_modules/is-stream/license" + "licenseFile": "license" }, "is-stream@2.0.0": { "licenses": "MIT", @@ -2269,8 +2205,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-stream", - "licenseFile": "node_modules/is-stream/license" + "licenseFile": "license" }, "is-typedarray@1.0.0": { "licenses": "MIT", @@ -2278,8 +2213,7 @@ "publisher": "Hugh Kennedy", "email": "hughskennedy@gmail.com", "url": "http://hughsk.io/", - "path": "/Users/pau/git/moodleapp5/node_modules/is-typedarray", - "licenseFile": "node_modules/is-typedarray/LICENSE.md" + "licenseFile": "LICENSE.md" }, "is-wsl@2.2.0": { "licenses": "MIT", @@ -2287,16 +2221,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-wsl", - "licenseFile": "node_modules/is-wsl/license" + "licenseFile": "license" }, "is-yarn-global@0.3.0": { "licenses": "MIT", "repository": "https://github.com/LitoMore/is-yarn-global", "publisher": "LitoMore", "url": "litomore@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/is-yarn-global", - "licenseFile": "node_modules/is-yarn-global/LICENSE" + "licenseFile": "LICENSE" }, "isarray@1.0.0": { "licenses": "MIT", @@ -2304,8 +2236,7 @@ "publisher": "Julian Gruber", "email": "mail@juliangruber.com", "url": "http://juliangruber.com", - "path": "/Users/pau/git/moodleapp5/node_modules/isarray", - "licenseFile": "node_modules/isarray/README.md" + "licenseFile": "README.md" }, "isexe@2.0.0": { "licenses": "ISC", @@ -2313,31 +2244,27 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/isexe", - "licenseFile": "node_modules/isexe/LICENSE" + "licenseFile": "LICENSE" }, "isobject@4.0.0": { "licenses": "MIT", "repository": "https://github.com/jonschlinkert/isobject", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/isobject", - "licenseFile": "node_modules/isobject/LICENSE" + "licenseFile": "LICENSE" }, "isstream@0.1.2": { "licenses": "MIT", "repository": "https://github.com/rvagg/isstream", "publisher": "Rod Vagg", "email": "rod@vagg.org", - "path": "/Users/pau/git/moodleapp5/node_modules/isstream", - "licenseFile": "node_modules/isstream/LICENSE.md" + "licenseFile": "LICENSE.md" }, "jsbn@0.1.1": { "licenses": "MIT", "repository": "https://github.com/andyperlitch/jsbn", "publisher": "Tom Wu", - "path": "/Users/pau/git/moodleapp5/node_modules/jsbn", - "licenseFile": "node_modules/jsbn/LICENSE" + "licenseFile": "LICENSE" }, "json-buffer@3.0.0": { "licenses": "MIT", @@ -2345,23 +2272,20 @@ "publisher": "Dominic Tarr", "email": "dominic.tarr@gmail.com", "url": "http://dominictarr.com", - "path": "/Users/pau/git/moodleapp5/node_modules/json-buffer", - "licenseFile": "node_modules/json-buffer/LICENSE" + "licenseFile": "LICENSE" }, "json-parse-even-better-errors@2.3.1": { "licenses": "MIT", "repository": "https://github.com/npm/json-parse-even-better-errors", "publisher": "Kat Marchán", "email": "kzm@zkat.tech", - "path": "/Users/pau/git/moodleapp5/node_modules/json-parse-even-better-errors", - "licenseFile": "node_modules/json-parse-even-better-errors/LICENSE.md" + "licenseFile": "LICENSE.md" }, "json-schema-traverse@0.4.1": { "licenses": "MIT", "repository": "https://github.com/epoberezkin/json-schema-traverse", "publisher": "Evgeny Poberezkin", - "path": "/Users/pau/git/moodleapp5/node_modules/json-schema-traverse", - "licenseFile": "node_modules/json-schema-traverse/LICENSE" + "licenseFile": "LICENSE" }, "json-schema@0.2.3": { "licenses": [ @@ -2370,8 +2294,7 @@ ], "repository": "https://github.com/kriszyp/json-schema", "publisher": "Kris Zyp", - "path": "/Users/pau/git/moodleapp5/node_modules/json-schema", - "licenseFile": "node_modules/json-schema/README.md" + "licenseFile": "README.md" }, "json-stringify-safe@5.0.1": { "licenses": "ISC", @@ -2379,36 +2302,38 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me", - "path": "/Users/pau/git/moodleapp5/node_modules/json-stringify-safe", - "licenseFile": "node_modules/json-stringify-safe/LICENSE" + "licenseFile": "LICENSE" }, "jsonfile@6.1.0": { "licenses": "MIT", "repository": "https://github.com/jprichardson/node-jsonfile", "publisher": "JP Richardson", "email": "jprichardson@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/jsonfile", - "licenseFile": "node_modules/jsonfile/LICENSE" + "licenseFile": "LICENSE" + }, + "jsonparse@1.3.1": { + "licenses": "MIT", + "repository": "https://github.com/creationix/jsonparse", + "publisher": "Tim Caswell", + "email": "tim@creationix.com", + "licenseFile": "LICENSE" }, "jsprim@1.4.1": { "licenses": "MIT", "repository": "https://github.com/joyent/node-jsprim", - "path": "/Users/pau/git/moodleapp5/node_modules/jsprim", - "licenseFile": "node_modules/jsprim/LICENSE" + "licenseFile": "LICENSE" }, "jszip@3.5.0": { "licenses": "(MIT OR GPL-3.0)", "repository": "https://github.com/Stuk/jszip", "publisher": "Stuart Knightley", "email": "stuart@stuartk.com", - "path": "/Users/pau/git/moodleapp5/node_modules/jszip", - "licenseFile": "node_modules/jszip/LICENSE.markdown" + "licenseFile": "LICENSE.markdown" }, "keytar@7.2.0": { "licenses": "MIT", "repository": "https://github.com/atom/node-keytar", - "path": "/Users/pau/git/moodleapp5/node_modules/keytar", - "licenseFile": "node_modules/keytar/LICENSE.md" + "licenseFile": "LICENSE.md" }, "keyv@3.1.0": { "licenses": "MIT", @@ -2416,8 +2341,7 @@ "publisher": "Luke Childs", "email": "lukechilds123@gmail.com", "url": "http://lukechilds.co.uk", - "path": "/Users/pau/git/moodleapp5/node_modules/keyv", - "licenseFile": "node_modules/keyv/LICENSE" + "licenseFile": "LICENSE" }, "latest-version@5.1.0": { "licenses": "MIT", @@ -2425,14 +2349,12 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/latest-version", - "licenseFile": "node_modules/latest-version/license" + "licenseFile": "license" }, "lie@3.3.0": { "licenses": "MIT", "repository": "https://github.com/calvinmetcalf/lie", - "path": "/Users/pau/git/moodleapp5/node_modules/lie", - "licenseFile": "node_modules/lie/license.md" + "licenseFile": "license.md" }, "locate-path@2.0.0": { "licenses": "MIT", @@ -2440,8 +2362,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/locate-path", - "licenseFile": "node_modules/locate-path/license" + "licenseFile": "license" }, "lodash.debounce@4.0.8": { "licenses": "MIT", @@ -2449,16 +2370,14 @@ "publisher": "John-David Dalton", "email": "john.david.dalton@gmail.com", "url": "http://allyoucanleet.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/lodash.debounce", - "licenseFile": "node_modules/lodash.debounce/LICENSE" + "licenseFile": "LICENSE" }, "lodash@4.17.20": { "licenses": "MIT", "repository": "https://github.com/lodash/lodash", "publisher": "John-David Dalton", "email": "john.david.dalton@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/lodash", - "licenseFile": "node_modules/lodash/LICENSE" + "licenseFile": "LICENSE" }, "loud-rejection@2.2.0": { "licenses": "MIT", @@ -2466,8 +2385,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/loud-rejection", - "licenseFile": "node_modules/loud-rejection/license" + "licenseFile": "license" }, "lowercase-keys@1.0.1": { "licenses": "MIT", @@ -2475,8 +2393,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/lowercase-keys", - "licenseFile": "node_modules/lowercase-keys/license" + "licenseFile": "license" }, "lowercase-keys@2.0.0": { "licenses": "MIT", @@ -2484,16 +2401,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cacheable-request/node_modules/lowercase-keys", - "licenseFile": "node_modules/cacheable-request/node_modules/lowercase-keys/license" + "licenseFile": "license" }, "lru-cache@6.0.0": { "licenses": "ISC", "repository": "https://github.com/isaacs/node-lru-cache", "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", - "path": "/Users/pau/git/moodleapp5/node_modules/lru-cache", - "licenseFile": "node_modules/lru-cache/LICENSE" + "licenseFile": "LICENSE" }, "macos-release@2.4.1": { "licenses": "MIT", @@ -2501,8 +2416,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/macos-release", - "licenseFile": "node_modules/macos-release/license" + "licenseFile": "license" }, "make-dir@1.3.0": { "licenses": "MIT", @@ -2510,8 +2424,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/conf/node_modules/make-dir", - "licenseFile": "node_modules/conf/node_modules/make-dir/license" + "licenseFile": "license" }, "make-dir@3.1.0": { "licenses": "MIT", @@ -2519,28 +2432,31 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/make-dir", - "licenseFile": "node_modules/make-dir/license" + "licenseFile": "license" + }, + "make-fetch-happen@9.0.4": { + "licenses": "ISC", + "repository": "https://github.com/npm/make-fetch-happen", + "publisher": "Kat Marchán", + "email": "kzm@zkat.tech", + "licenseFile": "LICENSE" }, "mathjax@2.7.7": { "licenses": "Apache-2.0", "repository": "https://github.com/mathjax/MathJax", - "path": "/Users/pau/git/moodleapp5/node_modules/mathjax", - "licenseFile": "node_modules/mathjax/LICENSE" + "licenseFile": "LICENSE" }, "md5-file@5.0.0": { "licenses": "MIT", "repository": "https://github.com/roryrjb/md5-file", - "path": "/Users/pau/git/moodleapp5/node_modules/md5-file", - "licenseFile": "node_modules/md5-file/LICENSE.md" + "licenseFile": "LICENSE.md" }, "media-typer@0.3.0": { "licenses": "MIT", "repository": "https://github.com/jshttp/media-typer", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/media-typer", - "licenseFile": "node_modules/media-typer/LICENSE" + "licenseFile": "LICENSE" }, "merge-descriptors@1.0.1": { "licenses": "MIT", @@ -2548,48 +2464,41 @@ "publisher": "Jonathan Ong", "email": "me@jongleberry.com", "url": "http://jongleberry.com", - "path": "/Users/pau/git/moodleapp5/node_modules/merge-descriptors", - "licenseFile": "node_modules/merge-descriptors/LICENSE" + "licenseFile": "LICENSE" }, "merge-stream@2.0.0": { "licenses": "MIT", "repository": "https://github.com/grncdr/merge-stream", "publisher": "Stephen Sugden", "email": "me@stephensugden.com", - "path": "/Users/pau/git/moodleapp5/node_modules/merge-stream", - "licenseFile": "node_modules/merge-stream/LICENSE" + "licenseFile": "LICENSE" }, "merge2@1.4.1": { "licenses": "MIT", "repository": "https://github.com/teambition/merge2", - "path": "/Users/pau/git/moodleapp5/node_modules/merge2", - "licenseFile": "node_modules/merge2/LICENSE" + "licenseFile": "LICENSE" }, "methods@1.1.2": { "licenses": "MIT", "repository": "https://github.com/jshttp/methods", - "path": "/Users/pau/git/moodleapp5/node_modules/methods", - "licenseFile": "node_modules/methods/LICENSE" + "licenseFile": "LICENSE" }, "micromatch@4.0.2": { "licenses": "MIT", "repository": "https://github.com/micromatch/micromatch", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/micromatch", - "licenseFile": "node_modules/micromatch/LICENSE" + "licenseFile": "LICENSE" }, "mime-db@1.44.0": { "licenses": "MIT", "repository": "https://github.com/jshttp/mime-db", - "path": "/Users/pau/git/moodleapp5/node_modules/mime-db", - "licenseFile": "node_modules/mime-db/LICENSE" + "licenseFile": "LICENSE" }, "mime-types@2.1.27": { "licenses": "MIT", "repository": "https://github.com/jshttp/mime-types", - "path": "/Users/pau/git/moodleapp5/node_modules/mime-types", - "licenseFile": "node_modules/mime-types/LICENSE" + "licenseFile": "LICENSE" }, "mime@1.6.0": { "licenses": "MIT", @@ -2597,8 +2506,7 @@ "publisher": "Robert Kieffer", "email": "robert@broofa.com", "url": "http://github.com/broofa", - "path": "/Users/pau/git/moodleapp5/node_modules/mime", - "licenseFile": "node_modules/mime/LICENSE" + "licenseFile": "LICENSE" }, "mimic-fn@1.2.0": { "licenses": "MIT", @@ -2606,8 +2514,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/restore-cursor/node_modules/mimic-fn", - "licenseFile": "node_modules/restore-cursor/node_modules/mimic-fn/license" + "licenseFile": "license" }, "mimic-fn@2.1.0": { "licenses": "MIT", @@ -2615,8 +2522,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/mimic-fn", - "licenseFile": "node_modules/mimic-fn/license" + "licenseFile": "license" }, "mimic-response@1.0.1": { "licenses": "MIT", @@ -2624,8 +2530,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/mimic-response", - "licenseFile": "node_modules/mimic-response/license" + "licenseFile": "license" }, "mimic-response@2.1.0": { "licenses": "MIT", @@ -2633,8 +2538,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/simple-get/node_modules/mimic-response", - "licenseFile": "node_modules/simple-get/node_modules/mimic-response/license" + "licenseFile": "license" }, "minimatch@3.0.4": { "licenses": "ISC", @@ -2642,8 +2546,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me", - "path": "/Users/pau/git/moodleapp5/node_modules/minimatch", - "licenseFile": "node_modules/minimatch/LICENSE" + "licenseFile": "LICENSE" }, "minimist@1.2.0": { "licenses": "MIT", @@ -2651,8 +2554,7 @@ "publisher": "James Halliday", "email": "mail@substack.net", "url": "http://substack.net", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova.plugins.diagnostic/node_modules/minimist", - "licenseFile": "node_modules/cordova.plugins.diagnostic/node_modules/minimist/LICENSE" + "licenseFile": "LICENSE" }, "minimist@1.2.5": { "licenses": "MIT", @@ -2660,16 +2562,78 @@ "publisher": "James Halliday", "email": "mail@substack.net", "url": "http://substack.net", - "path": "/Users/pau/git/moodleapp5/node_modules/minimist", - "licenseFile": "node_modules/minimist/LICENSE" + "licenseFile": "LICENSE" + }, + "minipass-collect@1.0.2": { + "licenses": "ISC", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "minipass-fetch@1.3.4": { + "licenses": "MIT", + "repository": "https://github.com/npm/minipass-fetch", + "licenseFile": "LICENSE" + }, + "minipass-flush@1.0.5": { + "licenses": "ISC", + "repository": "https://github.com/isaacs/minipass-flush", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "minipass-json-stream@1.0.1": { + "licenses": "MIT", + "repository": "https://github.com/npm/minipass-json-stream", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "minipass-pipeline@1.2.4": { + "licenses": "ISC", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "minipass-sized@1.0.3": { + "licenses": "ISC", + "repository": "https://github.com/isaacs/minipass-sized", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" + }, + "minipass@3.1.3": { + "licenses": "ISC", + "repository": "https://github.com/isaacs/minipass", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" + }, + "minizlib@2.1.2": { + "licenses": "MIT", + "repository": "https://github.com/isaacs/minizlib", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" }, "mkdirp-classic@0.5.3": { "licenses": "MIT", "repository": "https://github.com/mafintosh/mkdirp-classic", "publisher": "Mathias Buus", "url": "@mafintosh", - "path": "/Users/pau/git/moodleapp5/node_modules/mkdirp-classic", - "licenseFile": "node_modules/mkdirp-classic/LICENSE" + "licenseFile": "LICENSE" + }, + "mkdirp@1.0.4": { + "licenses": "MIT", + "repository": "https://github.com/isaacs/node-mkdirp", + "licenseFile": "LICENSE" }, "moment@2.29.0": { "licenses": "MIT", @@ -2677,28 +2641,29 @@ "publisher": "Iskren Ivov Chernev", "email": "iskren.chernev@gmail.com", "url": "https://github.com/ichernev", - "path": "/Users/pau/git/moodleapp5/node_modules/moment", - "licenseFile": "node_modules/moment/LICENSE" + "licenseFile": "LICENSE" }, - "moodlemobile@3.9.5": { + "moodlemobile@3.9.6-dev": { "licenses": "Apache-2.0", - "repository": "https://github.com/moodlehq/moodlemobile2", + "repository": "https://github.com/moodlehq/moodleapp", "publisher": "Moodle Pty Ltd.", "email": "mobile@moodle.com", - "path": "/Users/pau/git/moodleapp5", "licenseFile": "README.md" }, "ms@2.0.0": { "licenses": "MIT", "repository": "https://github.com/zeit/ms", - "path": "/Users/pau/git/moodleapp5/node_modules/ms", - "licenseFile": "node_modules/ms/license.md" + "licenseFile": "license.md" }, "ms@2.1.1": { "licenses": "MIT", "repository": "https://github.com/zeit/ms", - "path": "/Users/pau/git/moodleapp5/node_modules/send/node_modules/ms", - "licenseFile": "node_modules/send/node_modules/ms/license.md" + "licenseFile": "license.md" + }, + "ms@2.1.2": { + "licenses": "MIT", + "repository": "https://github.com/zeit/ms", + "licenseFile": "license.md" }, "mute-stream@0.0.7": { "licenses": "ISC", @@ -2706,8 +2671,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/inquirer/node_modules/mute-stream", - "licenseFile": "node_modules/inquirer/node_modules/mute-stream/LICENSE" + "licenseFile": "LICENSE" }, "mute-stream@0.0.8": { "licenses": "ISC", @@ -2715,52 +2679,52 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/mute-stream", - "licenseFile": "node_modules/mute-stream/LICENSE" + "licenseFile": "LICENSE" }, "napi-build-utils@1.0.2": { "licenses": "MIT", "repository": "https://github.com/inspiredware/napi-build-utils", "publisher": "Jim Schlight", - "path": "/Users/pau/git/moodleapp5/node_modules/napi-build-utils", - "licenseFile": "node_modules/napi-build-utils/LICENSE" + "licenseFile": "LICENSE" }, "negotiator@0.6.2": { "licenses": "MIT", "repository": "https://github.com/jshttp/negotiator", - "path": "/Users/pau/git/moodleapp5/node_modules/negotiator", - "licenseFile": "node_modules/negotiator/LICENSE" + "licenseFile": "LICENSE" }, "nice-try@1.0.5": { "licenses": "MIT", "repository": "https://github.com/electerious/nice-try", - "path": "/Users/pau/git/moodleapp5/node_modules/nice-try", - "licenseFile": "node_modules/nice-try/LICENSE" + "licenseFile": "LICENSE" }, "nl.kingsquare.cordova.background-audio@1.0.1": { "licenses": "MIT", "repository": "https://github.com/AubreyHewes/cordova-background-audio", - "path": "/Users/pau/git/moodleapp5/node_modules/nl.kingsquare.cordova.background-audio", - "licenseFile": "node_modules/nl.kingsquare.cordova.background-audio/LICENSE" + "licenseFile": "LICENSE" }, "node-abi@2.19.3": { "licenses": "MIT", "repository": "https://github.com/lgeiger/node-abi", "publisher": "Lukas Geiger", - "path": "/Users/pau/git/moodleapp5/node_modules/node-abi", - "licenseFile": "node_modules/node-abi/LICENSE" + "licenseFile": "LICENSE" }, "node-addon-api@3.0.2": { "licenses": "MIT", "repository": "https://github.com/nodejs/node-addon-api", - "path": "/Users/pau/git/moodleapp5/node_modules/node-addon-api", - "licenseFile": "node_modules/node-addon-api/LICENSE.md" + "licenseFile": "LICENSE.md" + }, + "node-gyp@7.1.2": { + "licenses": "MIT", + "repository": "https://github.com/nodejs/node-gyp", + "publisher": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://tootallnate.net", + "licenseFile": "LICENSE" }, "noop-logger@0.1.1": { "licenses": "MIT", "repository": "https://github.com/segmentio/noop-logger", - "path": "/Users/pau/git/moodleapp5/node_modules/noop-logger", - "licenseFile": "node_modules/noop-logger/Readme.md" + "licenseFile": "Readme.md" }, "nopt@1.0.9": { "licenses": "MIT", @@ -2768,8 +2732,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/ios-sim/node_modules/nopt", - "licenseFile": "node_modules/ios-sim/node_modules/nopt/LICENSE" + "licenseFile": "LICENSE" }, "nopt@4.0.3": { "licenses": "ISC", @@ -2777,8 +2740,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/nopt", - "licenseFile": "node_modules/nopt/LICENSE" + "licenseFile": "LICENSE" }, "nopt@5.0.0": { "licenses": "ISC", @@ -2786,25 +2748,35 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-ios/node_modules/nopt", - "licenseFile": "node_modules/cordova-ios/node_modules/nopt/LICENSE" + "licenseFile": "LICENSE" }, "normalize-package-data@2.5.0": { "licenses": "BSD-2-Clause", "repository": "https://github.com/npm/normalize-package-data", "publisher": "Meryn Stol", "email": "merynstol@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/normalize-package-data", - "licenseFile": "node_modules/normalize-package-data/LICENSE" + "licenseFile": "LICENSE" }, - "normalize-url@4.5.0": { + "normalize-url@4.5.1": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/normalize-url", "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/normalize-url", - "licenseFile": "node_modules/normalize-url/license" + "licenseFile": "license" + }, + "npm-bundled@1.1.1": { + "licenses": "ISC", + "repository": "https://github.com/npm/npm-bundled", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" + }, + "npm-install-checks@4.0.0": { + "licenses": "BSD-2-Clause", + "repository": "https://github.com/npm/npm-install-checks", + "licenseFile": "LICENSE" }, "npm-normalize-package-bin@1.0.1": { "licenses": "ISC", @@ -2812,8 +2784,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "https://izs.me", - "path": "/Users/pau/git/moodleapp5/node_modules/npm-normalize-package-bin", - "licenseFile": "node_modules/npm-normalize-package-bin/LICENSE" + "licenseFile": "LICENSE" }, "npm-package-arg@6.1.1": { "licenses": "ISC", @@ -2821,8 +2792,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/init-package-json/node_modules/npm-package-arg", - "licenseFile": "node_modules/init-package-json/node_modules/npm-package-arg/LICENSE" + "licenseFile": "LICENSE" }, "npm-package-arg@8.0.1": { "licenses": "ISC", @@ -2830,8 +2800,44 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/npm-package-arg", - "licenseFile": "node_modules/npm-package-arg/LICENSE" + "licenseFile": "LICENSE" + }, + "npm-package-arg@8.1.5": { + "licenses": "ISC", + "repository": "https://github.com/npm/npm-package-arg", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" + }, + "npm-packlist@2.2.2": { + "licenses": "ISC", + "repository": "https://github.com/npm/npm-packlist", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" + }, + "npm-pick-manifest@6.1.0": { + "licenses": "ISC", + "repository": "https://github.com/npm/npm-pick-manifest", + "publisher": "Kat Marchán", + "email": "kzm@sykosomatic.org", + "licenseFile": "LICENSE.md" + }, + "npm-pick-manifest@6.1.1": { + "licenses": "ISC", + "repository": "https://github.com/npm/npm-pick-manifest", + "publisher": "Kat Marchán", + "email": "kzm@sykosomatic.org", + "licenseFile": "LICENSE.md" + }, + "npm-registry-fetch@11.0.0": { + "licenses": "ISC", + "repository": "https://github.com/npm/npm-registry-fetch", + "publisher": "Kat Marchán", + "email": "kzm@sykosomatic.org", + "licenseFile": "LICENSE.md" }, "npm-run-path@2.0.2": { "licenses": "MIT", @@ -2839,8 +2845,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/npm-run-path", - "licenseFile": "node_modules/windows-release/node_modules/npm-run-path/license" + "licenseFile": "license" }, "npm-run-path@4.0.1": { "licenses": "MIT", @@ -2848,8 +2853,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/npm-run-path", - "licenseFile": "node_modules/npm-run-path/license" + "licenseFile": "license" }, "npmlog@4.1.2": { "licenses": "ISC", @@ -2857,8 +2861,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/npmlog", - "licenseFile": "node_modules/npmlog/LICENSE" + "licenseFile": "LICENSE" }, "number-is-nan@1.0.1": { "licenses": "MIT", @@ -2866,8 +2869,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/number-is-nan", - "licenseFile": "node_modules/number-is-nan/license" + "licenseFile": "license" }, "oauth-sign@0.9.0": { "licenses": "Apache-2.0", @@ -2875,8 +2877,7 @@ "publisher": "Mikeal Rogers", "email": "mikeal.rogers@gmail.com", "url": "http://www.futurealoof.com", - "path": "/Users/pau/git/moodleapp5/node_modules/oauth-sign", - "licenseFile": "node_modules/oauth-sign/LICENSE" + "licenseFile": "LICENSE" }, "object-assign@4.1.1": { "licenses": "MIT", @@ -2884,30 +2885,26 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/object-assign", - "licenseFile": "node_modules/object-assign/license" + "licenseFile": "license" }, "objectorarray@1.0.4": { "licenses": "ISC", "repository": "https://github.com/ZhouHansen/objectnotnull", "publisher": "zhouhancheng", "email": "z308114274@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/objectorarray", - "licenseFile": "node_modules/objectorarray/LICENSE" + "licenseFile": "LICENSE" }, "on-finished@2.3.0": { "licenses": "MIT", "repository": "https://github.com/jshttp/on-finished", - "path": "/Users/pau/git/moodleapp5/node_modules/on-finished", - "licenseFile": "node_modules/on-finished/LICENSE" + "licenseFile": "LICENSE" }, "on-headers@1.0.2": { "licenses": "MIT", "repository": "https://github.com/jshttp/on-headers", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/on-headers", - "licenseFile": "node_modules/on-headers/LICENSE" + "licenseFile": "LICENSE" }, "once@1.4.0": { "licenses": "ISC", @@ -2915,8 +2912,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/once", - "licenseFile": "node_modules/once/LICENSE" + "licenseFile": "LICENSE" }, "onetime@2.0.1": { "licenses": "MIT", @@ -2924,8 +2920,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/restore-cursor/node_modules/onetime", - "licenseFile": "node_modules/restore-cursor/node_modules/onetime/license" + "licenseFile": "license" }, "onetime@5.1.2": { "licenses": "MIT", @@ -2933,8 +2928,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/onetime", - "licenseFile": "node_modules/onetime/license" + "licenseFile": "license" }, "open@7.3.0": { "licenses": "MIT", @@ -2942,8 +2936,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/open", - "licenseFile": "node_modules/open/license" + "licenseFile": "license" }, "os-homedir@1.0.2": { "licenses": "MIT", @@ -2951,8 +2944,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/os-homedir", - "licenseFile": "node_modules/os-homedir/license" + "licenseFile": "license" }, "os-name@3.1.0": { "licenses": "MIT", @@ -2960,8 +2952,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/os-name", - "licenseFile": "node_modules/os-name/license" + "licenseFile": "license" }, "os-tmpdir@1.0.2": { "licenses": "MIT", @@ -2969,8 +2960,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/os-tmpdir", - "licenseFile": "node_modules/os-tmpdir/license" + "licenseFile": "license" }, "osenv@0.1.5": { "licenses": "ISC", @@ -2978,8 +2968,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/osenv", - "licenseFile": "node_modules/osenv/LICENSE" + "licenseFile": "LICENSE" }, "p-cancelable@1.1.0": { "licenses": "MIT", @@ -2987,8 +2976,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/p-cancelable", - "licenseFile": "node_modules/p-cancelable/license" + "licenseFile": "license" }, "p-finally@1.0.0": { "licenses": "MIT", @@ -2996,8 +2984,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/p-finally", - "licenseFile": "node_modules/p-finally/license" + "licenseFile": "license" }, "p-limit@1.3.0": { "licenses": "MIT", @@ -3005,8 +2992,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/p-limit", - "licenseFile": "node_modules/p-limit/license" + "licenseFile": "license" }, "p-locate@2.0.0": { "licenses": "MIT", @@ -3014,8 +3000,15 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/p-locate", - "licenseFile": "node_modules/p-locate/license" + "licenseFile": "license" + }, + "p-map@4.0.0": { + "licenses": "MIT", + "repository": "https://github.com/sindresorhus/p-map", + "publisher": "Sindre Sorhus", + "email": "sindresorhus@gmail.com", + "url": "https://sindresorhus.com", + "licenseFile": "license" }, "p-try@1.0.0": { "licenses": "MIT", @@ -3023,8 +3016,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/p-limit/node_modules/p-try", - "licenseFile": "node_modules/p-limit/node_modules/p-try/license" + "licenseFile": "license" }, "p-try@2.2.0": { "licenses": "MIT", @@ -3032,8 +3024,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/p-try", - "licenseFile": "node_modules/p-try/license" + "licenseFile": "license" }, "package-json@6.5.0": { "licenses": "MIT", @@ -3041,14 +3032,20 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/package-json", - "licenseFile": "node_modules/package-json/license" + "licenseFile": "license" + }, + "pacote@11.3.5": { + "licenses": "ISC", + "repository": "https://github.com/npm/pacote", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" }, "pako@1.0.11": { "licenses": "(MIT AND Zlib)", "repository": "https://github.com/nodeca/pako", - "path": "/Users/pau/git/moodleapp5/node_modules/pako", - "licenseFile": "node_modules/pako/LICENSE" + "licenseFile": "LICENSE" }, "parent-module@1.0.1": { "licenses": "MIT", @@ -3056,14 +3053,12 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/parent-module", - "licenseFile": "node_modules/parent-module/license" + "licenseFile": "license" }, "parseurl@1.3.3": { "licenses": "MIT", "repository": "https://github.com/pillarjs/parseurl", - "path": "/Users/pau/git/moodleapp5/node_modules/parseurl", - "licenseFile": "node_modules/parseurl/LICENSE" + "licenseFile": "LICENSE" }, "path-exists@3.0.0": { "licenses": "MIT", @@ -3071,8 +3066,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/path-exists", - "licenseFile": "node_modules/path-exists/license" + "licenseFile": "license" }, "path-is-absolute@1.0.1": { "licenses": "MIT", @@ -3080,8 +3074,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/path-is-absolute", - "licenseFile": "node_modules/path-is-absolute/license" + "licenseFile": "license" }, "path-is-inside@1.0.2": { "licenses": "(WTFPL OR MIT)", @@ -3089,8 +3082,7 @@ "publisher": "Domenic Denicola", "email": "d@domenic.me", "url": "https://domenic.me", - "path": "/Users/pau/git/moodleapp5/node_modules/path-is-inside", - "licenseFile": "node_modules/path-is-inside/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "path-key@2.0.1": { "licenses": "MIT", @@ -3098,8 +3090,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/path-key", - "licenseFile": "node_modules/windows-release/node_modules/path-key/license" + "licenseFile": "license" }, "path-key@3.1.1": { "licenses": "MIT", @@ -3107,22 +3098,19 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/path-key", - "licenseFile": "node_modules/path-key/license" + "licenseFile": "license" }, "path-parse@1.0.6": { "licenses": "MIT", "repository": "https://github.com/jbgutierrez/path-parse", "publisher": "Javier Blanco", "email": "http://jbgutierrez.info", - "path": "/Users/pau/git/moodleapp5/node_modules/path-parse", - "licenseFile": "node_modules/path-parse/LICENSE" + "licenseFile": "LICENSE" }, "path-to-regexp@0.1.7": { "licenses": "MIT", "repository": "https://github.com/component/path-to-regexp", - "path": "/Users/pau/git/moodleapp5/node_modules/path-to-regexp", - "licenseFile": "node_modules/path-to-regexp/LICENSE" + "licenseFile": "LICENSE" }, "path-type@4.0.0": { "licenses": "MIT", @@ -3130,38 +3118,21 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/path-type", - "licenseFile": "node_modules/path-type/license" + "licenseFile": "license" }, "performance-now@2.1.0": { "licenses": "MIT", "repository": "https://github.com/braveg1rl/performance-now", "publisher": "Braveg1rl", "email": "braveg1rl@outlook.com", - "path": "/Users/pau/git/moodleapp5/node_modules/performance-now", - "licenseFile": "node_modules/performance-now/license.txt" - }, - "phonegap-plugin-multidex@1.0.0": { - "licenses": "MIT", - "repository": "https://github.com/phonegap/phonegap-plugin-multidex", - "publisher": "Adobe PhoneGap Team", - "path": "/Users/pau/git/moodleapp5/node_modules/phonegap-plugin-multidex", - "licenseFile": "node_modules/phonegap-plugin-multidex/README.md" - }, - "phonegap-plugin-push@2.2.3": { - "licenses": "MIT", - "repository": "https://github.com/phonegap/phonegap-plugin-push", - "publisher": "Adobe PhoneGap Team", - "path": "/Users/pau/git/moodleapp5/node_modules/phonegap-plugin-push", - "licenseFile": "node_modules/phonegap-plugin-push/README.md" + "licenseFile": "license.txt" }, "picomatch@2.2.2": { "licenses": "MIT", "repository": "https://github.com/micromatch/picomatch", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/picomatch", - "licenseFile": "node_modules/picomatch/LICENSE" + "licenseFile": "LICENSE" }, "pify@3.0.0": { "licenses": "MIT", @@ -3169,8 +3140,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/conf/node_modules/pify", - "licenseFile": "node_modules/conf/node_modules/pify/license" + "licenseFile": "license" }, "pify@4.0.1": { "licenses": "MIT", @@ -3178,8 +3148,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/pify", - "licenseFile": "node_modules/pify/license" + "licenseFile": "license" }, "pify@5.0.0": { "licenses": "MIT", @@ -3187,8 +3156,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-fetch/node_modules/pify", - "licenseFile": "node_modules/cordova-fetch/node_modules/pify/license" + "licenseFile": "license" }, "pkg-up@2.0.0": { "licenses": "MIT", @@ -3196,24 +3164,21 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/pkg-up", - "licenseFile": "node_modules/pkg-up/license" + "licenseFile": "license" }, "plist@3.0.1": { "licenses": "MIT", "repository": "https://github.com/TooTallNate/node-plist", "publisher": "Nathan Rajlich", "email": "nathan@tootallnate.net", - "path": "/Users/pau/git/moodleapp5/node_modules/plist", - "licenseFile": "node_modules/plist/LICENSE" + "licenseFile": "LICENSE" }, "prebuild-install@6.0.0": { "licenses": "MIT", "repository": "https://github.com/prebuild/prebuild-install", "publisher": "Mathias Buus", "url": "@mafintosh", - "path": "/Users/pau/git/moodleapp5/node_modules/prebuild-install", - "licenseFile": "node_modules/prebuild-install/LICENSE" + "licenseFile": "LICENSE" }, "prepend-http@2.0.0": { "licenses": "MIT", @@ -3221,14 +3186,28 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/prepend-http", - "licenseFile": "node_modules/prepend-http/license" + "licenseFile": "license" }, "process-nextick-args@2.0.1": { "licenses": "MIT", "repository": "https://github.com/calvinmetcalf/process-nextick-args", - "path": "/Users/pau/git/moodleapp5/node_modules/process-nextick-args", - "licenseFile": "node_modules/process-nextick-args/license.md" + "licenseFile": "license.md" + }, + "promise-inflight@1.0.1": { + "licenses": "ISC", + "repository": "https://github.com/iarna/promise-inflight", + "publisher": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org/", + "licenseFile": "LICENSE" + }, + "promise-retry@2.0.1": { + "licenses": "MIT", + "repository": "https://github.com/IndigoUnited/node-promise-retry", + "publisher": "IndigoUnited", + "email": "hello@indigounited.com", + "url": "http://indigounited.com", + "licenseFile": "LICENSE" }, "promzard@0.3.0": { "licenses": "ISC", @@ -3236,22 +3215,19 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/promzard", - "licenseFile": "node_modules/promzard/LICENSE" + "licenseFile": "LICENSE" }, "properties-parser@0.3.1": { "licenses": "MIT", "repository": "https://github.com/xavi-/node-properties-parser", - "path": "/Users/pau/git/moodleapp5/node_modules/properties-parser", - "licenseFile": "node_modules/properties-parser/README.markdown" + "licenseFile": "README.markdown" }, "proxy-addr@2.0.6": { "licenses": "MIT", "repository": "https://github.com/jshttp/proxy-addr", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/proxy-addr", - "licenseFile": "node_modules/proxy-addr/LICENSE" + "licenseFile": "LICENSE" }, "psl@1.8.0": { "licenses": "MIT", @@ -3259,33 +3235,29 @@ "publisher": "Lupo Montero", "email": "lupomontero@gmail.com", "url": "https://lupomontero.com/", - "path": "/Users/pau/git/moodleapp5/node_modules/psl", - "licenseFile": "node_modules/psl/LICENSE" + "licenseFile": "LICENSE" }, "pump@3.0.0": { "licenses": "MIT", "repository": "https://github.com/mafintosh/pump", "publisher": "Mathias Buus Madsen", "email": "mathiasbuus@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/pump", - "licenseFile": "node_modules/pump/LICENSE" + "licenseFile": "LICENSE" }, "punycode@2.1.1": { "licenses": "MIT", "repository": "https://github.com/bestiejs/punycode.js", "publisher": "Mathias Bynens", "url": "https://mathiasbynens.be/", - "path": "/Users/pau/git/moodleapp5/node_modules/punycode", - "licenseFile": "node_modules/punycode/LICENSE-MIT.txt" + "licenseFile": "LICENSE-MIT.txt" }, - "pupa@2.0.1": { + "pupa@2.1.1": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/pupa", "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/pupa", - "licenseFile": "node_modules/pupa/license" + "licenseFile": "license" }, "q@1.5.1": { "licenses": "MIT", @@ -3293,26 +3265,22 @@ "publisher": "Kris Kowal", "email": "kris@cixar.com", "url": "https://github.com/kriskowal", - "path": "/Users/pau/git/moodleapp5/node_modules/q", - "licenseFile": "node_modules/q/LICENSE" + "licenseFile": "LICENSE" }, "qrcode-reader@1.0.4": { "licenses": "Apache-2.0", "repository": "https://github.com/edi9999/jsqrcode", - "path": "/Users/pau/git/moodleapp5/node_modules/qrcode-reader", - "licenseFile": "node_modules/qrcode-reader/COPYING" + "licenseFile": "COPYING" }, "qs@6.5.2": { "licenses": "BSD-3-Clause", "repository": "https://github.com/ljharb/qs", - "path": "/Users/pau/git/moodleapp5/node_modules/request/node_modules/qs", - "licenseFile": "node_modules/request/node_modules/qs/LICENSE" + "licenseFile": "LICENSE" }, "qs@6.7.0": { "licenses": "BSD-3-Clause", "repository": "https://github.com/ljharb/qs", - "path": "/Users/pau/git/moodleapp5/node_modules/qs", - "licenseFile": "node_modules/qs/LICENSE" + "licenseFile": "LICENSE" }, "range-parser@1.2.1": { "licenses": "MIT", @@ -3320,8 +3288,7 @@ "publisher": "TJ Holowaychuk", "email": "tj@vision-media.ca", "url": "http://tjholowaychuk.com", - "path": "/Users/pau/git/moodleapp5/node_modules/range-parser", - "licenseFile": "node_modules/range-parser/LICENSE" + "licenseFile": "LICENSE" }, "raw-body@2.4.0": { "licenses": "MIT", @@ -3329,8 +3296,7 @@ "publisher": "Jonathan Ong", "email": "me@jongleberry.com", "url": "http://jongleberry.com", - "path": "/Users/pau/git/moodleapp5/node_modules/raw-body", - "licenseFile": "node_modules/raw-body/LICENSE" + "licenseFile": "LICENSE" }, "rc@1.2.8": { "licenses": "(BSD-2-Clause OR MIT OR Apache-2.0)", @@ -3338,8 +3304,7 @@ "publisher": "Dominic Tarr", "email": "dominic.tarr@gmail.com", "url": "dominictarr.com", - "path": "/Users/pau/git/moodleapp5/node_modules/rc", - "licenseFile": "node_modules/rc/LICENSE.APACHE2" + "licenseFile": "LICENSE.APACHE2" }, "read-chunk@3.2.0": { "licenses": "MIT", @@ -3347,8 +3312,15 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/read-chunk", - "licenseFile": "node_modules/read-chunk/license" + "licenseFile": "license" + }, + "read-package-json-fast@2.0.3": { + "licenses": "ISC", + "repository": "https://github.com/npm/read-package-json-fast", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "https://izs.me", + "licenseFile": "LICENSE" }, "read-package-json@2.1.2": { "licenses": "ISC", @@ -3356,8 +3328,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/read-package-json", - "licenseFile": "node_modules/read-package-json/LICENSE" + "licenseFile": "LICENSE" }, "read@1.0.7": { "licenses": "ISC", @@ -3365,28 +3336,24 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/read", - "licenseFile": "node_modules/read/LICENSE" + "licenseFile": "LICENSE" }, "readable-stream@2.3.7": { "licenses": "MIT", "repository": "https://github.com/nodejs/readable-stream", - "path": "/Users/pau/git/moodleapp5/node_modules/readable-stream", - "licenseFile": "node_modules/readable-stream/LICENSE" + "licenseFile": "LICENSE" }, "readable-stream@3.6.0": { "licenses": "MIT", "repository": "https://github.com/nodejs/readable-stream", - "path": "/Users/pau/git/moodleapp5/node_modules/bl/node_modules/readable-stream", - "licenseFile": "node_modules/bl/node_modules/readable-stream/LICENSE" + "licenseFile": "LICENSE" }, - "registry-auth-token@4.2.0": { + "registry-auth-token@4.2.1": { "licenses": "MIT", "repository": "https://github.com/rexxars/registry-auth-token", "publisher": "Espen Hovlandsdal", "email": "espen@hovlandsdal.com", - "path": "/Users/pau/git/moodleapp5/node_modules/registry-auth-token", - "licenseFile": "node_modules/registry-auth-token/LICENSE" + "licenseFile": "LICENSE" }, "registry-url@5.1.0": { "licenses": "MIT", @@ -3394,16 +3361,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/registry-url", - "licenseFile": "node_modules/registry-url/license" + "licenseFile": "license" }, "request@2.88.2": { "licenses": "Apache-2.0", "repository": "https://github.com/request/request", "publisher": "Mikeal Rogers", "email": "mikeal.rogers@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/request", - "licenseFile": "node_modules/request/LICENSE" + "licenseFile": "LICENSE" }, "resolve-from@4.0.0": { "licenses": "MIT", @@ -3411,8 +3376,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/resolve-from", - "licenseFile": "node_modules/resolve-from/license" + "licenseFile": "license" }, "resolve@1.17.0": { "licenses": "MIT", @@ -3420,15 +3384,13 @@ "publisher": "James Halliday", "email": "mail@substack.net", "url": "http://substack.net", - "path": "/Users/pau/git/moodleapp5/node_modules/resolve", - "licenseFile": "node_modules/resolve/LICENSE" + "licenseFile": "LICENSE" }, "responselike@1.0.2": { "licenses": "MIT", "repository": "https://github.com/lukechilds/responselike", "publisher": "lukechilds", - "path": "/Users/pau/git/moodleapp5/node_modules/responselike", - "licenseFile": "node_modules/responselike/LICENSE" + "licenseFile": "LICENSE" }, "restore-cursor@2.0.0": { "licenses": "MIT", @@ -3436,16 +3398,22 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/restore-cursor", - "licenseFile": "node_modules/restore-cursor/license" + "licenseFile": "license" + }, + "retry@0.12.0": { + "licenses": "MIT", + "repository": "https://github.com/tim-kos/node-retry", + "publisher": "Tim Koschützki", + "email": "tim@debuggable.com", + "url": "http://debuggable.com/", + "licenseFile": "License" }, "reusify@1.0.4": { "licenses": "MIT", "repository": "https://github.com/mcollina/reusify", "publisher": "Matteo Collina", "email": "hello@matteocollina.com", - "path": "/Users/pau/git/moodleapp5/node_modules/reusify", - "licenseFile": "node_modules/reusify/LICENSE" + "licenseFile": "LICENSE" }, "rimraf@3.0.2": { "licenses": "ISC", @@ -3453,16 +3421,14 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/rimraf", - "licenseFile": "node_modules/rimraf/LICENSE" + "licenseFile": "LICENSE" }, "run-async@2.4.1": { "licenses": "MIT", "repository": "https://github.com/SBoudrias/run-async", "publisher": "Simon Boudrias", "email": "admin@simonboudrias.com", - "path": "/Users/pau/git/moodleapp5/node_modules/run-async", - "licenseFile": "node_modules/run-async/LICENSE" + "licenseFile": "LICENSE" }, "run-parallel@1.1.9": { "licenses": "MIT", @@ -3470,16 +3436,14 @@ "publisher": "Feross Aboukhadijeh", "email": "feross@feross.org", "url": "http://feross.org/", - "path": "/Users/pau/git/moodleapp5/node_modules/run-parallel", - "licenseFile": "node_modules/run-parallel/LICENSE" + "licenseFile": "LICENSE" }, "rxjs@6.5.5": { "licenses": "Apache-2.0", "repository": "https://github.com/reactivex/rxjs", "publisher": "Ben Lesh", "email": "ben@benlesh.com", - "path": "/Users/pau/git/moodleapp5/node_modules/rxjs", - "licenseFile": "node_modules/rxjs/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "safe-buffer@5.1.2": { "licenses": "MIT", @@ -3487,8 +3451,7 @@ "publisher": "Feross Aboukhadijeh", "email": "feross@feross.org", "url": "http://feross.org", - "path": "/Users/pau/git/moodleapp5/node_modules/safe-buffer", - "licenseFile": "node_modules/safe-buffer/LICENSE" + "licenseFile": "LICENSE" }, "safer-buffer@2.1.2": { "licenses": "MIT", @@ -3496,8 +3459,7 @@ "publisher": "Nikita Skovoroda", "email": "chalkerx@gmail.com", "url": "https://github.com/ChALkeR", - "path": "/Users/pau/git/moodleapp5/node_modules/safer-buffer", - "licenseFile": "node_modules/safer-buffer/LICENSE" + "licenseFile": "LICENSE" }, "sax@1.1.4": { "licenses": "ISC", @@ -3505,15 +3467,13 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/sax", - "licenseFile": "node_modules/sax/LICENSE" + "licenseFile": "LICENSE" }, "sdp@1.5.4": { "licenses": "MIT", "repository": "https://github.com/fippo/sdp", "publisher": "Philipp Hancke", - "path": "/Users/pau/git/moodleapp5/node_modules/sdp", - "licenseFile": "node_modules/sdp/LICENSE" + "licenseFile": "LICENSE" }, "semver-diff@3.1.1": { "licenses": "MIT", @@ -3521,62 +3481,53 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/semver-diff", - "licenseFile": "node_modules/semver-diff/license" + "licenseFile": "license" }, "semver@5.6.0": { "licenses": "ISC", "repository": "https://github.com/npm/node-semver", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-android-support-gradle-release/node_modules/semver", - "licenseFile": "node_modules/cordova-android-support-gradle-release/node_modules/semver/LICENSE" + "licenseFile": "LICENSE" }, "semver@5.7.1": { "licenses": "ISC", "repository": "https://github.com/npm/node-semver", - "path": "/Users/pau/git/moodleapp5/node_modules/init-package-json/node_modules/semver", - "licenseFile": "node_modules/init-package-json/node_modules/semver/LICENSE" + "licenseFile": "LICENSE" }, "semver@6.3.0": { "licenses": "ISC", "repository": "https://github.com/npm/node-semver", - "path": "/Users/pau/git/moodleapp5/node_modules/make-dir/node_modules/semver", - "licenseFile": "node_modules/make-dir/node_modules/semver/LICENSE" + "licenseFile": "LICENSE" }, "semver@7.3.2": { "licenses": "ISC", "repository": "https://github.com/npm/node-semver", - "path": "/Users/pau/git/moodleapp5/node_modules/semver", - "licenseFile": "node_modules/semver/LICENSE" + "licenseFile": "LICENSE" }, "semver@7.3.5": { "licenses": "ISC", "repository": "https://github.com/npm/node-semver", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-android/node_modules/semver", - "licenseFile": "node_modules/cordova-android/node_modules/semver/LICENSE" + "licenseFile": "LICENSE" }, "send@0.17.1": { "licenses": "MIT", "repository": "https://github.com/pillarjs/send", "publisher": "TJ Holowaychuk", "email": "tj@vision-media.ca", - "path": "/Users/pau/git/moodleapp5/node_modules/send", - "licenseFile": "node_modules/send/LICENSE" + "licenseFile": "LICENSE" }, "serve-static@1.14.1": { "licenses": "MIT", "repository": "https://github.com/expressjs/serve-static", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/serve-static", - "licenseFile": "node_modules/serve-static/LICENSE" + "licenseFile": "LICENSE" }, "set-blocking@2.0.0": { "licenses": "ISC", "repository": "https://github.com/yargs/set-blocking", "publisher": "Ben Coe", "email": "ben@npmjs.com", - "path": "/Users/pau/git/moodleapp5/node_modules/set-blocking", - "licenseFile": "node_modules/set-blocking/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "set-immediate-shim@1.0.1": { "licenses": "MIT", @@ -3584,15 +3535,13 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/set-immediate-shim", - "licenseFile": "node_modules/set-immediate-shim/readme.md" + "licenseFile": "readme.md" }, "setprototypeof@1.1.1": { "licenses": "ISC", "repository": "https://github.com/wesleytodd/setprototypeof", "publisher": "Wes Todd", - "path": "/Users/pau/git/moodleapp5/node_modules/setprototypeof", - "licenseFile": "node_modules/setprototypeof/LICENSE" + "licenseFile": "LICENSE" }, "shebang-command@1.2.0": { "licenses": "MIT", @@ -3600,8 +3549,7 @@ "publisher": "Kevin Martensson", "email": "kevinmartensson@gmail.com", "url": "github.com/kevva", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/shebang-command", - "licenseFile": "node_modules/windows-release/node_modules/shebang-command/license" + "licenseFile": "license" }, "shebang-command@2.0.0": { "licenses": "MIT", @@ -3609,8 +3557,7 @@ "publisher": "Kevin Mårtensson", "email": "kevinmartensson@gmail.com", "url": "github.com/kevva", - "path": "/Users/pau/git/moodleapp5/node_modules/shebang-command", - "licenseFile": "node_modules/shebang-command/license" + "licenseFile": "license" }, "shebang-regex@1.0.0": { "licenses": "MIT", @@ -3618,8 +3565,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/shebang-regex", - "licenseFile": "node_modules/windows-release/node_modules/shebang-regex/license" + "licenseFile": "license" }, "shebang-regex@3.0.0": { "licenses": "MIT", @@ -3627,31 +3573,27 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/shebang-regex", - "licenseFile": "node_modules/shebang-regex/license" + "licenseFile": "license" }, "shelljs@0.2.6": { "licenses": "BSD*", "repository": "https://github.com/arturadib/shelljs", "publisher": "Artur Adib", "email": "aadib@mozilla.com", - "path": "/Users/pau/git/moodleapp5/node_modules/simctl/node_modules/shelljs", - "licenseFile": "node_modules/simctl/node_modules/shelljs/LICENSE" + "licenseFile": "LICENSE" }, "signal-exit@3.0.3": { "licenses": "ISC", "repository": "https://github.com/tapjs/signal-exit", "publisher": "Ben Coe", "email": "ben@npmjs.com", - "path": "/Users/pau/git/moodleapp5/node_modules/signal-exit", - "licenseFile": "node_modules/signal-exit/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "simctl@2.0.0": { "licenses": "MIT", "repository": "https://github.com/ios-control/simctl", "publisher": "Shazron Abdullah", - "path": "/Users/pau/git/moodleapp5/node_modules/simctl", - "licenseFile": "node_modules/simctl/LICENSE" + "licenseFile": "LICENSE" }, "simple-concat@1.0.1": { "licenses": "MIT", @@ -3659,8 +3601,7 @@ "publisher": "Feross Aboukhadijeh", "email": "feross@feross.org", "url": "https://feross.org", - "path": "/Users/pau/git/moodleapp5/node_modules/simple-concat", - "licenseFile": "node_modules/simple-concat/LICENSE" + "licenseFile": "LICENSE" }, "simple-get@3.1.0": { "licenses": "MIT", @@ -3668,15 +3609,13 @@ "publisher": "Feross Aboukhadijeh", "email": "feross@feross.org", "url": "http://feross.org/", - "path": "/Users/pau/git/moodleapp5/node_modules/simple-get", - "licenseFile": "node_modules/simple-get/LICENSE" + "licenseFile": "LICENSE" }, "simple-plist@1.1.1": { "licenses": "MIT", "repository": "https://github.com/wollardj/node-simple-plist", "publisher": "Joe Wollard", - "path": "/Users/pau/git/moodleapp5/node_modules/simple-plist", - "licenseFile": "node_modules/simple-plist/LICENSE" + "licenseFile": "LICENSE" }, "slash@3.0.0": { "licenses": "MIT", @@ -3684,8 +3623,27 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/slash", - "licenseFile": "node_modules/slash/license" + "licenseFile": "license" + }, + "smart-buffer@4.1.0": { + "licenses": "MIT", + "repository": "https://github.com/JoshGlazebrook/smart-buffer", + "publisher": "Josh Glazebrook", + "licenseFile": "LICENSE" + }, + "socks-proxy-agent@5.0.1": { + "licenses": "MIT", + "repository": "https://github.com/TooTallNate/node-socks-proxy-agent", + "publisher": "Nathan Rajlich", + "email": "nathan@tootallnate.net", + "url": "http://n8.io/", + "licenseFile": "README.md" + }, + "socks@2.3.3": { + "licenses": "MIT", + "repository": "https://github.com/JoshGlazebrook/socks", + "publisher": "Josh Glazebrook", + "licenseFile": "LICENSE" }, "spdx-correct@3.1.1": { "licenses": "Apache-2.0", @@ -3693,15 +3651,13 @@ "publisher": "Kyle E. Mitchell", "email": "kyle@kemitchell.com", "url": "https://kemitchell.com", - "path": "/Users/pau/git/moodleapp5/node_modules/spdx-correct", - "licenseFile": "node_modules/spdx-correct/LICENSE" + "licenseFile": "LICENSE" }, "spdx-exceptions@2.3.0": { "licenses": "CC-BY-3.0", "repository": "https://github.com/kemitchell/spdx-exceptions.json", "publisher": "The Linux Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/spdx-exceptions", - "licenseFile": "node_modules/spdx-exceptions/README.md" + "licenseFile": "README.md" }, "spdx-expression-parse@3.0.1": { "licenses": "MIT", @@ -3709,37 +3665,39 @@ "publisher": "Kyle E. Mitchell", "email": "kyle@kemitchell.com", "url": "https://kemitchell.com", - "path": "/Users/pau/git/moodleapp5/node_modules/spdx-expression-parse", - "licenseFile": "node_modules/spdx-expression-parse/LICENSE" + "licenseFile": "LICENSE" }, "spdx-license-ids@3.0.6": { "licenses": "CC0-1.0", "repository": "https://github.com/jslicense/spdx-license-ids", "publisher": "Shinnosuke Watanabe", "url": "https://github.com/shinnn", - "path": "/Users/pau/git/moodleapp5/node_modules/spdx-license-ids", - "licenseFile": "node_modules/spdx-license-ids/README.md" + "licenseFile": "README.md" }, "sshpk@1.16.1": { "licenses": "MIT", "repository": "https://github.com/joyent/node-sshpk", "publisher": "Joyent, Inc", - "path": "/Users/pau/git/moodleapp5/node_modules/sshpk", - "licenseFile": "node_modules/sshpk/LICENSE" + "licenseFile": "LICENSE" + }, + "ssri@8.0.1": { + "licenses": "ISC", + "repository": "https://github.com/npm/ssri", + "publisher": "Kat Marchán", + "email": "kzm@sykosomatic.org", + "licenseFile": "LICENSE.md" }, "statuses@1.5.0": { "licenses": "MIT", "repository": "https://github.com/jshttp/statuses", - "path": "/Users/pau/git/moodleapp5/node_modules/statuses", - "licenseFile": "node_modules/statuses/LICENSE" + "licenseFile": "LICENSE" }, "stream-buffers@2.2.0": { "licenses": "Unlicense", "repository": "https://github.com/samcday/node-stream-buffer", "publisher": "Sam Day", "email": "me@samcday.com.au", - "path": "/Users/pau/git/moodleapp5/node_modules/stream-buffers", - "licenseFile": "node_modules/stream-buffers/README.md" + "licenseFile": "README.md" }, "string-width@1.0.2": { "licenses": "MIT", @@ -3747,8 +3705,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/gauge/node_modules/string-width", - "licenseFile": "node_modules/gauge/node_modules/string-width/license" + "licenseFile": "license" }, "string-width@2.1.1": { "licenses": "MIT", @@ -3756,8 +3713,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/string-width", - "licenseFile": "node_modules/string-width/license" + "licenseFile": "license" }, "string-width@3.1.0": { "licenses": "MIT", @@ -3765,39 +3721,34 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/ansi-align/node_modules/string-width", - "licenseFile": "node_modules/ansi-align/node_modules/string-width/license" + "licenseFile": "license" }, - "string-width@4.2.0": { + "string-width@4.2.2": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/string-width", "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/boxen/node_modules/string-width", - "licenseFile": "node_modules/boxen/node_modules/string-width/license" + "licenseFile": "license" }, "string.prototype.codepointat@0.2.1": { "licenses": "MIT", "repository": "https://github.com/mathiasbynens/String.prototype.codePointAt", "publisher": "Mathias Bynens", "url": "https://mathiasbynens.be/", - "path": "/Users/pau/git/moodleapp5/node_modules/string.prototype.codepointat", - "licenseFile": "node_modules/string.prototype.codepointat/LICENSE-MIT.txt" + "licenseFile": "LICENSE-MIT.txt" }, "string_decoder@1.1.1": { "licenses": "MIT", "repository": "https://github.com/nodejs/string_decoder", - "path": "/Users/pau/git/moodleapp5/node_modules/string_decoder", - "licenseFile": "node_modules/string_decoder/LICENSE" + "licenseFile": "LICENSE" }, "stringify-package@1.0.1": { "licenses": "ISC", "repository": "https://github.com/npm/stringify-package", "publisher": "Kat Marchán", "email": "kzm@zkat.tech", - "path": "/Users/pau/git/moodleapp5/node_modules/stringify-package", - "licenseFile": "node_modules/stringify-package/LICENSE" + "licenseFile": "LICENSE" }, "strip-ansi@3.0.1": { "licenses": "MIT", @@ -3805,8 +3756,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/gauge/node_modules/strip-ansi", - "licenseFile": "node_modules/gauge/node_modules/strip-ansi/license" + "licenseFile": "license" }, "strip-ansi@4.0.0": { "licenses": "MIT", @@ -3814,8 +3764,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/string-width/node_modules/strip-ansi", - "licenseFile": "node_modules/string-width/node_modules/strip-ansi/license" + "licenseFile": "license" }, "strip-ansi@5.2.0": { "licenses": "MIT", @@ -3823,8 +3772,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/strip-ansi", - "licenseFile": "node_modules/strip-ansi/license" + "licenseFile": "license" }, "strip-ansi@6.0.0": { "licenses": "MIT", @@ -3832,8 +3780,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/boxen/node_modules/strip-ansi", - "licenseFile": "node_modules/boxen/node_modules/strip-ansi/license" + "licenseFile": "license" }, "strip-bom@4.0.0": { "licenses": "MIT", @@ -3841,8 +3788,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/strip-bom", - "licenseFile": "node_modules/strip-bom/license" + "licenseFile": "license" }, "strip-eof@1.0.0": { "licenses": "MIT", @@ -3850,8 +3796,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/strip-eof", - "licenseFile": "node_modules/strip-eof/license" + "licenseFile": "license" }, "strip-final-newline@2.0.0": { "licenses": "MIT", @@ -3859,8 +3804,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/strip-final-newline", - "licenseFile": "node_modules/strip-final-newline/license" + "licenseFile": "license" }, "strip-json-comments@2.0.1": { "licenses": "MIT", @@ -3868,8 +3812,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/strip-json-comments", - "licenseFile": "node_modules/strip-json-comments/license" + "licenseFile": "license" }, "supports-color@5.5.0": { "licenses": "MIT", @@ -3877,8 +3820,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/insight/node_modules/supports-color", - "licenseFile": "node_modules/insight/node_modules/supports-color/license" + "licenseFile": "license" }, "supports-color@7.2.0": { "licenses": "MIT", @@ -3886,48 +3828,50 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/supports-color", - "licenseFile": "node_modules/supports-color/license" + "licenseFile": "license" }, - "systeminformation@4.27.7": { + "systeminformation@4.34.23": { "licenses": "MIT", "repository": "https://github.com/sebhildebrandt/systeminformation", "publisher": "Sebastian Hildebrandt", "email": "hildebrandt@plus-innovations.com", "url": "https://plus-innovations.com", - "path": "/Users/pau/git/moodleapp5/node_modules/systeminformation", - "licenseFile": "node_modules/systeminformation/LICENSE" + "licenseFile": "LICENSE" }, "tail@0.4.0": { "licenses": "MIT*", "repository": "https://github.com/lucagrulla/node-tail", "publisher": "Luca Grulla", - "path": "/Users/pau/git/moodleapp5/node_modules/tail", - "licenseFile": "node_modules/tail/README.md" + "licenseFile": "README.md" }, "tar-fs@2.1.1": { "licenses": "MIT", "repository": "https://github.com/mafintosh/tar-fs", "publisher": "Mathias Buus", - "path": "/Users/pau/git/moodleapp5/node_modules/tar-fs", - "licenseFile": "node_modules/tar-fs/LICENSE" + "licenseFile": "LICENSE" }, "tar-stream@2.1.4": { "licenses": "MIT", "repository": "https://github.com/mafintosh/tar-stream", "publisher": "Mathias Buus", "email": "mathiasbuus@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/tar-stream", - "licenseFile": "node_modules/tar-stream/LICENSE" + "licenseFile": "LICENSE" }, - "term-size@2.2.0": { + "tar@6.1.1": { + "licenses": "ISC", + "repository": "https://github.com/npm/node-tar", + "publisher": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/", + "licenseFile": "LICENSE" + }, + "term-size@2.2.1": { "licenses": "MIT", "repository": "https://github.com/sindresorhus/term-size", "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", - "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/term-size", - "licenseFile": "node_modules/term-size/license" + "url": "https://sindresorhus.com", + "licenseFile": "license" }, "through@2.3.8": { "licenses": "MIT", @@ -3935,8 +3879,7 @@ "publisher": "Dominic Tarr", "email": "dominic.tarr@gmail.com", "url": "dominictarr.com", - "path": "/Users/pau/git/moodleapp5/node_modules/through", - "licenseFile": "node_modules/through/LICENSE.APACHE2" + "licenseFile": "LICENSE.APACHE2" }, "tmp@0.0.33": { "licenses": "MIT", @@ -3944,8 +3887,7 @@ "publisher": "KARASZI István", "email": "github@spam.raszi.hu", "url": "http://raszi.hu/", - "path": "/Users/pau/git/moodleapp5/node_modules/external-editor/node_modules/tmp", - "licenseFile": "node_modules/external-editor/node_modules/tmp/LICENSE" + "licenseFile": "LICENSE" }, "tmp@0.2.1": { "licenses": "MIT", @@ -3953,8 +3895,7 @@ "publisher": "KARASZI István", "email": "github@spam.raszi.hu", "url": "http://raszi.hu/", - "path": "/Users/pau/git/moodleapp5/node_modules/tmp", - "licenseFile": "node_modules/tmp/LICENSE" + "licenseFile": "LICENSE" }, "to-readable-stream@1.0.0": { "licenses": "MIT", @@ -3962,74 +3903,64 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/to-readable-stream", - "licenseFile": "node_modules/to-readable-stream/license" + "licenseFile": "license" }, "to-regex-range@5.0.1": { "licenses": "MIT", "repository": "https://github.com/micromatch/to-regex-range", "publisher": "Jon Schlinkert", "url": "https://github.com/jonschlinkert", - "path": "/Users/pau/git/moodleapp5/node_modules/to-regex-range", - "licenseFile": "node_modules/to-regex-range/LICENSE" + "licenseFile": "LICENSE" }, "toidentifier@1.0.0": { "licenses": "MIT", "repository": "https://github.com/component/toidentifier", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/toidentifier", - "licenseFile": "node_modules/toidentifier/LICENSE" + "licenseFile": "LICENSE" }, "tough-cookie@2.5.0": { "licenses": "BSD-3-Clause", "repository": "https://github.com/salesforce/tough-cookie", "publisher": "Jeremy Stashewsky", "email": "jstash@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/request/node_modules/tough-cookie", - "licenseFile": "node_modules/request/node_modules/tough-cookie/LICENSE" + "licenseFile": "LICENSE" }, "tough-cookie@3.0.1": { "licenses": "BSD-3-Clause", "repository": "https://github.com/salesforce/tough-cookie", "publisher": "Jeremy Stashewsky", "email": "jstash@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/tough-cookie", - "licenseFile": "node_modules/tough-cookie/LICENSE" + "licenseFile": "LICENSE" }, "ts-md5@1.2.7": { "licenses": "MIT", "repository": "https://github.com/cotag/ts-md5", - "path": "/Users/pau/git/moodleapp5/node_modules/ts-md5", - "licenseFile": "node_modules/ts-md5/README.md" + "licenseFile": "README.md" }, "tslib@1.13.0": { "licenses": "0BSD", "repository": "https://github.com/Microsoft/tslib", "publisher": "Microsoft Corp.", - "path": "/Users/pau/git/moodleapp5/node_modules/rxjs/node_modules/tslib", - "licenseFile": "node_modules/rxjs/node_modules/tslib/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "tslib@1.14.1": { "licenses": "0BSD", "repository": "https://github.com/Microsoft/tslib", "publisher": "Microsoft Corp.", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic/angular/node_modules/tslib", - "licenseFile": "node_modules/@ionic/angular/node_modules/tslib/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "tslib@2.0.1": { "licenses": "0BSD", "repository": "https://github.com/Microsoft/tslib", "publisher": "Microsoft Corp.", - "path": "/Users/pau/git/moodleapp5/node_modules/tslib", - "licenseFile": "node_modules/tslib/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "tslib@2.2.0": { "licenses": "0BSD", "repository": "https://github.com/Microsoft/tslib", "publisher": "Microsoft Corp.", - "path": "/Users/pau/git/moodleapp5/node_modules/@ionic/core/node_modules/tslib", - "licenseFile": "node_modules/@ionic/core/node_modules/tslib/LICENSE.txt" + "licenseFile": "LICENSE.txt" }, "tunnel-agent@0.6.0": { "licenses": "Apache-2.0", @@ -4037,15 +3968,13 @@ "publisher": "Mikeal Rogers", "email": "mikeal.rogers@gmail.com", "url": "http://www.futurealoof.com", - "path": "/Users/pau/git/moodleapp5/node_modules/tunnel-agent", - "licenseFile": "node_modules/tunnel-agent/LICENSE" + "licenseFile": "LICENSE" }, "tweetnacl@0.14.5": { "licenses": "Unlicense", "repository": "https://github.com/dchest/tweetnacl-js", "publisher": "TweetNaCl-js contributors", - "path": "/Users/pau/git/moodleapp5/node_modules/tweetnacl", - "licenseFile": "node_modules/tweetnacl/LICENSE" + "licenseFile": "LICENSE" }, "type-fest@0.8.1": { "licenses": "(MIT OR CC0-1.0)", @@ -4053,14 +3982,12 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/type-fest", - "licenseFile": "node_modules/type-fest/license" + "licenseFile": "license" }, "type-is@1.6.18": { "licenses": "MIT", "repository": "https://github.com/jshttp/type-is", - "path": "/Users/pau/git/moodleapp5/node_modules/type-is", - "licenseFile": "node_modules/type-is/LICENSE" + "licenseFile": "LICENSE" }, "typedarray-to-buffer@3.1.5": { "licenses": "MIT", @@ -4068,24 +3995,37 @@ "publisher": "Feross Aboukhadijeh", "email": "feross@feross.org", "url": "http://feross.org/", - "path": "/Users/pau/git/moodleapp5/node_modules/typedarray-to-buffer", - "licenseFile": "node_modules/typedarray-to-buffer/LICENSE" + "licenseFile": "LICENSE" }, "underscore@1.11.0": { "licenses": "MIT", "repository": "https://github.com/jashkenas/underscore", "publisher": "Jeremy Ashkenas", "email": "jeremy@documentcloud.org", - "path": "/Users/pau/git/moodleapp5/node_modules/underscore", - "licenseFile": "node_modules/underscore/LICENSE" + "licenseFile": "LICENSE" }, "underscore@1.2.1": { "licenses": "MIT*", "repository": "https://github.com/documentcloud/underscore", "publisher": "Jeremy Ashkenas", "email": "jeremy@documentcloud.org", - "path": "/Users/pau/git/moodleapp5/node_modules/dep-graph/node_modules/underscore", - "licenseFile": "node_modules/dep-graph/node_modules/underscore/LICENSE" + "licenseFile": "LICENSE" + }, + "unique-filename@1.1.1": { + "licenses": "ISC", + "repository": "https://github.com/iarna/unique-filename", + "publisher": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org/", + "licenseFile": "LICENSE" + }, + "unique-slug@2.0.2": { + "licenses": "ISC", + "repository": "https://github.com/iarna/unique-slug", + "publisher": "Rebecca Turner", + "email": "me@re-becca.org", + "url": "http://re-becca.org", + "licenseFile": "LICENSE" }, "unique-string@2.0.0": { "licenses": "MIT", @@ -4093,32 +4033,28 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/unique-string", - "licenseFile": "node_modules/unique-string/license" + "licenseFile": "license" }, "universalify@2.0.0": { "licenses": "MIT", "repository": "https://github.com/RyanZim/universalify", "publisher": "Ryan Zimmerman", "email": "opensrc@ryanzim.com", - "path": "/Users/pau/git/moodleapp5/node_modules/universalify", - "licenseFile": "node_modules/universalify/LICENSE" + "licenseFile": "LICENSE" }, "unorm@1.6.0": { "licenses": "MIT*", "repository": "https://github.com/walling/unorm", "publisher": "Bjarke Walling", "email": "bwp@bwp.dk", - "path": "/Users/pau/git/moodleapp5/node_modules/unorm", - "licenseFile": "node_modules/unorm/LICENSE.md" + "licenseFile": "LICENSE.md" }, "unpipe@1.0.0": { "licenses": "MIT", "repository": "https://github.com/stream-utils/unpipe", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/unpipe", - "licenseFile": "node_modules/unpipe/LICENSE" + "licenseFile": "LICENSE" }, "update-notifier@4.1.3": { "licenses": "BSD-2-Clause", @@ -4126,16 +4062,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/update-notifier", - "licenseFile": "node_modules/update-notifier/license" + "licenseFile": "license" }, "uri-js@4.4.0": { "licenses": "BSD-2-Clause", "repository": "https://github.com/garycourt/uri-js", "publisher": "Gary Court", "email": "gary.court@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/uri-js", - "licenseFile": "node_modules/uri-js/LICENSE" + "licenseFile": "LICENSE" }, "url-parse-lax@3.0.0": { "licenses": "MIT", @@ -4143,8 +4077,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/url-parse-lax", - "licenseFile": "node_modules/url-parse-lax/license" + "licenseFile": "license" }, "util-deprecate@1.0.2": { "licenses": "MIT", @@ -4152,8 +4085,7 @@ "publisher": "Nathan Rajlich", "email": "nathan@tootallnate.net", "url": "http://n8.io/", - "path": "/Users/pau/git/moodleapp5/node_modules/util-deprecate", - "licenseFile": "node_modules/util-deprecate/LICENSE" + "licenseFile": "LICENSE" }, "utils-merge@1.0.1": { "licenses": "MIT", @@ -4161,27 +4093,23 @@ "publisher": "Jared Hanson", "email": "jaredhanson@gmail.com", "url": "http://www.jaredhanson.net/", - "path": "/Users/pau/git/moodleapp5/node_modules/utils-merge", - "licenseFile": "node_modules/utils-merge/LICENSE" + "licenseFile": "LICENSE" }, "uuid@3.4.0": { "licenses": "MIT", "repository": "https://github.com/uuidjs/uuid", - "path": "/Users/pau/git/moodleapp5/node_modules/uuid", - "licenseFile": "node_modules/uuid/LICENSE.md" + "licenseFile": "LICENSE.md" }, "uuid@7.0.3": { "licenses": "MIT", "repository": "https://github.com/uuidjs/uuid", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-ios/node_modules/uuid", - "licenseFile": "node_modules/cordova-ios/node_modules/uuid/LICENSE.md" + "licenseFile": "LICENSE.md" }, "valid-identifier@0.0.2": { "licenses": "Apache-2.0", "repository": "https://github.com/purplecabbage/valid-identifier", "publisher": "Jesse MacFadyen", - "path": "/Users/pau/git/moodleapp5/node_modules/valid-identifier", - "licenseFile": "node_modules/valid-identifier/LICENSE" + "licenseFile": "LICENSE" }, "validate-npm-package-license@3.0.4": { "licenses": "Apache-2.0", @@ -4189,42 +4117,36 @@ "publisher": "Kyle E. Mitchell", "email": "kyle@kemitchell.com", "url": "https://kemitchell.com", - "path": "/Users/pau/git/moodleapp5/node_modules/validate-npm-package-license", - "licenseFile": "node_modules/validate-npm-package-license/LICENSE" + "licenseFile": "LICENSE" }, "validate-npm-package-name@3.0.0": { "licenses": "ISC", "repository": "https://github.com/npm/validate-npm-package-name", "publisher": "zeke", - "path": "/Users/pau/git/moodleapp5/node_modules/validate-npm-package-name", - "licenseFile": "node_modules/validate-npm-package-name/LICENSE" + "licenseFile": "LICENSE" }, "vary@1.1.2": { "licenses": "MIT", "repository": "https://github.com/jshttp/vary", "publisher": "Douglas Christopher Wilson", "email": "doug@somethingdoug.com", - "path": "/Users/pau/git/moodleapp5/node_modules/vary", - "licenseFile": "node_modules/vary/LICENSE" + "licenseFile": "LICENSE" }, "verror@1.10.0": { "licenses": "MIT", "repository": "https://github.com/davepacheco/node-verror", - "path": "/Users/pau/git/moodleapp5/node_modules/verror", - "licenseFile": "node_modules/verror/LICENSE" + "licenseFile": "LICENSE" }, "webrtc-adapter@3.4.3": { "licenses": "BSD-3-Clause", "repository": "https://github.com/webrtc/adapter", - "path": "/Users/pau/git/moodleapp5/node_modules/webrtc-adapter", - "licenseFile": "node_modules/webrtc-adapter/LICENSE.md" + "licenseFile": "LICENSE.md" }, "which-pm-runs@1.0.0": { "licenses": "MIT", "repository": "https://github.com/zkochan/which-pm-runs", "publisher": "Zoltan Kochan", - "path": "/Users/pau/git/moodleapp5/node_modules/which-pm-runs", - "licenseFile": "node_modules/which-pm-runs/LICENSE" + "licenseFile": "LICENSE" }, "which@1.3.1": { "licenses": "ISC", @@ -4232,8 +4154,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release/node_modules/which", - "licenseFile": "node_modules/windows-release/node_modules/which/LICENSE" + "licenseFile": "LICENSE" }, "which@2.0.2": { "licenses": "ISC", @@ -4241,8 +4162,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me", - "path": "/Users/pau/git/moodleapp5/node_modules/which", - "licenseFile": "node_modules/which/LICENSE" + "licenseFile": "LICENSE" }, "wide-align@1.1.3": { "licenses": "ISC", @@ -4250,8 +4170,7 @@ "publisher": "Rebecca Turner", "email": "me@re-becca.org", "url": "http://re-becca.org/", - "path": "/Users/pau/git/moodleapp5/node_modules/wide-align", - "licenseFile": "node_modules/wide-align/LICENSE" + "licenseFile": "LICENSE" }, "widest-line@3.1.0": { "licenses": "MIT", @@ -4259,8 +4178,7 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/widest-line", - "licenseFile": "node_modules/widest-line/license" + "licenseFile": "license" }, "windows-release@3.3.3": { "licenses": "MIT", @@ -4268,16 +4186,14 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "https://sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/windows-release", - "licenseFile": "node_modules/windows-release/license" + "licenseFile": "license" }, "with-open-file@0.1.7": { "licenses": "MIT", "repository": "https://github.com/raphinesse/with-open-file", "publisher": "Raphael von der Grün", "email": "raphinesse@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/with-open-file", - "licenseFile": "node_modules/with-open-file/LICENSE" + "licenseFile": "LICENSE" }, "wrappy@1.0.2": { "licenses": "ISC", @@ -4285,8 +4201,7 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/wrappy", - "licenseFile": "node_modules/wrappy/LICENSE" + "licenseFile": "LICENSE" }, "write-file-atomic@2.4.3": { "licenses": "ISC", @@ -4294,8 +4209,7 @@ "publisher": "Rebecca Turner", "email": "me@re-becca.org", "url": "http://re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/conf/node_modules/write-file-atomic", - "licenseFile": "node_modules/conf/node_modules/write-file-atomic/LICENSE" + "licenseFile": "LICENSE" }, "write-file-atomic@3.0.3": { "licenses": "ISC", @@ -4303,22 +4217,19 @@ "publisher": "Rebecca Turner", "email": "me@re-becca.org", "url": "http://re-becca.org", - "path": "/Users/pau/git/moodleapp5/node_modules/write-file-atomic", - "licenseFile": "node_modules/write-file-atomic/LICENSE" + "licenseFile": "LICENSE" }, "xcode@2.1.0": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-node-xcode", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/xcode", - "licenseFile": "node_modules/xcode/LICENSE" + "licenseFile": "LICENSE" }, "xcode@3.0.1": { "licenses": "Apache-2.0", "repository": "https://github.com/apache/cordova-node-xcode", "publisher": "Apache Software Foundation", - "path": "/Users/pau/git/moodleapp5/node_modules/cordova-ios/node_modules/xcode", - "licenseFile": "node_modules/cordova-ios/node_modules/xcode/LICENSE", + "licenseFile": "LICENSE", "noticeFile": "node_modules/cordova-ios/node_modules/xcode/NOTICE" }, "xdg-basedir@4.0.0": { @@ -4327,23 +4238,20 @@ "publisher": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com", - "path": "/Users/pau/git/moodleapp5/node_modules/xdg-basedir", - "licenseFile": "node_modules/xdg-basedir/license" + "licenseFile": "license" }, "xml-escape@1.1.0": { "licenses": "MIT*", "repository": "https://github.com/miketheprogrammer/xml-escape", "publisher": "Michael Hernandez - michael.hernandez1988@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/xml-escape", - "licenseFile": "node_modules/xml-escape/LICENSE" + "licenseFile": "LICENSE" }, "xmlbuilder@9.0.7": { "licenses": "MIT", "repository": "https://github.com/oozcitak/xmlbuilder-js", "publisher": "Ozgur Ozcitak", "email": "oozcitak@gmail.com", - "path": "/Users/pau/git/moodleapp5/node_modules/xmlbuilder", - "licenseFile": "node_modules/xmlbuilder/LICENSE" + "licenseFile": "LICENSE" }, "xmldom@0.1.31": { "licenses": "MIT*", @@ -4351,8 +4259,7 @@ "publisher": "jindw", "email": "jindw@xidea.org", "url": "http://www.xidea.org", - "path": "/Users/pau/git/moodleapp5/node_modules/xmldom", - "licenseFile": "node_modules/xmldom/LICENSE" + "licenseFile": "LICENSE" }, "yallist@4.0.0": { "licenses": "ISC", @@ -4360,15 +4267,12 @@ "publisher": "Isaac Z. Schlueter", "email": "i@izs.me", "url": "http://blog.izs.me/", - "path": "/Users/pau/git/moodleapp5/node_modules/yallist", - "licenseFile": "node_modules/yallist/LICENSE" + "licenseFile": "LICENSE" }, "zone.js@0.10.3": { "licenses": "MIT", "repository": "https://github.com/angular/angular", "publisher": "Brian Ford", - "path": "/Users/pau/git/moodleapp5/node_modules/zone.js", - "licenseFile": "node_modules/zone.js/LICENSE" + "licenseFile": "LICENSE" } } - diff --git a/moodle.config.json b/moodle.config.json index 79e6c5d38..7e6907749 100644 --- a/moodle.config.json +++ b/moodle.config.json @@ -1,8 +1,8 @@ { "app_id": "com.moodle.moodlemobile", "appname": "Moodle Mobile", - "versioncode": 3950, - "versionname": "3.9.5", + "versioncode": 40000, + "versionname": "4.0.0", "cache_update_frequency_usually": 420000, "cache_update_frequency_often": 1200000, "cache_update_frequency_sometimes": 3600000, @@ -30,6 +30,7 @@ "he": "עברית", "hi": "हिंदी", "hr": "Hrvatski", + "hsb": "Hornjoserbsski", "hu": "magyar", "hy": "Հայերեն", "id": "Indonesian", @@ -38,6 +39,7 @@ "km": "ខ្មែរ", "kn": "ಕನ್ನಡ", "ko": "한국어", + "lo": "ລາວ", "lt": "Lietuvių", "lv": "Latviešu", "mn": "Монгол", @@ -62,15 +64,14 @@ "zh-tw": "正體中文" }, "wsservice": "moodle_mobile_app", - "wsextservice": "local_mobile", "demo_sites": { "student": { - "url": "https:\/\/school.moodledemo.net", + "url": "https://school.moodledemo.net", "username": "student", "password": "moodle" }, "teacher": { - "url": "https:\/\/school.moodledemo.net", + "url": "https://school.moodledemo.net", "username": "teacher", "password": "moodle" } @@ -88,7 +89,7 @@ "onlyallowlistedsites": false, "skipssoconfirmation": false, "forcedefaultlanguage": false, - "privacypolicy": "https:\/\/moodle.net\/moodle-app-privacy\/", + "privacypolicy": "https://moodle.net/moodle-app-privacy/", "notificoncolor": "#f98012", "enableanalytics": false, "enableonboarding": true, @@ -98,5 +99,8 @@ "appstores": { "android": "com.moodle.moodlemobile", "ios": "id633359593" - } + }, + "wsrequestqueuelimit": 10, + "wsrequestqueuedelay": 100, + "calendarreminderdefaultvalue": 3600 } diff --git a/package-lock.json b/package-lock.json index 89128236b..ccfedf471 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,31229 @@ { "name": "moodlemobile", - "version": "3.9.5", - "lockfileVersion": 1, + "version": "4.0.0", + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "moodlemobile", + "version": "4.0.0", + "license": "Apache-2.0", + "dependencies": { + "@angular/animations": "10.0.14", + "@angular/common": "10.0.14", + "@angular/core": "10.0.14", + "@angular/forms": "10.0.14", + "@angular/platform-browser": "10.0.14", + "@angular/platform-browser-dynamic": "10.0.14", + "@angular/router": "10.0.14", + "@ionic-native/badge": "5.33.0", + "@ionic-native/camera": "5.33.0", + "@ionic-native/chooser": "5.33.0", + "@ionic-native/clipboard": "5.33.0", + "@ionic-native/core": "5.33.0", + "@ionic-native/device": "5.33.0", + "@ionic-native/diagnostic": "5.33.0", + "@ionic-native/file": "5.33.0", + "@ionic-native/file-opener": "5.33.0", + "@ionic-native/file-transfer": "5.33.0", + "@ionic-native/geolocation": "5.33.0", + "@ionic-native/http": "5.33.0", + "@ionic-native/in-app-browser": "5.33.0", + "@ionic-native/ionic-webview": "5.33.0", + "@ionic-native/keyboard": "5.33.0", + "@ionic-native/local-notifications": "5.33.0", + "@ionic-native/media": "5.33.0", + "@ionic-native/media-capture": "5.33.0", + "@ionic-native/network": "5.33.0", + "@ionic-native/push": "5.33.0", + "@ionic-native/qr-scanner": "5.33.0", + "@ionic-native/splash-screen": "5.33.0", + "@ionic-native/sqlite": "5.33.0", + "@ionic-native/status-bar": "5.33.0", + "@ionic-native/web-intent": "5.33.0", + "@ionic-native/zip": "5.33.0", + "@ionic/angular": "5.9.2", + "@moodlehq/cordova-plugin-file-transfer": "1.7.1-moodle.5", + "@moodlehq/cordova-plugin-inappbrowser": "5.0.0-moodle.3", + "@moodlehq/cordova-plugin-ionic-webview": "5.0.0-moodle.1", + "@moodlehq/cordova-plugin-local-notification": "0.9.0-moodle.3", + "@moodlehq/cordova-plugin-qrscanner": "3.0.1-moodle.2", + "@moodlehq/cordova-plugin-zip": "3.1.0-moodle.1", + "@moodlehq/phonegap-plugin-push": "2.0.0-moodle.4", + "@ngx-translate/core": "13.0.0", + "@ngx-translate/http-loader": "6.0.0", + "@types/chart.js": "2.9.31", + "@types/cordova": "0.0.34", + "@types/dom-mediacapture-record": "1.0.7", + "chart.js": "2.9.4", + "com-darryncampbell-cordova-plugin-intent": "2.2.0", + "cordova": "11.0.0", + "cordova-android": "10.1.1", + "cordova-clipboard": "1.3.0", + "cordova-ios": "6.2.0", + "cordova-plugin-add-swift-support": "2.0.2", + "cordova-plugin-advanced-http": "3.2.2", + "cordova-plugin-badge": "0.8.8", + "cordova-plugin-camera": "6.0.0", + "cordova-plugin-chooser": "1.3.2", + "cordova-plugin-customurlscheme": "5.0.2", + "cordova-plugin-device": "2.0.3", + "cordova-plugin-file": "6.0.2", + "cordova-plugin-file-opener2": "3.0.5", + "cordova-plugin-geolocation": "4.1.0", + "cordova-plugin-ionic-keyboard": "2.2.0", + "cordova-plugin-media": "5.0.4", + "cordova-plugin-media-capture": "3.0.3", + "cordova-plugin-network-information": "3.0.0", + "cordova-plugin-prevent-override": "1.0.1", + "cordova-plugin-splashscreen": "6.0.0", + "cordova-plugin-statusbar": "3.0.0", + "cordova-plugin-wkuserscript": "1.0.1", + "cordova-plugin-wkwebview-cookies": "1.0.1", + "cordova-sqlite-storage": "6.0.0", + "cordova.plugins.diagnostic": "6.1.1", + "core-js": "3.9.1", + "es6-promise-plugin": "4.2.2", + "hammerjs": "2.0.8", + "jszip": "3.7.1", + "mathjax": "2.7.7", + "moment": "2.29.2", + "nl.kingsquare.cordova.background-audio": "1.0.1", + "rxjs": "6.5.5", + "ts-md5": "1.2.7", + "tslib": "2.3.1", + "zone.js": "0.10.3" + }, + "devDependencies": { + "@angular-builders/custom-webpack": "10.0.1", + "@angular-devkit/architect": "0.1202.7", + "@angular-devkit/build-angular": "0.1000.8", + "@angular-eslint/builder": "4.2.0", + "@angular-eslint/eslint-plugin": "4.2.0", + "@angular-eslint/eslint-plugin-template": "4.2.0", + "@angular-eslint/schematics": "4.2.0", + "@angular-eslint/template-parser": "4.2.0", + "@angular/cli": "10.0.8", + "@angular/compiler": "10.0.14", + "@angular/compiler-cli": "10.0.14", + "@angular/language-service": "10.0.14", + "@ionic/angular-toolkit": "2.3.3", + "@ionic/cli": "6.19.0", + "@types/faker": "5.1.3", + "@types/node": "12.12.64", + "@types/resize-observer-browser": "0.1.5", + "@types/webpack-env": "1.16.0", + "@typescript-eslint/eslint-plugin": "4.22.0", + "@typescript-eslint/parser": "4.22.0", + "check-es-compat": "1.1.1", + "cordova-plugin-androidx-adapter": "1.1.3", + "cordova-plugin-screen-orientation": "^3.0.2", + "cross-env": "7.0.3", + "eslint": "7.25.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-header": "3.1.1", + "eslint-plugin-import": "2.22.1", + "eslint-plugin-jest": "24.3.6", + "eslint-plugin-jsdoc": "32.3.3", + "eslint-plugin-prefer-arrow": "1.2.3", + "eslint-plugin-promise": "5.1.0", + "faker": "5.1.0", + "fs-extra": "9.1.0", + "gulp": "4.0.2", + "gulp-clip-empty-files": "0.1.2", + "gulp-concat": "2.6.1", + "gulp-flatten": "0.4.0", + "gulp-htmlmin": "5.0.1", + "gulp-rename": "2.0.0", + "gulp-slash": "1.1.3", + "jest": "26.5.2", + "jest-preset-angular": "8.3.1", + "jsonc-parser": "2.3.1", + "native-run": "1.4.0", + "terser-webpack-plugin": "4.2.3", + "ts-jest": "26.4.1", + "ts-node": "8.3.0", + "typescript": "3.9.9" + }, + "engines": { + "node": ">=14.15.0 <15" + }, + "optionalDependencies": { + "keytar": "7.2.0" + } + }, + "node_modules/@angular-builders/custom-webpack": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-10.0.1.tgz", + "integrity": "sha512-YDy5zEKVwXdoXLjmbsY6kGaEbmunQxaPipxrwLUc9hIjRLU2WcrX9vopf1R9Pgj4POad73IPBNGu+ibqNRFIEQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": ">=0.1000.0 < 0.1100.0", + "@angular-devkit/build-angular": ">=0.1000.0 < 0.1100.0", + "@angular-devkit/core": "^10.0.0", + "lodash": "^4.17.15", + "ts-node": "^9.0.0", + "webpack-merge": "^4.2.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@angular-builders/custom-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1002.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.3.tgz", + "integrity": "sha512-7ainXRNO1njZ6bBbJXGpMzCh0OYrzuIRe/+zRj0ncV1YfEsJb2yWBuiza0+y2Ljco7hdd4wr+7eJm7cfn+NvAw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.2.3", + "rxjs": "6.6.2" + }, + "engines": { + "node": ">= 10.13.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-builders/custom-webpack/node_modules/@angular-devkit/core": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz", + "integrity": "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA==", + "dev": true, + "dependencies": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-builders/custom-webpack/node_modules/ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-builders/custom-webpack/node_modules/rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-builders/custom-webpack/node_modules/ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/@angular-builders/custom-webpack/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1202.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.7.tgz", + "integrity": "sha512-zqqw3h8jMDYsRrXUNY1J8xtUl6wmBO++yTka+CoEIFetNdLdoWmb5VpaA81i0aSBhXBgnBUUFvqZGdiI7BbV8A==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "12.2.7", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular": { + "version": "0.1000.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1000.8.tgz", + "integrity": "sha512-wwDN2oadQvYPL7lDmvGsoWQjW++0ZnxWk1QVlABGhBSIs8Uxs26Hjd5YNUSsvJavBkqb1UZIOilqzb4dig5MIA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1000.8", + "@angular-devkit/build-optimizer": "0.1000.8", + "@angular-devkit/build-webpack": "0.1000.8", + "@angular-devkit/core": "10.0.8", + "@babel/core": "7.9.6", + "@babel/generator": "7.9.6", + "@babel/plugin-transform-runtime": "7.9.6", + "@babel/preset-env": "7.9.6", + "@babel/runtime": "7.9.6", + "@babel/template": "7.8.6", + "@jsdevtools/coverage-istanbul-loader": "3.0.3", + "@ngtools/webpack": "10.0.8", + "ajv": "6.12.3", + "autoprefixer": "9.8.0", + "babel-loader": "8.1.0", + "browserslist": "^4.9.1", + "cacache": "15.0.3", + "caniuse-lite": "^1.0.30001032", + "circular-dependency-plugin": "5.2.0", + "copy-webpack-plugin": "6.0.3", + "core-js": "3.6.4", + "css-loader": "3.5.3", + "cssnano": "4.1.10", + "file-loader": "6.0.0", + "find-cache-dir": "3.3.1", + "glob": "7.1.6", + "jest-worker": "26.0.0", + "karma-source-map-support": "1.4.0", + "less-loader": "6.1.0", + "license-webpack-plugin": "2.2.0", + "loader-utils": "2.0.0", + "mini-css-extract-plugin": "0.9.0", + "minimatch": "3.0.4", + "open": "7.0.4", + "parse5": "4.0.0", + "pnp-webpack-plugin": "1.6.4", + "postcss": "7.0.31", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "4.0.1", + "regenerator-runtime": "0.13.5", + "resolve-url-loader": "3.1.1", + "rimraf": "3.0.2", + "rollup": "2.10.9", + "rxjs": "6.5.5", + "sass": "1.26.5", + "sass-loader": "8.0.2", + "semver": "7.3.2", + "source-map": "0.7.3", + "source-map-loader": "1.0.0", + "source-map-support": "0.5.19", + "speed-measure-webpack-plugin": "1.3.3", + "style-loader": "1.2.1", + "stylus": "0.54.7", + "stylus-loader": "3.0.2", + "terser": "4.7.0", + "terser-webpack-plugin": "3.0.1", + "tree-kill": "1.2.2", + "webpack": "4.43.0", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.11.0", + "webpack-merge": "4.2.2", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.4.1", + "worker-plugin": "4.0.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": ">=10.0.0-next.0 < 11", + "typescript": ">=3.9 < 3.10" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1000.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.8.tgz", + "integrity": "sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.0.8", + "rxjs": "6.5.5" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", + "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "dev": true, + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/open": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", + "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/terser-webpack-plugin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", + "dev": true, + "dependencies": { + "cacache": "^15.0.3", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.0.0", + "source-map": "^0.6.1", + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/terser-webpack-plugin/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular-devkit/build-optimizer": { + "version": "0.1000.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1000.8.tgz", + "integrity": "sha512-esODHuTGEEMx1SmLUq03VAMly8gZUd1vRuvZeKS5HqKwDg8ZzcI7/25BuuUSlyST+6BEdjo2gnmagQnG0VBdQw==", + "dev": true, + "dependencies": { + "loader-utils": "2.0.0", + "source-map": "0.7.3", + "tslib": "2.0.0", + "webpack-sources": "1.4.3" + }, + "bin": { + "build-optimizer": "src/build-optimizer/cli.js" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-optimizer/node_modules/tslib": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz", + "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1000.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1000.8.tgz", + "integrity": "sha512-y/U+dV5N8W7KECncGSKQWoUH/DFNZCseczyl6LAd8bc0fMr8Z0TAIe8OXj+5CSRRdejWfRIxGtNWM+L2kTCU8A==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1000.8", + "@angular-devkit/core": "10.0.8", + "rxjs": "6.5.5" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^4.6.0", + "webpack-dev-server": "^3.1.4" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1000.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.8.tgz", + "integrity": "sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.0.8", + "rxjs": "6.5.5" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", + "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "dev": true, + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core": { + "version": "12.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.7.tgz", + "integrity": "sha512-WeLlDZaudpx10OGDPfVcWu/CaEWiWzAaLTUQz0Ww/yM+01FxR/P8yeH1sYAV1MS6d6KHvXGw7Lpf8PV7IA/zHA==", + "dev": true, + "dependencies": { + "ajv": "8.6.2", + "ajv-formats": "2.1.0", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.14.1 || >=14.0.0", + "npm": "^6.11.0 || ^7.5.6", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-10.0.8.tgz", + "integrity": "sha512-p2PjvrExuzOe/azyOEcBeIgwZIk4D6VeLkJf/KVjhXOVu13pjIXHX7/qWl+IYnbtj3NZGHqXM5Cr8nxsJNIMpw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.0.8", + "ora": "4.0.4", + "rxjs": "6.5.5" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", + "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "dev": true, + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-4.2.0.tgz", + "integrity": "sha512-qM4hpweuQ14ul8CU6LKpUWFZs6POUE7HZKdTllUrYuoZMrTpNB1XGelR0pweYzbfo4XRnUaO1NVgWhWOWiD5MA==", + "dev": true, + "peerDependencies": { + "@angular/cli": ">= 11.2.0 < 12.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-4.2.0.tgz", + "integrity": "sha512-G8D8Pso6GcHW8vFkUSvgoKPIOtGTqO+eb5aytGtpogMgzxBRyr0juU/9Uz5dAhO6TOERIj1gPpJQ61R/n/Aaew==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.16.1" + }, + "peerDependencies": { + "@angular/compiler": ">= 11.2.0 < 12.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-4.2.0.tgz", + "integrity": "sha512-LC8qqqqVmA/OJAsUt6fQCXLmWP5BL30XFvVsPtrORdxMFt0HI1gvkuz5EVak7PeAXEmerdVarNZr5zmCXIWf3g==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.16.1", + "aria-query": "^4.2.2", + "axobject-query": "^2.2.0" + }, + "peerDependencies": { + "@angular-eslint/template-parser": "*", + "@angular/compiler": ">= 11.2.0 < 12.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/experimental-utils": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", + "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/scope-manager": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.16.1.tgz", + "integrity": "sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.16.1.tgz", + "integrity": "sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/experimental-utils": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.16.1.tgz", + "integrity": "sha512-0Hm3LSlMYFK17jO4iY3un1Ve9x1zLNn4EM50Lia+0EV99NdbK+cn0er7HC7IvBA23mBg3P+8dUkMXy4leL33UQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.16.1", + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/typescript-estree": "4.16.1", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.16.1.tgz", + "integrity": "sha512-6IlZv9JaurqV0jkEg923cV49aAn8V6+1H1DRfhRcvZUrptQ+UtSKHb5kwTayzOYTJJ/RsYZdcvhOEKiBLyc0Cw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.16.1.tgz", + "integrity": "sha512-nnKqBwMgRlhzmJQF8tnFDZWfunXmJyuXj55xc8Kbfup4PbkzdoDXZvzN8//EiKR27J6vUSU8j4t37yUuYPiLqA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.16.1.tgz", + "integrity": "sha512-m8I/DKHa8YbeHt31T+UGd/l8Kwr0XCTCZL3H4HMvvLCT7HU9V7yYdinTOv1gf/zfqNeDcCgaFH2BMsS8x6NvJg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "@typescript-eslint/visitor-keys": "4.16.1", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.16.1.tgz", + "integrity": "sha512-s/aIP1XcMkEqCNcPQtl60ogUYjSM8FU2mq1O7y5cFf3Xcob1z1iXWNB6cC43Op+NGRTFgGolri6s8z/efA9i1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.16.1", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@angular-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@angular-eslint/schematics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-4.2.0.tgz", + "integrity": "sha512-aohGcfYUqN2hFLWaZoOqkLDyYVDFoLC3LwgIknoaDqWkvFG/RUTg1X1pCFjddLQYP5ist8+OppHH+gnYMbftEw==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "4.2.0", + "@angular-eslint/eslint-plugin-template": "4.2.0", + "ignore": "5.1.8", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "peerDependencies": { + "@angular/cli": ">= 11.2.0 < 12.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-4.2.0.tgz", + "integrity": "sha512-77lJ9MDNWmW4ik9l3g149iO9SGRx3qLGZvfSTwmbPxpCgNripWerla9Ia1X+gLkitI8CLpcpiZybxH3EWxj/qQ==", + "dev": true, + "dependencies": { + "eslint-scope": "^5.1.0" + }, + "peerDependencies": { + "@angular/compiler": ">= 11.2.0 < 12.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@angular/animations": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-10.0.14.tgz", + "integrity": "sha512-0BOGQOuaudIG0pq6FAnG55teKM7tEQZdIwdoOf0okhh9n0cFWSWRUjvUxWt25bWswlO+HxELyJioiRUvVSES4g==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": "10.0.14" + } + }, + "node_modules/@angular/cli": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-10.0.8.tgz", + "integrity": "sha512-unTteffLepsFw7qQulHOLLyLqCpQMOaZo0WO4x6cQGcW2mc0WgwnwBW2JDYMx1U2434t/Q13LqYMPNYWyCGsog==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@angular-devkit/architect": "0.1000.8", + "@angular-devkit/core": "10.0.8", + "@angular-devkit/schematics": "10.0.8", + "@schematics/angular": "10.0.8", + "@schematics/update": "0.1000.8", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.1.1", + "ini": "1.3.5", + "inquirer": "7.1.0", + "npm-package-arg": "8.0.1", + "npm-pick-manifest": "6.1.0", + "open": "7.0.4", + "pacote": "9.5.12", + "read-package-tree": "5.3.1", + "rimraf": "3.0.2", + "semver": "7.3.2", + "symbol-observable": "1.2.0", + "universal-analytics": "0.4.20", + "uuid": "8.1.0" + }, + "bin": { + "ng": "bin/ng" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.1000.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1000.8.tgz", + "integrity": "sha512-2AqPbiEugtPxNz4MGhLh+imUVelhW9h1cdJs2AbxZosIxftPb5DNDQUSAwVmRGp4CtcXVrlvcDwc0f4Fw1aiIA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.0.8", + "rxjs": "6.5.5" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", + "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "dev": true, + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/cli/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular/cli/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@angular/cli/node_modules/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, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/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, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@angular/cli/node_modules/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 + }, + "node_modules/@angular/cli/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/inquirer": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular/cli/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@angular/cli/node_modules/open": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-7.0.4.tgz", + "integrity": "sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/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, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/cli/node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/cli/node_modules/uuid": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz", + "integrity": "sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@angular/common": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-10.0.14.tgz", + "integrity": "sha512-EOAuaMt2HwJF3DtIJ/ksHtnF8Pqh5K2rWISYLEs9R3WNaSGn74kbCODAT4pNhI8P22Ykl3H4FmQUgnDZ3uDAUg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": "10.0.14", + "rxjs": "^6.5.3" + } + }, + "node_modules/@angular/compiler": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.14.tgz", + "integrity": "sha512-lYNo6/MmnYAVFoDQDBB6HMFd9zHg3RHXc6hn+wchU0XSWiIsg6WYHbKOb/DyqUEyKebzy0gSKZf7gUeZHtj62Q==", + "dependencies": { + "tslib": "^2.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-10.0.14.tgz", + "integrity": "sha512-WK+S90sjc+3iMo8/CuuAX0RdGFwyA9esqqC5fYG/MDZjKuPuhogiimmR0rY3P1Th7B9di8x012xiILbf4GsGUQ==", + "dev": true, + "dependencies": { + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "fs-extra": "4.0.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "semver": "^6.3.0", + "source-map": "^0.6.1", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.0.0", + "yargs": "15.3.0" + }, + "bin": { + "ivy-ngcc": "ngcc/main-ivy-ngcc.js", + "ng-xi18n": "src/extract_i18n.js", + "ngc": "src/main.js", + "ngcc": "ngcc/main-ngcc.js" + }, + "engines": { + "node": ">=10.0" + }, + "peerDependencies": { + "@angular/compiler": "10.0.14", + "typescript": ">=3.9 <4.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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 + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz", + "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@angular/core": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-10.0.14.tgz", + "integrity": "sha512-m+c9g6fA/gE+6K7It01b6r8TEmbuFjUZajQ9gG/pzist0mTBcqfvn0O4h5X+ebnSgw/bbnnp+4PbaXEi1pOWZQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3", + "zone.js": "~0.10.3" + } + }, + "node_modules/@angular/forms": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-10.0.14.tgz", + "integrity": "sha512-McKh3rXDlAE7qmCnyWKENb2HhqAT+1dsAfChuqs0w8jhKkoRgA00RDFee6dZ6XQCc907DwuV0K8+wC3CvBp35w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "10.0.14", + "@angular/core": "10.0.14", + "@angular/platform-browser": "10.0.14", + "rxjs": "^6.5.3" + } + }, + "node_modules/@angular/language-service": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-10.0.14.tgz", + "integrity": "sha512-QQLYUjD0T6u2hLNYXUEUbupAGsz5egmhCAckaQojvXCe3SLL/hQsrK4odrNuspy7TvMB0H5ZNEHGlF6m/WLZ3g==", + "dev": true + }, + "node_modules/@angular/platform-browser": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.0.14.tgz", + "integrity": "sha512-DcBZ1wt2TwtXrdcmCTWanAzu2Vxk5Uvioam0UcDxcgXD84T2fHipyfZVn07fMqRvzFQj45tDNAEevFBnGZar4w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/animations": "10.0.14", + "@angular/common": "10.0.14", + "@angular/core": "10.0.14" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-10.0.14.tgz", + "integrity": "sha512-PPCAiNh/JSuQNKXOhj3a8CTFdVhTgF/EpGtaotnVr/BfbJMeFImKo7m2QQOTsAFaEP2DurSHnofPnMWAfHS2mg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "10.0.14", + "@angular/compiler": "10.0.14", + "@angular/core": "10.0.14", + "@angular/platform-browser": "10.0.14" + } + }, + "node_modules/@angular/router": { + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-10.0.14.tgz", + "integrity": "sha512-VWzaNyPZDY99TMszV1GlXJgVOxXsjhJrsv3mIcjaz1dfdlKOeKTVDLdnyXfP9CkwE3PRmvG7eSXppIj6nn9BpQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": "10.0.14", + "@angular/core": "10.0.14", + "@angular/platform-browser": "10.0.14", + "rxjs": "^6.5.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.11.0.tgz", + "integrity": "sha512-TPSvJfv73ng0pfnEOh17bYMPQbI95+nGWc71Ss4vZdRBHTDqmM9Z8ZV4rYz8Ks7sfzc95n30k6ODIq5UGnXcYQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "node_modules/@babel/compat-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/core": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz", + "integrity": "sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.6", + "@babel/parser": "^7.9.6", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.6", + "@babel/types": "^7.9.6", + "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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz", + "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "node_modules/@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.11.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz", + "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.11.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "node_modules/@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz", + "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.6.tgz", + "integrity": "sha512-qcmiECD0mYOjOIt8YHNsAP1SxPooC/rDmfmiSK9BNY72EitdSc7l44WTEklaWuFtbOEBjNhWWyph/kOImbNJ4w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.6.tgz", + "integrity": "sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.9.6", + "@babel/helper-compilation-targets": "^7.9.6", + "@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.6", + "@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.5", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.9.5", + "@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.6", + "@babel/plugin-transform-modules-commonjs": "^7.9.6", + "@babel/plugin-transform-modules-systemjs": "^7.9.6", + "@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.9.5", + "@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.6", + "browserslist": "^4.11.1", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dev": true, + "dependencies": { + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", + "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.13.17.tgz", + "integrity": "sha512-RGXINY1YvduBlGrP+vHjJqd/nK7JVpfM4rmZLGMx77WoL3sMrhheA0qxii9VNn1VHnxJLEyxmvCB+Wqc+x/FMw==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/@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, + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "node_modules/@babel/traverse": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz", + "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.5", + "@babel/types": "^7.11.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz", + "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.11.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@babel/traverse/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/types": { + "version": "7.11.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz", + "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "dependencies": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz", + "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "node_modules/@ionic-native/badge": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/badge/-/badge-5.33.0.tgz", + "integrity": "sha512-g/E2HLB53csZq5hWeyWUFj6r7CrllSPuOkV88XotIFTQFNuY7TaLtiFUVFSvWXRh0Kvu+w7TI5Hys67d/v7F/g==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/camera": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-5.33.0.tgz", + "integrity": "sha512-cLAxM4e8IrTECvlszyUe9FnUjE4PbWR99NNDwkOuB85yJ3diyKxiQhHu89Qh9A6qzHTJQLa93iknY2Q40VM/5Q==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/chooser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/chooser/-/chooser-5.33.0.tgz", + "integrity": "sha512-hz2OtB8UsJpKdXZByDzGS6+U1FK8toIjKmIVCDQAuOXxjbw9dU2Ef+MSUKXOpK6MYnP56oP80JdSX9LDEFJnRA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/clipboard": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/clipboard/-/clipboard-5.33.0.tgz", + "integrity": "sha512-HFZN4tsAjFJ9Se9ik0/IOUvApL4zNPEKQAtUsjqP7vCnTsdrgS+FDMln1UDEKXCQ/dEEwU1N1ndFmPBGxjkGzQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/core": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.33.0.tgz", + "integrity": "sha512-dnZHu7SadvQvliGJPndk2ohdoPvwiyBWJjsJw33BKyhadnmLlmkYKkRgPPI+i22BZofDKq4YiAfIIqhvfHU6gw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/device": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/device/-/device-5.33.0.tgz", + "integrity": "sha512-KYQvVsN98bGTEomI193Jf9r1vaXBFJQXuhkhwBI6lajynAlf2SIVJwthNUXnK43kNXy1cOelYxScUuKyPwqudw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/diagnostic": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/diagnostic/-/diagnostic-5.33.0.tgz", + "integrity": "sha512-zBDv/yNMvUkXfxy17rgrGVU3+XKREXRI7cqy/DyvpjdomOnmx2pnFvhszgMEgeD03LkXXKiFOR5yUAVNgYirmg==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/file/-/file-5.33.0.tgz", + "integrity": "sha512-RisSGJl2t8JrBgw30Vn5hJYYKEDTHR9f3KbQDfe1MQg+VrZo7vnbml/vk4l55u65c1TYZDH+F6i7s9nyif1QVQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-opener": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/file-opener/-/file-opener-5.33.0.tgz", + "integrity": "sha512-v7t1ndalAPYT9gvMAhxAup8tg1NPV415cfG6tzs1foPFP91UZC3MQny0tup8AgFivugT1GRdoSk1NMuK1jy8Cw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/file-transfer": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-5.33.0.tgz", + "integrity": "sha512-xDUpdJVgTBP6aEiU08iZ/pa9aMoGSMB9391dQKk+VSDs0hdbIwk+Cx4V40GIE4QF3TI06sUMdKXD2sIhVsr2QA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/geolocation": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/geolocation/-/geolocation-5.33.0.tgz", + "integrity": "sha512-oE6pi6l8/Wsv94vpJmPlPqE1LheP6cQTJrC78WYQp9WVDOOCGZnFznNoH8BlQfnfjuDx/kUARxzEJBO/gbUg1A==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/http": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/http/-/http-5.33.0.tgz", + "integrity": "sha512-dqcPu3igSLlfDUK8Mvma/6o6aq7WtKBlcR8xXwE8tVsO/r4fEB6NevLLN4S4zCr381Jy+RxIIjn3CZx5XHF6JQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/in-app-browser": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-5.33.0.tgz", + "integrity": "sha512-GGIvnYHf8FgaIae9yfRzxqxj0ZAxrYhOJpsHVSq1YKjxnDpRe6ImWWaHHfaeXE5IdUUMUXVuf75VTSBN00VBvA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/ionic-webview": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/ionic-webview/-/ionic-webview-5.33.0.tgz", + "integrity": "sha512-Jbr4M6z/Fya51F+QXuPLm/crFlZ9T6YvRM1cygGmFwZ7SgDAimYnjgSO8SEGJmvO2ZekYmFuF56qiVPSvx2wUA==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/keyboard": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-5.33.0.tgz", + "integrity": "sha512-TIYU3LC+Yz/pcpBuHcxLThMNuN9y1E1wBu4SlmS6VlO3/D3R3At2WOg2UK3iA66G2kTJubed5haqTYZjeoA6Uw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/local-notifications": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/local-notifications/-/local-notifications-5.33.0.tgz", + "integrity": "sha512-ljn2uq0rFWpjG1I1qK+mPVX8T3T+09fsF8sZ9nK7uvD9YWShCVz2e2ctf8qPRFq+TWDeDqlnwXz3wCvWmbBUWw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/media": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/media/-/media-5.33.0.tgz", + "integrity": "sha512-nUu7/FSH41j9+BqHXYVMBd3EifNsTNOufD3NEiMVpHVDWLWqG7tG5h5cFlsVACxUaP4kNpSEke2mjom6CKyjxQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/media-capture": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/media-capture/-/media-capture-5.33.0.tgz", + "integrity": "sha512-aQTnonVSeijpuZ9B7oYJCjIDqgFVhNdvqkx9vUoaO359BtJGpGS1rNPjEovt4DsqV7oe7TkbmBd8DMEwnB3A2g==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/network": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/network/-/network-5.33.0.tgz", + "integrity": "sha512-J+3+rbDTMVNUspa/nV+P8a0hFKDicJK1rVIrm5aLBQdmN9n7WaqJmeMYTptyWOnZxQpktJAJDdhJTEvVmKQjjw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/push": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/push/-/push-5.33.0.tgz", + "integrity": "sha512-H4gOkMbOaNvi97cKKJDggWvAR1BVCUbtdLyWInA0q3cZBHWSc6KcRJGz+hcdDndCQJUnHofs1Tpw8LN3zhjYyQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/qr-scanner": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/qr-scanner/-/qr-scanner-5.33.0.tgz", + "integrity": "sha512-cyiQv0Rje/fN9/JYoDXP1+ILJkRkjvPtoSx4vd2FsKAuJB60U2DpQfmVEE/KMF4iceTpx4MK/kGzr2WE2AYnIg==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/splash-screen": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-5.33.0.tgz", + "integrity": "sha512-6PHk5WJeUoc3zru6wTvUmd9DCASvRQoQq1dysYI3JCECaAJ6X0x1RbzM8dBFs3JPLfWtDn+P8eTp+KaA0Xf58w==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/sqlite": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/sqlite/-/sqlite-5.33.0.tgz", + "integrity": "sha512-JIdQJr6bcksotF/3ZMJQZo9lHgaHXvHOOK9R30mM/5Ds5fFu+rUoUf0wvyqaGzEFu94pGw2uPGnfD+WI7x7+1A==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/status-bar": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-5.33.0.tgz", + "integrity": "sha512-cnyfd42N9gGfhyDtF7wbWoacKg/jfsoJQHOHltfhS4/EjxsVu4bjkwq1YBLMcMY3OIqFDSn2aFcejHn8wVNkDQ==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/web-intent": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/web-intent/-/web-intent-5.33.0.tgz", + "integrity": "sha512-3CIAofrg9nkJQbSftFdMKYOduXy9Ra/a1Q0it6ysm9NFeAQn7iZPThSexBeZ9xiKKj/QTPZtnqAJ0MQ+4mkGag==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic-native/zip": { + "version": "5.33.0", + "resolved": "https://registry.npmjs.org/@ionic-native/zip/-/zip-5.33.0.tgz", + "integrity": "sha512-hErISQ6/xqVErmVnnha5BR+3GWRNQIVfMTXzprEpNZxQl3iDe1UTIVQdFnMd3Nasz/naY+61Vq/y91PZ1Rrajw==", + "dependencies": { + "@types/cordova": "latest" + }, + "peerDependencies": { + "@ionic-native/core": "^5.1.0", + "rxjs": "^5.5.0 || ^6.5.0" + } + }, + "node_modules/@ionic/angular": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.9.2.tgz", + "integrity": "sha512-5GzKg+l4au3xFECky2v/USlRsmTAXgvNO5Zalt7NUXc//VJIL2lQvswojE6FBWuM/xR5W0CWbJdFth19TaZWVQ==", + "dependencies": { + "@ionic/core": "5.9.2", + "tslib": "^1.9.3" + }, + "peerDependencies": { + "@angular/core": ">=8.2.7", + "@angular/forms": ">=8.2.7", + "@angular/router": ">=8.2.7", + "rxjs": ">=6.2.0", + "zone.js": ">=0.8.26" + } + }, + "node_modules/@ionic/angular-toolkit": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@ionic/angular-toolkit/-/angular-toolkit-2.3.3.tgz", + "integrity": "sha512-r87mApDLWbLaUtd5LvNHrRlZWxjQhaBBM1yPlk9M98dHOxcX3jy7kv60ZurGZutuvbhXISGvHcvvR90yywDC1A==", + "dev": true, + "dependencies": { + "@schematics/angular": ">=8.0.0", + "cheerio": "1.0.0-rc.3", + "colorette": "1.1.0", + "copy-webpack-plugin": "^6.0.3", + "tslib": "^1.9.0", + "ws": "^7.0.1" + }, + "peerDependencies": { + "@angular-devkit/architect": ">=0.800.0", + "@angular-devkit/build-angular": ">=0.800.0", + "@angular-devkit/core": ">=8.0.0", + "@angular-devkit/schematics": ">=8.0.0" + } + }, + "node_modules/@ionic/angular-toolkit/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "node_modules/@ionic/angular-toolkit/node_modules/ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ionic/angular/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@ionic/cli": { + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.19.0.tgz", + "integrity": "sha512-JBseXBFRg6voCTg47HDLdrJCQFflqrlbv1f15MMPe1HtrHNY/q8U0QQdYnwWwiAMBUYMo6wrCbyXkoso4UdSKQ==", + "dev": true, + "dependencies": { + "@ionic/cli-framework": "5.1.1", + "@ionic/cli-framework-output": "2.2.3", + "@ionic/cli-framework-prompts": "2.1.8", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.5", + "@ionic/utils-network": "2.1.5", + "@ionic/utils-process": "2.1.8", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-subprocess": "2.1.9", + "@ionic/utils-terminal": "2.3.1", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "diff": "^4.0.1", + "elementtree": "^0.1.7", + "leek": "0.0.24", + "lodash": "^4.17.5", + "open": "^7.0.4", + "os-name": "^4.0.0", + "semver": "^7.1.1", + "split2": "^3.0.0", + "ssh-config": "^1.1.1", + "stream-combiner2": "^1.1.1", + "superagent": "^5.2.1", + "superagent-proxy": "^3.0.0", + "tar": "^6.0.1", + "tslib": "^2.0.1" + }, + "bin": { + "ionic": "bin/ionic" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.1.tgz", + "integrity": "sha512-cew3/WamnRs7ddv5GShyruaaNH3wHWMPjvGnb0ePa0d9uPR4FM5nuWlQMb8vDz8wuJ2QHj6lAp9Isc7qh1zaPA==", + "dev": true, + "dependencies": { + "@ionic/cli-framework-output": "2.2.3", + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.5", + "@ionic/utils-object": "2.1.5", + "@ionic/utils-process": "2.1.8", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-subprocess": "2.1.9", + "@ionic/utils-terminal": "2.3.1", + "chalk": "^4.0.0", + "debug": "^4.0.0", + "lodash": "^4.17.5", + "minimist": "^1.2.0", + "rimraf": "^3.0.0", + "tslib": "^2.0.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework-output": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.3.tgz", + "integrity": "sha512-Ok0DuQseeyEQnpq1eIE9Wt2oy80qmsprmQYu4bMeiaggbXTmzdf0wa+2CIRrAy1Mzh7Lnz95AI4KyYl3h+97GQ==", + "dev": true, + "dependencies": { + "@ionic/utils-terminal": "2.3.1", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework-output/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli-framework-output/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/cli-framework-prompts": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-prompts/-/cli-framework-prompts-2.1.8.tgz", + "integrity": "sha512-DjO4lQsmvficsZbPmpGqSSx+F1BfgSTQBwRqL5bl9Dkh9rIZ/ckcJcKqCciVOw9kIY7WTeNFOTwj2vWrkFn7+Q==", + "dev": true, + "dependencies": { + "@ionic/utils-terminal": "2.3.1", + "debug": "^4.0.0", + "inquirer": "^7.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/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, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/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 + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/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, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/cli-framework-prompts/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ionic/cli-framework/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli-framework/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli-framework/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/cli/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@ionic/cli/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/cli/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/core": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.9.2.tgz", + "integrity": "sha512-1ZqSBS8R6tGQsc+LsLxIRv0q3Ww6jwgJXLvdn6FmVWfpPbBvT+CjCuU9hqJ5qwM+atErblUMYSexvvpws8lGAA==", + "dependencies": { + "@stencil/core": "^2.4.0", + "ionicons": "^5.5.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@ionic/utils-array": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-array/-/utils-array-2.1.5.tgz", + "integrity": "sha512-HD72a71IQVBmQckDwmA8RxNVMTbxnaLbgFOl+dO5tbvW9CkkSFCv41h6fUuNsSEVgngfkn0i98HDuZC8mk+lTA==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-fs": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-fs/-/utils-fs-3.1.5.tgz", + "integrity": "sha512-a41bY2dHqWSEQQ/80CpbXSs8McyiCFf2DnIWWLukrhYWf46h4qi6M/8dxcMKrofRiqI/3F+cL3S2mOm9Zz/o2Q==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "fs-extra": "^9.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-fs/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-fs/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-network": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-network/-/utils-network-2.1.5.tgz", + "integrity": "sha512-HUQ1Ec4Mh2MXzzKdbbbDS6xYKwpFJ2XRY7SYXbaZT8+jiNahfHbsOfe62/p8bk41Yil7E9EagzGC2JvIFJh01w==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-network/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-network/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-object": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-object/-/utils-object-2.1.5.tgz", + "integrity": "sha512-XnYNSwfewUqxq+yjER1hxTKggftpNjFLJH0s37jcrNDwbzmbpFTQTVAp4ikNK4rd9DOebX/jbeZb8jfD86IYxw==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-object/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-object/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-process": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@ionic/utils-process/-/utils-process-2.1.8.tgz", + "integrity": "sha512-VBBoyTzi+m6tgKAItl+jiTQneGwTOsctcrTG4CsEgmVOVOEhUYkPhddXqzD+oC54hPDU9ROsd3I014P5CWEuhQ==", + "dev": true, + "dependencies": { + "@ionic/utils-object": "2.1.5", + "@ionic/utils-terminal": "2.3.1", + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "tree-kill": "^1.2.2", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-process/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-process/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-stream": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@ionic/utils-stream/-/utils-stream-3.1.5.tgz", + "integrity": "sha512-hkm46uHvEC05X/8PHgdJi4l4zv9VQDELZTM+Kz69odtO9zZYfnt8DkfXHJqJ+PxmtiE5mk/ehJWLnn/XAczTUw==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-stream/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-stream/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-subprocess": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.9.tgz", + "integrity": "sha512-OZ4QKyFOoC3+NCcBW8tvDUdLzWqOMKZPpzOQR009xVsfGbT3LwV8h60os7VRAbRV2KrA7t6YMMDrMQYV5DS+DQ==", + "dev": true, + "dependencies": { + "@ionic/utils-array": "2.1.5", + "@ionic/utils-fs": "3.1.5", + "@ionic/utils-process": "2.1.8", + "@ionic/utils-stream": "3.1.5", + "@ionic/utils-terminal": "2.3.1", + "cross-spawn": "^7.0.3", + "debug": "^4.0.0", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-subprocess/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-terminal": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@ionic/utils-terminal/-/utils-terminal-2.3.1.tgz", + "integrity": "sha512-cglsSd2AckI3Ldtdfczeq64vIIDjtPspV5QJtky8f8uIdxkeOIGeRV7bCj1+BEf1hyo+ZuggQxLviHnbMZhiRw==", + "dev": true, + "dependencies": { + "debug": "^4.0.0", + "signal-exit": "^3.0.3", + "slice-ansi": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "tslib": "^2.0.1", + "untildify": "^4.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@ionic/utils-terminal/node_modules/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 + }, + "node_modules/@ionic/utils-terminal/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@ionic/utils-terminal/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@ionic/utils-terminal/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.5.2.tgz", + "integrity": "sha512-lJELzKINpF1v74DXHbCRIkQ/+nUV1M+ntj+X1J8LxCgpmJZjfLmhFejiMSbjjD66fayxl5Z06tbs3HMyuik6rw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^26.5.2", + "jest-util": "^26.5.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.5.2.tgz", + "integrity": "sha512-LLTo1LQMg7eJjG/+P1NYqFof2B25EV1EqzD5FonklihG4UJKiK2JBIvWonunws6W7e+DhNLoFD+g05tCY03eyA==", + "dev": true, + "dependencies": { + "@jest/console": "^26.5.2", + "@jest/reporters": "^26.5.2", + "@jest/test-result": "^26.5.2", + "@jest/transform": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-changed-files": "^26.5.2", + "jest-config": "^26.5.2", + "jest-haste-map": "^26.5.2", + "jest-message-util": "^26.5.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.5.2", + "jest-resolve-dependencies": "^26.5.2", + "jest-runner": "^26.5.2", + "jest-runtime": "^26.5.2", + "jest-snapshot": "^26.5.2", + "jest-util": "^26.5.2", + "jest-validate": "^26.5.2", + "jest-watcher": "^26.5.2", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/core/node_modules/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, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/core/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jest/environment": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.5.2.tgz", + "integrity": "sha512-YjhCD/Zhkz0/1vdlS/QN6QmuUdDkpgBdK4SdiVg4Y19e29g4VQYN5Xg8+YuHjdoWGY7wJHMxc79uDTeTOy9Ngw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/node": "*", + "jest-mock": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/fake-timers": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.5.2.tgz", + "integrity": "sha512-09Hn5Oraqt36V1akxQeWMVL0fR9c6PnEhpgLaYvREXZJAh2H2Y+QLCsl0g7uMoJeoWJAuz4tozk1prbR1Fc1sw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "@sinonjs/fake-timers": "^6.0.1", + "@types/node": "*", + "jest-message-util": "^26.5.2", + "jest-mock": "^26.5.2", + "jest-util": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/globals": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.5.2.tgz", + "integrity": "sha512-9PmnFsAUJxpPt1s/stq02acS1YHliVBDNfAWMe1bwdRr1iTCfhbNt3ERQXrO/ZfZSweftoA26Q/2yhSVSWQ3sw==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.5.2", + "@jest/types": "^26.5.2", + "expect": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/reporters": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.5.2.tgz", + "integrity": "sha512-zvq6Wvy6MmJq/0QY0YfOPb49CXKSf42wkJbrBPkeypVa8I+XDxijvFuywo6TJBX/ILPrdrlE/FW9vJZh6Rf9vA==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^26.5.2", + "@jest/test-result": "^26.5.2", + "@jest/transform": "^26.5.2", + "@jest/types": "^26.5.2", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.4", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.3", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "jest-haste-map": "^26.5.2", + "jest-resolve": "^26.5.2", + "jest-util": "^26.5.2", + "jest-worker": "^26.5.0", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^5.0.1" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "node-notifier": "^8.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/@jest/reporters/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/source-map": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.5.0.tgz", + "integrity": "sha512-jWAw9ZwYHJMe9eZq/WrsHlwF8E3hM9gynlcDpOyCb9bR8wEd9ZNBZCi7/jZyzHxC7t3thZ10gO2IDhu0bPKS5g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.4", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/source-map/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.5.2.tgz", + "integrity": "sha512-E/Zp6LURJEGSCWpoMGmCFuuEI1OWuI3hmZwmULV0GsgJBh7u0rwqioxhRU95euUuviqBDN8ruX/vP/4bwYolXw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.5.2.tgz", + "integrity": "sha512-XmGEh7hh07H2B8mHLFCIgr7gA5Y6Hw1ZATIsbz2fOhpnQ5AnQtZk0gmP0Q5/+mVB2xygO64tVFQxOajzoptkNA==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.5.2", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.5.2", + "jest-runner": "^26.5.2", + "jest-runtime": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.5.2.tgz", + "integrity": "sha512-AUNjvexh+APhhmS8S+KboPz+D3pCxPvEAGduffaAJYxIFxGi/ytZQkrqcKDUU0ERBAo5R7087fyOYr2oms1seg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^26.5.2", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-haste-map": "^26.5.2", + "jest-regex-util": "^26.0.0", + "jest-util": "^26.5.2", + "micromatch": "^4.0.2", + "pirates": "^4.0.1", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.5.2.tgz", + "integrity": "sha512-QDs5d0gYiyetI8q+2xWdkixVQMklReZr4ltw7GFDtb4fuJIBCE6mzj2LnitGqCuAlLap6wPyb8fpoHgwZz5fdg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.3.tgz", + "integrity": "sha512-TAdNkeGB5Fe4Og+ZkAr1Kvn9by2sfL44IAHFtxlh1BA1XJ5cLpO9iSNki5opWESv3l3vSHsZ9BNKuqFKbEbFaA==", + "dev": true, + "dependencies": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.1", + "loader-utils": "^1.4.0", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.4" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@moodlehq/cordova-plugin-file-transfer": { + "version": "1.7.1-moodle.5", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-file-transfer/-/cordova-plugin-file-transfer-1.7.1-moodle.5.tgz", + "integrity": "sha512-1JzvVTLw2V7Pjo+uOXXaMneNR1UpEc9CLD/lsZi8njMe393THr/nfmgOkfmrrtMhIdfDCY1i+ygg1N5Z/D//Kg==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/@moodlehq/cordova-plugin-inappbrowser": { + "version": "5.0.0-moodle.3", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-inappbrowser/-/cordova-plugin-inappbrowser-5.0.0-moodle.3.tgz", + "integrity": "sha512-BDW53W8BzHIJY6lqV3IyYIO9Rh3qi/nA3qkwZjvJiw7iohlQMeR67LV+bXjM4I8N1PTGoBSXiS5BmaS9NFi/1A==", + "engines": { + "cordovaDependencies": { + "0.2.3": { + "cordova": ">=3.1.0" + }, + "4.0.0": { + "cordova": ">=3.1.0", + "cordova-ios": ">=4.0.0" + }, + "5.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=9.0.0", + "cordova-ios": ">=6.0.0" + }, + "6.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/@moodlehq/cordova-plugin-ionic-webview": { + "version": "5.0.0-moodle.1", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-5.0.0-moodle.1.tgz", + "integrity": "sha512-+6UrPKsEgXl3pcuTyI1hZIUw9y22Li/nvn7nxiphgZdldlhBvkMK/7nn4IAaXYlnrmIOpCkIrU4BbrAjSJGWSQ==", + "engines": { + "cordovaDependencies": { + "2.0.0": { + "cordova-android": ">=6.4.0", + "cordova-ios": ">=4.0.0-dev" + }, + "3.1.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.4.0", + "cordova-ios": ">=4.0.0-dev" + } + } + } + }, + "node_modules/@moodlehq/cordova-plugin-local-notification": { + "version": "0.9.0-moodle.3", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-local-notification/-/cordova-plugin-local-notification-0.9.0-moodle.3.tgz", + "integrity": "sha512-dSEvshH9fE3aUG4bO05gCMqWVCnvZGUeddIfB8OShN60sj0CUWuI1e7Mn5syzTcRRNRi8XQ4MTv85zk4c8mzww==", + "engines": [ + { + "name": "cordova", + "version": ">=3.6.0" + }, + { + "name": "cordova-android", + "version": ">=6.0.0" + }, + { + "name": "cordova-windows", + "version": ">=4.2.0" + }, + { + "name": "android-sdk", + "version": ">=26" + }, + { + "name": "apple-ios", + "version": ">=10.0.0" + } + ] + }, + "node_modules/@moodlehq/cordova-plugin-qrscanner": { + "version": "3.0.1-moodle.2", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-qrscanner/-/cordova-plugin-qrscanner-3.0.1-moodle.2.tgz", + "integrity": "sha512-bjMI94QTEaUOl5TbK8K+HZI3gcR8HHfYTocsA1/C1HMKD3nROhGtwvuVDNvb+ogknv9WVQDyGnfMAnNihYH+PQ==", + "dependencies": { + "qrcode-reader": "^1.0.4", + "webrtc-adapter": "^3.1.4" + } + }, + "node_modules/@moodlehq/cordova-plugin-zip": { + "version": "3.1.0-moodle.1", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-zip/-/cordova-plugin-zip-3.1.0-moodle.1.tgz", + "integrity": "sha512-QD5S6bsm6awJrNMb8YN/vkYghKAMfZMHccdimx6s1i5S9fgZUSf7L477NJqjFu62imVZYJIJuavBbw5fR/562w==", + "engines": [ + { + "name": "cordova", + "version": ">=3.3.0" + } + ] + }, + "node_modules/@moodlehq/phonegap-plugin-push": { + "version": "2.0.0-moodle.4", + "resolved": "https://registry.npmjs.org/@moodlehq/phonegap-plugin-push/-/phonegap-plugin-push-2.0.0-moodle.4.tgz", + "integrity": "sha512-nNcEn9ZpcGBc4b8/+nwFwRgOH5Cag2wNGRPeJzkNKt3DWRe1/avySudwB/24+ZmTXerisntNwerC5wSCnU29BQ==", + "engines": { + "cordovaDependencies": { + "1.0.0": { + "cordova": ">=10.0.0", + "cordova-android": ">=8.0.0", + "cordova-ios": ">=5.1.1" + }, + "2.0.0": { + "cordova": ">=10.0.0", + "cordova-android": ">=8.0.0", + "cordova-ios": ">=6.0.0" + } + } + } + }, + "node_modules/@netflix/nerror": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", + "integrity": "sha512-b+MGNyP9/LXkapreJzNUzcvuzZslj/RGgdVVJ16P2wSlYatfLycPObImqVJSmNAdyeShvNeM/pl3sVZsObFueg==", + "dependencies": { + "assert-plus": "^1.0.0", + "extsprintf": "^1.4.0", + "lodash": "^4.17.15" + } + }, + "node_modules/@ngtools/webpack": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-10.0.8.tgz", + "integrity": "sha512-Qv4v7O4VGeWuXjRThd/mdC2I4cJOgQ7kDrVN7vkDB2EW5xtRB+/4hghvFeO3bD11FLuFvCxBMb0HbwyKoVQgEQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.0.8", + "enhanced-resolve": "4.1.1", + "rxjs": "6.5.5", + "webpack-sources": "1.4.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": ">=10.0.0-next.0 < 11", + "typescript": ">=3.9 < 3.10", + "webpack": "^4.0.0" + } + }, + "node_modules/@ngtools/webpack/node_modules/@angular-devkit/core": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", + "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "dev": true, + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@ngtools/webpack/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@ngx-translate/core": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-13.0.0.tgz", + "integrity": "sha512-+tzEp8wlqEnw0Gc7jtVRAJ6RteUjXw6JJR4O65KlnxOmJrCGPI0xjV/lKRnQeU0w4i96PQs/jtpL921Wrb7PWg==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/core": ">=10.0.0", + "rxjs": ">=6.5.3" + } + }, + "node_modules/@ngx-translate/http-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-6.0.0.tgz", + "integrity": "sha512-LCekn6qCbeXWlhESCxU1rAbZz33WzDG0lI7Ig0pYC1o5YxJWrkU9y3Y4tNi+jakQ7R6YhTR2D3ox6APxDtA0wA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": ">=10.0.0", + "@ngx-translate/core": ">=13.0.0", + "rxjs": ">=6.5.3" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dependencies": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "node_modules/@npmcli/git/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/@npmcli/git/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "node_modules/@npmcli/git/node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dependencies": { + "mkdirp": "^1.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==" + }, + "node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/@npmcli/run-script": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", + "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "dependencies": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" + } + }, + "node_modules/@schematics/angular": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.8.tgz", + "integrity": "sha512-KNO61UGtiKMQSG+NbusqLtwLbxId0y+xpXJt9PKFwi+vaViOO+YzOPREfiFCuQ7q6X8SmNlrMj6sZ34E2YN1pQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.0.8", + "@angular-devkit/schematics": "10.0.8" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", + "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "dev": true, + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/angular/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@schematics/update": { + "version": "0.1000.8", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1000.8.tgz", + "integrity": "sha512-xHuj6ME3PNTsVUrpftd98LF3WHPM0NU25GcT/n0E/j0/52yDTiaPS3wUnYSK8ZSv4Et4hcyGx7f/LEXAoOKJXw==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "10.0.8", + "@angular-devkit/schematics": "10.0.8", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "npm-package-arg": "^8.0.0", + "pacote": "9.5.12", + "rxjs": "6.5.5", + "semver": "7.3.2", + "semver-intersect": "1.4.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/update/node_modules/@angular-devkit/core": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.8.tgz", + "integrity": "sha512-d9S8VQuqaYg0c/Y2kl/MtICtZ+UKlH5bLm8y2fb2WfSL4A5XIqMGdEVxzFSiR0b1Bnt4NAoQMcBec1blHAqMSQ==", + "dev": true, + "dependencies": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.5.5", + "source-map": "0.7.3" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 6.11.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@schematics/update/node_modules/ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@stencil/core": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.11.0.tgz", + "integrity": "sha512-/IubCWhVXCguyMUp/3zGrg3c882+RJNg/zpiKfyfJL3kRCOwe+/MD8OoAXVGdd+xAohZKIi1Ik+EHFlsptsjLg==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=12.10.0", + "npm": ">=6.0.0" + } + }, + "node_modules/@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==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.10", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz", + "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz", + "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz", + "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz", + "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/chart.js": { + "version": "2.9.31", + "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.31.tgz", + "integrity": "sha512-hzS6phN/kx3jClk3iYqEHNnYIRSi4RZrIGJ8CDLjgatpHoftCezvC44uqB3o3OUm9ftU1m7sHG8+RLyPTlACrA==", + "dependencies": { + "moment": "^2.10.2" + } + }, + "node_modules/@types/cordova": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", + "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" + }, + "node_modules/@types/dom-mediacapture-record": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-record/-/dom-mediacapture-record-1.0.7.tgz", + "integrity": "sha512-ddDIRTO1ajtbxaNo2o7fPJggpN54PZf1ZUJKOjto2ENMJE/9GKUvaw3ZRuQzlS/p0E+PnIcssxfoqYJ4yiXSBw==" + }, + "node_modules/@types/faker": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@types/faker/-/faker-5.1.3.tgz", + "integrity": "sha512-7YTyCRoujZWYaCpDLslQJ8QzaFWFLZZ3mZ7Vfr/jJHascRmSd05pYteyt2FK4btF2vXyGq0obuoyLpcF99OvaA==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha512-AiHRaEB50LQg0pZmm659vNBb9f4SJ0qrAnteuzhSeAUcJKxoYgEnprg/83kppCnc2zvtCKbdZry1a5pVY3lOTQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "26.0.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.14.tgz", + "integrity": "sha512-Hz5q8Vu0D288x3iWXePSn53W7hAjP0H7EQ6QvDO9c7t46mR0lNOLlfuwQ+JkVxuhygHzlzPX+0jKdA3ZgSh+Vg==", + "dev": true, + "dependencies": { + "jest-diff": "^25.2.1", + "pretty-format": "^25.2.1" + } + }, + "node_modules/@types/jest/node_modules/@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@types/jest/node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/jest/node_modules/diff-sequences": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@types/jest/node_modules/jest-diff": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz", + "integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==", + "dev": true, + "dependencies": { + "chalk": "^3.0.0", + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.5.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@types/jest/node_modules/jest-get-type": { + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", + "dev": true, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "dependencies": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 8.3" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@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 + }, + "node_modules/@types/node": { + "version": "12.12.64", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.64.tgz", + "integrity": "sha512-UV1/ZJMC+HcP902wWdpC43cAcGu0IQk/I5bXjP2aSuCjsk3cE74mDvFrLKga7oDC170ugOAYBwfT4DSQW3akDA==", + "dev": true + }, + "node_modules/@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 + }, + "node_modules/@types/prettier": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.1.1.tgz", + "integrity": "sha512-2zs+O+UkDsJ1Vcp667pd3f8xearMdopz/z54i99wtRDI5KLmngk7vlrYZD0ZjKHaROR03EznlBbVY9PfAEyJIQ==", + "dev": true + }, + "node_modules/@types/q": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz", + "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==", + "dev": true + }, + "node_modules/@types/resize-observer-browser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz", + "integrity": "sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ==", + "dev": true + }, + "node_modules/@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 + }, + "node_modules/@types/stack-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz", + "integrity": "sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==", + "dev": true + }, + "node_modules/@types/webpack-env": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.0.tgz", + "integrity": "sha512-Fx+NpfOO0CpeYX2g9bkvX8O5qh9wrU1sOF4g8sft4Mu7z+qfe387YlyY8w8daDyDsKY5vUxM0yxkAYnbkRbZEw==", + "dev": true + }, + "node_modules/@types/webpack-sources": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + } + }, + "node_modules/@types/webpack-sources/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/yargs": { + "version": "15.0.7", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.7.tgz", + "integrity": "sha512-Gf4u3EjaPNcC9cTu4/j2oN14nSVhr8PQ+BvBcBQHAhDZfl0bVIiLgvnRXv/dn58XhTm9UXvBpvJpDlwV65QxOA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz", + "integrity": "sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.22.0", + "@typescript-eslint/scope-manager": "4.22.0", + "debug": "^4.1.1", + "functional-red-black-tree": "^1.0.1", + "lodash": "^4.17.15", + "regexpp": "^3.0.0", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz", + "integrity": "sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.3", + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^2.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz", + "integrity": "sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.22.0", + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/typescript-estree": "4.22.0", + "debug": "^4.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", + "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", + "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", + "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.0", + "@typescript-eslint/visitor-keys": "4.22.0", + "debug": "^4.1.1", + "globby": "^11.0.1", + "is-glob": "^4.0.1", + "semver": "^7.3.2", + "tsutils": "^3.17.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", + "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.22.0", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@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 + }, + "node_modules/@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 + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", + "integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", + "dev": true, + "dependencies": { + "assert": "1.4.1", + "camelcase": "5.0.0", + "loader-utils": "1.2.3", + "object-path": "0.11.4", + "regex-parser": "2.2.10" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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, + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/android-versions": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.7.0.tgz", + "integrity": "sha512-TCy4b8Dk8YS6A23ZPfhSKqK66JHFq0D8avGYiwvYpjno6HrrcI0DRgHx9+jtkvWYmrsE2vQWgbHJhvGGhhOb0g==", + "dependencies": { + "semver": "^5.7.1" + } + }, + "node_modules/android-versions/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/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==" + }, + "node_modules/ansi-align/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "dependencies": { + "ansi-wrap": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "dependencies": { + "buffer-equal": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/aria-query/node_modules/@babel/runtime": { + "version": "7.13.17", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.13.17.tgz", + "integrity": "sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + } + }, + "node_modules/arity-n": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz", + "integrity": "sha1-2edrEXM+CFacCEeuezmyhgswt0U=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-filter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", + "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", + "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", + "dev": true, + "dependencies": { + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/es-abstract": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz", + "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.2", + "is-string": "^1.0.5", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/is-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz", + "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-initial": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", + "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", + "dev": true, + "dependencies": { + "array-slice": "^1.0.0", + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-initial/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", + "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-last/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", + "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "dev": true, + "dependencies": { + "default-compare": "^1.0.0", + "get-value": "^2.0.6", + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-sort/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "dependencies": { + "util": "0.10.3" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/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, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", + "integrity": "sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001061", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.30", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/autoprefixer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/autoprefixer/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/autoprefixer/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz", + "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==" + }, + "node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "node_modules/babel-jest": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.5.2.tgz", + "integrity": "sha512-U3KvymF3SczA3vOL/cgiUFOznfMET+XDIXiWnoJV45siAp2pLMG8i2+/MGZlAC3f/F6Q40LR4M4qDrWZ9wkK8A==", + "dev": true, + "dependencies": { + "@jest/transform": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/babel__core": "^7.1.7", + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^26.5.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/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, + "dependencies": { + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 6.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/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, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-loader/node_modules/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, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/babel-loader/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.5.0.tgz", + "integrity": "sha512-ck17uZFD3CDfuwCLATWZxkkuGGFhMij8quP8CNhwj8ek1mqFgbFzRJ30xwC04LLscj/aKsVFfRST+b5PT7rSuw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.4.tgz", + "integrity": "sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.5.0.tgz", + "integrity": "sha512-F2vTluljhqkiGSJGBg/jOruA8vIIIL11YrxRcO7nviNTMbbofPSHwnm8mgP7d/wS7wRSexRoI6X1A6T74d4LQA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^26.5.0", + "babel-preset-current-node-syntax": "^0.1.3" + }, + "engines": { + "node": ">= 10.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/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==" + }, + "node_modules/boxen/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/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, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/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, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/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, + "dependencies": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.14.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz", + "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001135", + "electron-to-chromium": "^1.3.571", + "escalade": "^3.1.0", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/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, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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 + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", + "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "move-file": "^2.0.0", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/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, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001197", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001197.tgz", + "integrity": "sha512-8aE+sqBqtXz4G8g35Eg/XEaFr2N7rd/VQ6eABGBmNtcB8cN6qNJhMi6oSFy4UWWZgqgL3filHT8Nha4meu3tsw==", + "dev": true + }, + "node_modules/canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "node_modules/capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "dependencies": { + "rsvp": "^4.8.4" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/chart.js": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz", + "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", + "dependencies": { + "chartjs-color": "^2.1.0", + "moment": "^2.10.2" + } + }, + "node_modules/chartjs-color": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", + "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", + "dependencies": { + "chartjs-color-string": "^0.6.0", + "color-convert": "^1.9.3" + } + }, + "node_modules/chartjs-color-string": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", + "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", + "dependencies": { + "color-name": "^1.0.0" + } + }, + "node_modules/chartjs-color/node_modules/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/chartjs-color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/check-es-compat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/check-es-compat/-/check-es-compat-1.1.1.tgz", + "integrity": "sha512-q8k6nnYg6aabuEtx0LyVXP8Q3OQ07eOAAWZ7eD95FiSk+GRIdqouuJHd7gGPzxSUJZRioRrW2GMWu7MHDFsIUw==", + "dev": true, + "dependencies": { + "eslint": "^6.7.2", + "eslint-plugin-ecmascript-compat": "^1.1.1" + }, + "bin": { + "check-es-compat": "bin/cli.js" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/check-es-compat/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/check-es-compat/node_modules/ansi-escapes/node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/check-es-compat/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/check-es-compat/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/check-es-compat/node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/check-es-compat/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/check-es-compat/node_modules/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 + }, + "node_modules/check-es-compat/node_modules/eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "dependencies": { + "@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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/check-es-compat/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/check-es-compat/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/check-es-compat/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/check-es-compat/node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/check-es-compat/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/check-es-compat/node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/check-es-compat/node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/check-es-compat/node_modules/inquirer/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-es-compat/node_modules/inquirer/node_modules/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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/check-es-compat/node_modules/inquirer/node_modules/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 + }, + "node_modules/check-es-compat/node_modules/inquirer/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/inquirer/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/check-es-compat/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/check-es-compat/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/check-es-compat/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/check-es-compat/node_modules/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, + "engines": { + "node": ">=6.5.0" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/check-es-compat/node_modules/rxjs": { + "version": "6.6.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz", + "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/check-es-compat/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-es-compat/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/check-es-compat/node_modules/slice-ansi/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/string-width/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-es-compat/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/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, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/check-es-compat/node_modules/table/node_modules/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 + }, + "node_modules/check-es-compat/node_modules/table/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-es-compat/node_modules/table/node_modules/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, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/check-es-compat/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/check-es-compat/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/check-es-compat/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/cheerio/node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/cheerio/node_modules/parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/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, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chrome-trace-event/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.1" + } + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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=", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", + "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/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, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "node_modules/cloneable-readable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", + "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "process-nextick-args": "^2.0.0", + "readable-stream": "^2.3.5" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "dev": true + }, + "node_modules/collection-map": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", + "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", + "dev": true, + "dependencies": { + "arr-map": "^2.0.2", + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "node_modules/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/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==" + }, + "node_modules/color-string": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/color/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/colorette": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", + "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/com-darryncampbell-cordova-plugin-intent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/com-darryncampbell-cordova-plugin-intent/-/com-darryncampbell-cordova-plugin-intent-2.2.0.tgz", + "integrity": "sha512-4ESoeYghE9GGuxKi4pnG+6CUJyYjS2j1tOmvlXXEM/9d5aBU47EpWbKKU1gjcfZFM4KCUbyba1NX6xNcH/L/wA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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 + }, + "node_modules/comment-parser": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.5.tgz", + "integrity": "sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/compose-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", + "integrity": "sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8=", + "dev": true, + "dependencies": { + "arity-n": "^1.0.4" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/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, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concat-with-sourcemaps/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/conf": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.1.1.tgz", + "integrity": "sha512-z2civwq/k8TMYtcn3SVP0Peso4otIWnHtcTuHhQ0zDZDdP4NTxqEc8owfkz4zBsdMYdn/LFcE+ZhbCeqkhtq3Q==", + "dependencies": { + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conf/node_modules/ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/conf/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/conf/node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conf/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/conf/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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 + }, + "node_modules/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=" + }, + "node_modules/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 + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/copy-props/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz", + "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==", + "dev": true, + "dependencies": { + "cacache": "^15.0.4", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.1", + "schema-utils": "^2.7.0", + "serialize-javascript": "^4.0.0", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "dependencies": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/copy-webpack-plugin/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/cordova/-/cordova-11.0.0.tgz", + "integrity": "sha512-Hu2YeT0naeP/1sEm/xfJYUsXN48XV6zagxbi1+4q0Ei9c5TKsIq8v4EWukvSHF4UO2pnh+9ViaDlGMcS1Wrnfg==", + "dependencies": { + "configstore": "^5.0.1", + "cordova-common": "^4.0.2", + "cordova-create": "^4.0.0", + "cordova-lib": "^11.0.0", + "editor": "^1.0.0", + "execa": "^5.1.1", + "fs-extra": "^10.0.0", + "insight": "^0.11.1", + "loud-rejection": "^2.2.0", + "nopt": "^5.0.0", + "semver": "^7.3.5", + "systeminformation": "^5.9.17", + "update-notifier": "^5.1.0" + }, + "bin": { + "cordova": "bin/cordova" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cordova-android": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-10.1.1.tgz", + "integrity": "sha512-eoJp5AcDMHniqmxj0CbUF/rVQfbbp108TWKU6oyJW9rl/ZTJqZxm5ybznl+1/1MBksklxhMeipMn0Iwd0kEzEQ==", + "dependencies": { + "android-versions": "^1.7.0", + "cordova-common": "^4.0.2", + "execa": "^5.1.1", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "is-path-inside": "^3.0.3", + "nopt": "^5.0.0", + "properties-parser": "^0.3.1", + "semver": "^7.3.5", + "untildify": "^4.0.0", + "which": "^2.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cordova-android/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cordova-android/node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cordova-android/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova-android/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/cordova-android/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-app-hello-world": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-6.0.0.tgz", + "integrity": "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g==" + }, + "node_modules/cordova-clipboard": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cordova-clipboard/-/cordova-clipboard-1.3.0.tgz", + "integrity": "sha512-IGk4LZm/DJ0Xk/jgakHm4wa+A/lrRP3QfzMAHDG7oWLJS4ISOpfI32Wez4ndnENItRslGyBVyJyKD83CxELCAw==" + }, + "node_modules/cordova-common": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cordova-common/-/cordova-common-4.0.2.tgz", + "integrity": "sha512-od7aNShyuBajzPY83mUEO8tERwwWdFklXETHiXP5Ft87CWeo/tSuwNPFztyTy8XYc74yXdogXKPTJeUHuVzB8Q==", + "dependencies": { + "@netflix/nerror": "^1.1.3", + "ansi": "^0.3.1", + "bplist-parser": "^0.2.0", + "cross-spawn": "^7.0.1", + "elementtree": "^0.1.7", + "endent": "^1.4.1", + "fast-glob": "^3.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "plist": "^3.0.1", + "q": "^1.5.1", + "read-chunk": "^3.2.0", + "strip-bom": "^4.0.0", + "underscore": "^1.9.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cordova-create": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cordova-create/-/cordova-create-4.0.0.tgz", + "integrity": "sha512-t/4zaDZ4ZsFpC7j6x7s9hR9OeEo8nD2m7rSrzV2PUEfA4BPQujkmk0AIC+5iBvjfR7+ReHOHKsY/NfB1LnMQxQ==", + "dependencies": { + "cordova-app-hello-world": "^6.0.0", + "cordova-common": "^4.0.2", + "cordova-fetch": "^3.0.1", + "fs-extra": "^10.0.0", + "globby": "^11.0.4", + "import-fresh": "^3.3.0", + "isobject": "^4.0.0", + "npm-package-arg": "^8.1.5", + "path-is-inside": "^1.0.2", + "tmp": "^0.2.1", + "valid-identifier": "0.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-create/node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cordova-create/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-create/node_modules/npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-create/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cordova-fetch/-/cordova-fetch-3.0.1.tgz", + "integrity": "sha512-bxXk6H3FtGXpCtlO+XyXM4pa72azQomdurNeHbZai9eYBzA5vjyPnsgxsYcylLUc1wQFeR+XWQVfgJitx6ghEw==", + "dependencies": { + "cordova-common": "^4.0.0", + "fs-extra": "^9.0.0", + "npm-package-arg": "^8.0.1", + "pacote": "^11.1.11", + "pify": "^5.0.0", + "resolve": "^1.15.1", + "semver": "^7.1.3", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10", + "npm": ">= 5.6.0" + } + }, + "node_modules/cordova-fetch/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/cordova-fetch/node_modules/agentkeepalive": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", + "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/cordova-fetch/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cordova-fetch/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/cordova-fetch/node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "node_modules/cordova-fetch/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cordova-fetch/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cordova-fetch/node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cordova-fetch/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-fetch/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/cordova-fetch/node_modules/npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-fetch/node_modules/npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "dependencies": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-fetch/node_modules/pacote": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", + "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "dependencies": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-fetch/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova-fetch/node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-fetch/node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/cordova-fetch/node_modules/socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cordova-ios": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cordova-ios/-/cordova-ios-6.2.0.tgz", + "integrity": "sha512-sLjZg2QBI1SpQVwfe0MSn89YNVkBGLW9Q1vcFJBsqKBrhvoEOJ5Ytq0gwqdhgTOGzlwJUfxC6OHM3jcsRjtYrw==", + "dependencies": { + "cordova-common": "^4.0.2", + "fs-extra": "^9.1.0", + "ios-sim": "^8.0.2", + "nopt": "^5.0.0", + "plist": "^3.0.1", + "semver": "^7.3.4", + "unorm": "^1.6.0", + "which": "^2.0.2", + "xcode": "^3.0.1", + "xml-escape": "^1.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-ios/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-ios/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/cordova-ios/node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/cordova-lib": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/cordova-lib/-/cordova-lib-11.0.0.tgz", + "integrity": "sha512-3XSCIAlS060/hzxWKDrF+sMfv3PVU8bglCaL31HMCyj3YrZn1CZhqrRRrW5lwRxtz7Sh4XCxv97rNxF38uj9hg==", + "dependencies": { + "cordova-common": "^4.0.2", + "cordova-fetch": "^3.0.1", + "cordova-serve": "^4.0.0", + "dep-graph": "^1.1.0", + "detect-indent": "^6.1.0", + "detect-newline": "^3.1.0", + "elementtree": "^0.1.7", + "execa": "^5.1.1", + "fs-extra": "^10.0.0", + "globby": "^11.0.4", + "init-package-json": "^2.0.5", + "md5-file": "^5.0.0", + "pify": "^5.0.0", + "semver": "^7.3.5", + "stringify-package": "^1.0.1", + "write-file-atomic": "^3.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cordova-lib/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cordova-lib/node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cordova-lib/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova-lib/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/cordova-lib/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova-lib/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cordova-plugin-add-swift-support": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-add-swift-support/-/cordova-plugin-add-swift-support-2.0.2.tgz", + "integrity": "sha512-K03WDnsD3GT+n7Od3BnS17D8rYnAFZbZjjQJa2r7qW8QLq8+h7hGbFaiF+w5+nUtyAqUNq+HT/d/MdqBGLNzxA==", + "dependencies": { + "glob": "^7.1.3", + "semver": "^6.0.0", + "xcode": "^2.0.0" + } + }, + "node_modules/cordova-plugin-add-swift-support/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/cordova-plugin-advanced-http": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-advanced-http/-/cordova-plugin-advanced-http-3.2.2.tgz", + "integrity": "sha512-9djtQuRwWMqCLTNRrtAIlGyRcs2D0AJXOzkedOQ6udlg3IVE58hhxjrFOdKz6WvoJ6w2MNVeRYafYvoWLHFuMA==", + "engines": [ + { + "name": "cordova", + "version": ">=4.0.0" + } + ] + }, + "node_modules/cordova-plugin-androidx-adapter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-androidx-adapter/-/cordova-plugin-androidx-adapter-1.1.3.tgz", + "integrity": "sha512-W1SImn0cCCvOSTSfWWp5TnanIQrSuh2Bch+dcZXIzEn0km3Qb7VryeAqHhgBQYwwzC5Ollk1DtUAk/AJSojuZA==", + "dev": true, + "dependencies": { + "q": "^1.5.1", + "recursive-readdir": "^2.2.2" + } + }, + "node_modules/cordova-plugin-badge": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/cordova-plugin-badge/-/cordova-plugin-badge-0.8.8.tgz", + "integrity": "sha512-RhIBtd5xhD/iLnxjt35jvOae28oNW/wtMZBOmQR3Rf0y4wirvA1bpAZEhBoFqL+rZGhsd6ddOdQXdex1T0DRyQ==", + "engines": [ + { + "name": "cordova", + "version": ">=6.0.0" + }, + { + "name": "apple-ios", + "version": ">=10.0.0" + }, + { + "name": "cordova-android", + "version": ">=4" + }, + { + "name": "cordova-plugman", + "version": ">=4.2.0" + } + ] + }, + "node_modules/cordova-plugin-camera": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-6.0.0.tgz", + "integrity": "sha512-FTFKep8HZI/2HkX+Gc/dUACfZGV9+k9waXlgoEOKXOiPPR/1zBw29Mw+adcz4FQUpdWyAgYDxNiaPUnP0P+H2Q==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.3.0" + }, + "4.1.0": { + "cordova": ">=7.1.0", + "cordova-android": ">=6.3.0" + }, + "5.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=9.0.0", + "cordova-ios": ">=5.1.0" + }, + "5.0.4-dev": { + "cordova": ">=9.0.0", + "cordova-android": "<10.0.0", + "cordova-ios": ">=5.1.0" + }, + "6.0.0": { + "cordova": ">=9.0.0", + "cordova-android": ">=10.0.0", + "cordova-ios": ">=5.1.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-chooser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-chooser/-/cordova-plugin-chooser-1.3.2.tgz", + "integrity": "sha512-GfAibvrPdWe/ri+h3e3xkmq5bietY6yJRBIZawYDE7w600j2mtRsxgat7siWZtjRRhJuVsVwUG6H86Hyp3WKvA==" + }, + "node_modules/cordova-plugin-customurlscheme": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-customurlscheme/-/cordova-plugin-customurlscheme-5.0.2.tgz", + "integrity": "sha512-g139Av7iYD3xcSsCd5S6a7B7dp4GTqGYtvdhh44g4OS38+aX6XkC1lsCRmROuhLIs4fkwJqkrvxacH9H4U9Gsg==", + "engines": [ + { + "name": "cordova", + "version": ">=3.0.0" + } + ] + }, + "node_modules/cordova-plugin-device": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-device/-/cordova-plugin-device-2.0.3.tgz", + "integrity": "sha512-Jb3V72btxf3XHpkPQsGdyc8N6tVBYn1vsxSFj43fIz9vonJDUThYPCJJHqk6PX6N4dJw6I4FjxkpfCR4LDYMlw==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-file": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-file/-/cordova-plugin-file-6.0.2.tgz", + "integrity": "sha512-m7cughw327CjONN/qjzsTpSesLaeybksQh420/gRuSXJX5Zt9NfgsSbqqKDon6jnQ9Mm7h7imgyO2uJ34XMBtA==", + "engines": { + "cordovaDependencies": { + "5.0.0": { + "cordova-android": ">=6.3.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-file-opener2": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/cordova-plugin-file-opener2/-/cordova-plugin-file-opener2-3.0.5.tgz", + "integrity": "sha512-tjLHDamH5+y0bJZYVe2967L1S4R8tL4Y0rJUzJGoxsyiw3FUlrJNS199POOpzZZ6Xhlntn9a2o7+84r1dMN21A==", + "engines": { + "cordova": ">=6.0.0" + } + }, + "node_modules/cordova-plugin-geolocation": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-geolocation/-/cordova-plugin-geolocation-4.1.0.tgz", + "integrity": "sha512-y5io/P10xGMxSn2KEqfv/fExK47eA1pmSonJdmDqDsaSADV9JpgdPx0mUSA08+5pzma/OS9R0LoODeDPx7Jvjg==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.3.0" + }, + "5.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-ionic-keyboard": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.2.0.tgz", + "integrity": "sha512-yDUG+9ieKVRitq5mGlNxjaZh/MgEhFFIgTIPhqSbUaQ8UuZbawy5mhJAVClqY97q8/rcQtL6dCDa7x2sEtCLcA==" + }, + "node_modules/cordova-plugin-media": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cordova-plugin-media/-/cordova-plugin-media-5.0.4.tgz", + "integrity": "sha512-mAqincYqOT5gu5LWyfgJu3qmOq+lhLAKhnOZULpG622FvYiHjjfsoJ/fkI55WwI3FIcHeeyhToGvHXBCNJePZg==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova-android": ">=6.1.0" + }, + "4.0.0": { + "cordova-android": ">=6.3.0" + }, + "6.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-media-capture": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-media-capture/-/cordova-plugin-media-capture-3.0.3.tgz", + "integrity": "sha512-pVQOrNM7VAuVUMXibAlMGIArrftHPrRs4dUCoE+e2HEFUp3LmN3Yj539LjdUxcWmz/A/cHC65m9E3DS56YJhcg==", + "engines": { + "cordovaDependencies": { + ">=1.4.4": { + "cordova-ios": ">=4.0.0" + }, + "2.0.0": { + "cordova-android": ">=6.3.0" + }, + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-network-information": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-network-information/-/cordova-plugin-network-information-3.0.0.tgz", + "integrity": "sha512-bBtP3PxIX8vshsfR0+F6co2e2cFLgjt18yKIdigzMwk6ANudWQ72RB3g2qMPyT6fBDWmUyE1Qd+bKQB/fZtQwQ==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">=9" + }, + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-prevent-override": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-prevent-override/-/cordova-plugin-prevent-override-1.0.1.tgz", + "integrity": "sha512-yy1JZ+lXTR33Ai1yloT6wdXJXe0a3LrfgnKORuPZv/QkbiqfIQKjy0R4zRP8qljaJSelF/xv5CgrVt8iS0SkBg==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-screen-orientation": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-screen-orientation/-/cordova-plugin-screen-orientation-3.0.2.tgz", + "integrity": "sha512-2w6CMC+HGvbhogJetalwGurL2Fx8DQCCPy3wlSZHN1/W7WoQ5n9ujVozcoKrY4VaagK6bxrPFih+ElkO8Uqfzg==", + "dev": true, + "engines": { + "cordovaDependencies": { + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-splashscreen": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-splashscreen/-/cordova-plugin-splashscreen-6.0.0.tgz", + "integrity": "sha512-pm4ZtJKQY4bCGXVeIInbGrXilryTevYSKgfvoQJpW9UClOWKAxSsYf2/4G2u1vcn492svOSL42OSa2MhujBWEQ==", + "engines": { + "cordovaDependencies": { + ">=4.0.0": { + "cordova-android": ">=3.6.0", + "cordova-windows": ">=4.4.0" + }, + "2.0.0": { + "cordova-android": ">=3.6.0" + }, + "7.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-statusbar": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-3.0.0.tgz", + "integrity": "sha512-nzkeWeyLA6+1FryzO0aeB6NS8MZ45gnBYeq2VZqfdNbddZEgtpI4XPYdBVxvm9NhcVoJ3tdA1OBnQD9JryoV0Q==", + "engines": { + "cordovaDependencies": { + "0.1.0": { + "cordova": ">=3.0.0" + }, + "4.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-wkuserscript": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-wkuserscript/-/cordova-plugin-wkuserscript-1.0.1.tgz", + "integrity": "sha512-qhb2JOFy+XnLIbPubDuAcZyf6fSsrQ2syM8PqAVvW7JJQVR7i64pZDLHmgYQrGN+2pO1fG8EdR2aUp5O0Kx/HA==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-plugin-wkwebview-cookies": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-wkwebview-cookies/-/cordova-plugin-wkwebview-cookies-1.0.1.tgz", + "integrity": "sha512-x984mlj21Newei7UFPTu4N3NJSTBZuuQXkDNJxq8FTGM1RH/YECqYAzk6ekk/regFamj1bCQ3IB8XJeCm5/dhA==", + "engines": { + "cordovaDependencies": { + "3.0.0": { + "cordova": ">100" + } + } + } + }, + "node_modules/cordova-serve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cordova-serve/-/cordova-serve-4.0.0.tgz", + "integrity": "sha512-gzTLeBQzNP8aM/nG0/7sSfICfNazUgwvEU2kiDaybbYXmxwioo2v96h4tzE0XOyA64beyYwAyRYEEqWA4AMZjw==", + "dependencies": { + "chalk": "^3.0.0", + "compression": "^1.7.4", + "express": "^4.17.1", + "open": "^7.0.3", + "which": "^2.0.2" + }, + "engines": { + "node": ">= 10", + "npm": ">= 5.6.0" + } + }, + "node_modules/cordova-sqlite-storage": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage/-/cordova-sqlite-storage-6.0.0.tgz", + "integrity": "sha512-njRloA3AICaUFztKHXoFfVcwlL7zbvyFxtdZIkK7P+MA3umILXtSKhYAQkSe2GtHr0LBNzJI5xUUqAlZl/Js0A==", + "dependencies": { + "cordova-sqlite-storage-dependencies": "4.0.0" + } + }, + "node_modules/cordova-sqlite-storage-dependencies": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-4.0.0.tgz", + "integrity": "sha512-dTBxYaX/RGzH6+pp49o4sb3FuHCvhrssaKn1XMJ4LL3f9dnvz3rhFK2LdcWrdFkhOLOndnW/azUkbzZd+WWhRA==" + }, + "node_modules/cordova.plugins.diagnostic": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/cordova.plugins.diagnostic/-/cordova.plugins.diagnostic-6.1.1.tgz", + "integrity": "sha512-JEc7MEPNDDrLb4RGmIwxoKIQ1AVRbh7OuDI8MTsdRqKFA/fQgdF3tK54uWbICUYBx9bQ0YY4FqNmkO0zkDyx5g==", + "hasInstallScript": true, + "dependencies": { + "colors": "1.4.0", + "elementtree": "^0.1.6", + "minimist": "1.2.0" + }, + "engines": { + "cordovaDependencies": { + "0.0.1": { + "cordova": ">=9.0.0", + "cordova-android": ">=8.0.0", + "cordova-ios": ">=5.0.0" + } + } + } + }, + "node_modules/cordova.plugins.diagnostic/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "node_modules/cordova/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cordova/node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cordova/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cordova/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/cordova/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/core-js": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.9.1.tgz", + "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "dependencies": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.11.1.tgz", + "integrity": "sha512-2JukQi8HgAOCD5CSimxWWXVrUBoA9Br796uIA5Z06bIjt7PBBI19ircFaAxplgE1mJf3x2BY6MkT/HWA/UryPg==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/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=" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/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, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-loader": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz", + "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==", + "dev": true, + "dependencies": { + "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.27", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.3", + "schema-utils": "^2.6.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/css-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.1.tgz", + "integrity": "sha512-wHOppVDKl4vTAOWzJt5Ek37Sgd9qq1Bmj/T1OjvicWbU5W7ru7Pqbn0Jdqii3Drx/h+dixHKXNhZYx7blthL7g==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/csso": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", + "dev": true, + "dependencies": { + "css-tree": "1.0.0-alpha.39" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, + "node_modules/csso/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dependencies": { + "mimic-fn": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debounce-fn/node_modules/mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", + "integrity": "sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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 + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", + "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "dev": true, + "dependencies": { + "kind-of": "^5.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-compare/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/default-gateway/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/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, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/default-gateway/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/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, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/default-gateway/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/default-gateway/node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/default-resolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", + "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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==" + }, + "node_modules/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, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/degenerator": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.2", + "escodegen": "^1.8.1", + "esprima": "^4.0.0", + "vm2": "^3.9.8" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/dep-graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dep-graph/-/dep-graph-1.1.0.tgz", + "integrity": "sha1-+t6GqSeZqBPptCURzfPfpsyNvv4=", + "dependencies": { + "underscore": "1.2.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dep-graph/node_modules/underscore": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.2.1.tgz", + "integrity": "sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q=", + "engines": { + "node": "*" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.5.0.tgz", + "integrity": "sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/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, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/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, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz", + "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/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, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/editor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.577", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.577.tgz", + "integrity": "sha512-dSb64JQSFif/pD8mpVAgSFkbVi6YHbK6JeEziwNNmXlr/Ne2rZtseFK5SM7JoWSLf6gP0gVvRGi4/2ZRhSX/rA==", + "dev": true + }, + "node_modules/elementtree": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz", + "integrity": "sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA=", + "dependencies": { + "sax": "1.1.4" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.1.tgz", + "integrity": "sha512-d34LN4L6h18Bzz9xpoku2nPwKxCPlPMr3EEKTkoEBi+1/+b0lcRkRJ1UVyyZaKNeqGR3swcGl6s390DNO4YVgQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/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 + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "devOptional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "devOptional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/endent": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/endent/-/endent-1.4.1.tgz", + "integrity": "sha512-buHTb5c8AC9NshtP6dgmNLYkiT+olskbq1z6cEGvfGCF3Qphbu/1zz5Xu+yjTDln8RbxNhPoUyJ5H8MSrp1olQ==", + "dependencies": { + "dedent": "^0.7.0", + "fast-json-parse": "^1.0.3", + "objectorarray": "^1.0.4" + } + }, + "node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/entities": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", + "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", + "dev": true + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/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, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/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 + }, + "node_modules/es6-promise-plugin": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/es6-promise-plugin/-/es6-promise-plugin-4.2.2.tgz", + "integrity": "sha512-uoA4aVplXI9oqUYJFBAVRwAqIN9/n9JgrTAUGX3qPbnSZVE5yY1+6/MsoN5f4xsaPO62WjPHOdtts6okMN6tNA==" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escalade": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz", + "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/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=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/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, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.25.0.tgz", + "integrity": "sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.21", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.4", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-ecmascript-compat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-ecmascript-compat/-/eslint-plugin-ecmascript-compat-1.1.1.tgz", + "integrity": "sha512-OUytzpOKynpuSfnrGpOfj2QmduJu/0fGfTLf9GwTJzIyvfXfLDGtoZ+ek0sHFh68BLbwG5lylyBNgAxhFh5V8A==", + "dev": true, + "dependencies": { + "browserslist": "^4.8.0", + "eslint-plugin-es": "^2.0.0", + "lodash": "^4.17.15", + "mdn-browser-compat-data": "^1.0.25" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", + "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^1.4.2", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/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, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-header": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", + "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", + "dev": true, + "peerDependencies": { + "eslint": ">=7.7.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "24.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz", + "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "^4.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": ">= 4", + "eslint": ">=5" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "32.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-32.3.3.tgz", + "integrity": "sha512-WxXohbMYlZvCt3r7MepwT++nTLsO4CPegWcm5toM4IGq3MBmYkG+Uf5yDa+n1MwPXLg+KbJqAsI19hmkVD7MPg==", + "dev": true, + "dependencies": { + "comment-parser": "1.1.5", + "debug": "^4.3.1", + "jsdoctypeparser": "^9.0.0", + "lodash": "^4.17.21", + "regextras": "^0.7.1", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", + "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", + "dev": true, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0" + } + }, + "node_modules/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, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz", + "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/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, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "node_modules/execa": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", + "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-26.5.2.tgz", + "integrity": "sha512-ccTGrXZd8DZCcvCz4htGXTkd/LOoy6OEtiDS38x3/VVf6E4AQL0QoeksBiw7BtGR5xDNiRYPB8GN6pfbuTOi7w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "ansi-styles": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-matcher-utils": "^26.5.2", + "jest-message-util": "^26.5.2", + "jest-regex-util": "^26.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dev": true, + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", + "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/faker": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/faker/-/faker-5.1.0.tgz", + "integrity": "sha512-RrWKFSSA/aNLP0g3o2WW1Zez7/MnMr7xkiZmoCfAGZmdkDQZ6l2KtuXHN5XjdvpRjDl8+3vf+Rrtl06Z352+Mw==", + "dev": true + }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", + "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-parse": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-json-parse/-/fast-json-parse-1.0.3.tgz", + "integrity": "sha512-FRWsaZRWEJ1ESVNbDWmsAlqDk96gPQezzLghafp5J4GUKjbCz3OkAHuZs5TuPEtkbVQERysLp9xv6c24fBm8Aw==" + }, + "node_modules/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==" + }, + "node_modules/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 + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "node_modules/figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz", + "integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/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 + }, + "node_modules/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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/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, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/findup-sync/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "dev": true, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/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==", + "optional": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "dependencies": { + "readable-stream": "1.1.x", + "xregexp": "2.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ftp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/ftp/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/ftp/node_modules/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 + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/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 + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/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=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/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, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz", + "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "data-uri-to-buffer": "3", + "debug": "4", + "file-uri-to-path": "2", + "fs-extra": "^8.1.0", + "ftp": "^0.3.10" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/file-uri-to-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz", + "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/get-uri/node_modules/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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/get-uri/node_modules/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, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/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=", + "optional": true + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-stream/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-stream/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/glob-watcher/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/glob-watcher/node_modules/anymatch/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/glob-watcher/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/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, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-watcher/node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/glob-watcher/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "dependencies": { + "sparkles": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/got/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true, + "optional": true + }, + "node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-clip-empty-files": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/gulp-clip-empty-files/-/gulp-clip-empty-files-0.1.2.tgz", + "integrity": "sha1-vumATiU7vaVc+8Em6NuuZDPtzMg=", + "dev": true, + "dependencies": { + "through2": "~2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-concat": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", + "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", + "dev": true, + "dependencies": { + "concat-with-sourcemaps": "^1.0.0", + "through2": "^2.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-flatten": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/gulp-flatten/-/gulp-flatten-0.4.0.tgz", + "integrity": "sha512-eg4spVTAiv1xXmugyaCxWne1oPtNG0UHEtABx5W8ScLiqAYceyYm6GYA36x0Qh8KOIXmAZV97L2aYGnKREG3Sg==", + "dev": true, + "dependencies": { + "plugin-error": "^0.1.2", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/gulp-htmlmin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-htmlmin/-/gulp-htmlmin-5.0.1.tgz", + "integrity": "sha512-ASlyDPZOSKjHYUifYV0rf9JPDflN9IRIb8lw2vRqtYMC4ljU3zAmnnaVXwFQ3H+CfXxZSUesZ2x7jrnPJu93jA==", + "dev": true, + "dependencies": { + "html-minifier": "^3.5.20", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 6.0" + } + }, + "node_modules/gulp-htmlmin/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp-htmlmin/node_modules/plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp-rename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-rename/-/gulp-rename-2.0.0.tgz", + "integrity": "sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/gulp-slash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gulp-slash/-/gulp-slash-1.1.3.tgz", + "integrity": "sha1-8VUhrCOxeNtE5VHjDi/Lykv2/h0=", + "dev": true, + "dependencies": { + "slash": "~0.1.3", + "through2": "~0.5.1" + } + }, + "node_modules/gulp-slash/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/gulp-slash/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/gulp-slash/node_modules/slash": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/slash/-/slash-0.1.3.tgz", + "integrity": "sha1-qnEMjvULjh0YetbP9G84xla6Dlc=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/gulp-slash/node_modules/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 + }, + "node_modules/gulp-slash/node_modules/through2": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz", + "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=", + "dev": true, + "dependencies": { + "readable-stream": "~1.0.17", + "xtend": "~3.0.0" + } + }, + "node_modules/gulp-slash/node_modules/xtend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", + "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/gulp/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/gulp/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/gulp/node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/gulp/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/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, + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "node_modules/gulp/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gulp/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "node_modules/gulp/node_modules/yargs": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "node_modules/gulp/node_modules/yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "dependencies": { + "glogg": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/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, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/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 + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "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" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/htmlparser2/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "devOptional": true + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=" + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "node_modules/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==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", + "engines": { + "node": "*" + } + }, + "node_modules/init-package-json": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-2.0.5.tgz", + "integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==", + "dependencies": { + "npm-package-arg": "^8.1.5", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "^4.1.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/read-package-json": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.1.tgz", + "integrity": "sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw==", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "dependencies": { + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.12", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/inquirer/node_modules/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/inquirer/node_modules/mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/insight": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.11.1.tgz", + "integrity": "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw==", + "dependencies": { + "async": "^2.6.2", + "chalk": "^4.1.1", + "conf": "^10.0.1", + "inquirer": "^6.3.1", + "lodash.debounce": "^4.0.8", + "os-name": "^4.0.1", + "request": "^2.88.0", + "tough-cookie": "^4.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/insight/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/insight/node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/insight/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/insight/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ionicons": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.5.4.tgz", + "integrity": "sha512-3ph8X9my3inhabWEZ7N0XRA0MnnNQ1v9a602mLNgWsIXnxE9G5BybIZ/pws/OZZ/hoNlvSjk801N03yL9/FNgQ==", + "dependencies": { + "@stencil/core": "~2.10.0" + } + }, + "node_modules/ionicons/node_modules/@stencil/core": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.10.0.tgz", + "integrity": "sha512-15rWMTPQ/sp0lSV82HVCXkIya3QLN+uBl7pqK4JnTrp4HiLrzLmNbWjbvgCs55gw0lULbCIGbRIEsFz+Pe/Q+A==", + "bin": { + "stencil": "bin/stencil" + }, + "engines": { + "node": ">=12.10.0", + "npm": ">=6.0.0" + } + }, + "node_modules/ios-sim": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/ios-sim/-/ios-sim-8.0.2.tgz", + "integrity": "sha512-P7nEG771bfd+JoMRjnis1gpZOkjTUUxu+4Ek1Z+eoaEEoT9byllU9pxfQ8Df7hL3gSkIQxNwTSLhos2I8tWUQA==", + "dependencies": { + "bplist-parser": "^0.0.6", + "nopt": "1.0.9", + "plist": "^3.0.1", + "simctl": "^2" + }, + "bin": { + "ios-sim": "bin/ios-sim" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ios-sim/node_modules/bplist-parser": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.0.6.tgz", + "integrity": "sha1-ONo0cYF9+dRKs4kuJ3B7u9daEbk=" + }, + "node_modules/ios-sim/node_modules/nopt": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.9.tgz", + "integrity": "sha1-O8DXy6e/sNWmdtvtfA6+SKT9RU4=", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz", + "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz", + "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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 + }, + "node_modules/is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", + "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", + "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/istanbul-lib-source-maps/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-26.5.2.tgz", + "integrity": "sha512-4HFabJVwsgDwul/7rhXJ3yFAF/aUkVIXiJWmgFxb+WMdZG39fVvOwYAs8/3r4AlFPc4m/n5sTMtuMbOL3kNtrQ==", + "dev": true, + "dependencies": { + "@jest/core": "^26.5.2", + "import-local": "^3.0.2", + "jest-cli": "^26.5.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-changed-files": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.5.2.tgz", + "integrity": "sha512-qSmssmiIdvM5BWVtyK/nqVpN3spR5YyvkvPqz1x3BR1bwIxsWmU/MGwLoCrPNLbkG2ASAKfvmJpOduEApBPh2w==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "execa": "^4.0.0", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.5.2.tgz", + "integrity": "sha512-dqJOnSegNdE5yDiuGHsjTM5gec7Z4AcAMHiW+YscbOYJAlb3LEtDSobXCq0or9EmGQI5SFmKy4T7P1FxetJOfg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^26.5.2", + "@jest/types": "^26.5.2", + "babel-jest": "^26.5.2", + "chalk": "^4.0.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.4", + "jest-environment-jsdom": "^26.5.2", + "jest-environment-node": "^26.5.2", + "jest-get-type": "^26.3.0", + "jest-jasmine2": "^26.5.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.5.2", + "jest-util": "^26.5.2", + "jest-validate": "^26.5.2", + "micromatch": "^4.0.2", + "pretty-format": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.5.2.tgz", + "integrity": "sha512-HCSWDUGwsov5oTlGzrRM+UPJI/Dpqi9jzeV0fdRNi3Ch5bnoXhnyJMmVg2juv9081zLIy3HGPI5mcuGgXM2xRA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^26.5.0", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-docblock": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", + "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.5.2.tgz", + "integrity": "sha512-w7D9FNe0m2D3yZ0Drj9CLkyF/mGhmBSULMQTypzAKR746xXnjUrK8GUJdlLTWUF6dd0ks3MtvGP7/xNFr9Aphg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "jest-util": "^26.5.2", + "pretty-format": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.5.2.tgz", + "integrity": "sha512-fWZPx0bluJaTQ36+PmRpvUtUlUFlGGBNyGX1SN3dLUHHMcQ4WseNEzcGGKOw4U5towXgxI4qDoI3vwR18H0RTw==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.5.2", + "@jest/fake-timers": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/node": "*", + "jest-mock": "^26.5.2", + "jest-util": "^26.5.2", + "jsdom": "^16.4.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-environment-node": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.5.2.tgz", + "integrity": "sha512-YHjnDsf/GKFCYMGF1V+6HF7jhY1fcLfLNBDjhAOvFGvt6d8vXvNdJGVM7uTZ2VO/TuIyEFhPGaXMX5j3h7fsrA==", + "dev": true, + "dependencies": { + "@jest/environment": "^26.5.2", + "@jest/fake-timers": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/node": "*", + "jest-mock": "^26.5.2", + "jest-util": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-get-type": { + "version": "26.3.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", + "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-haste-map": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.5.2.tgz", + "integrity": "sha512-lJIAVJN3gtO3k4xy+7i2Xjtwh8CfPcH08WYjZpe9xzveDaqGw9fVNCpkYu6M525wKFVkLmyi7ku+DxCAP1lyMA==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", + "jest-serializer": "^26.5.0", + "jest-util": "^26.5.2", + "jest-worker": "^26.5.0", + "micromatch": "^4.0.2", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "engines": { + "node": ">= 10.14.2" + }, + "optionalDependencies": { + "fsevents": "^2.1.2" + } + }, + "node_modules/jest-haste-map/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.5.2.tgz", + "integrity": "sha512-2J+GYcgLVPTkpmvHEj0/IDTIAuyblGNGlyGe4fLfDT2aktEPBYvoxUwFiOmDDxxzuuEAD2uxcYXr0+1Yw4tjFA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.1.0", + "@jest/environment": "^26.5.2", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^26.5.2", + "is-generator-fn": "^2.0.0", + "jest-each": "^26.5.2", + "jest-matcher-utils": "^26.5.2", + "jest-message-util": "^26.5.2", + "jest-runtime": "^26.5.2", + "jest-snapshot": "^26.5.2", + "jest-util": "^26.5.2", + "pretty-format": "^26.5.2", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-leak-detector": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.5.2.tgz", + "integrity": "sha512-h7ia3dLzBFItmYERaLPEtEKxy3YlcbcRSjj0XRNJgBEyODuu+3DM2o62kvIFvs3PsaYoIIv+e+nLRI61Dj1CNw==", + "dev": true, + "dependencies": { + "jest-get-type": "^26.3.0", + "pretty-format": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.5.2.tgz", + "integrity": "sha512-W9GO9KBIC4gIArsNqDUKsLnhivaqf8MSs6ujO/JDcPIQrmY+aasewweXVET8KdrJ6ADQaUne5UzysvF/RR7JYA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^26.5.2", + "jest-get-type": "^26.3.0", + "pretty-format": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.5.2.tgz", + "integrity": "sha512-Ocp9UYZ5Jl15C5PNsoDiGEk14A4NG0zZKknpWdZGoMzJuGAkVt10e97tnEVMYpk7LnQHZOfuK2j/izLBMcuCZw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@jest/types": "^26.5.2", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.2", + "slash": "^3.0.0", + "stack-utils": "^2.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.5.2.tgz", + "integrity": "sha512-9SiU4b5PtO51v0MtJwVRqeGEroH66Bnwtq4ARdNP7jNXbpT7+ByeWNAk4NeT/uHfNSVDXEXgQo1XRuwEqS6Rdw==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "@types/node": "*" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-preset-angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-8.3.1.tgz", + "integrity": "sha512-WhQm+0tXzikkvIF35XErV87DqYbieZI0R0MIGgn7VE/DDhdbXFDmYQxFZ7w4qcA0cGLLvSMTBbIsUtHeE/rFxQ==", + "dev": true, + "dependencies": { + "pretty-format": "26.x", + "ts-jest": "26.x" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "@angular/core": ">=2.0.0", + "@angular/platform-browser-dynamic": ">=2.0.0", + "jest": "^26.0.0" + } + }, + "node_modules/jest-regex-util": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", + "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "dev": true, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.5.2.tgz", + "integrity": "sha512-XsPxojXGRA0CoDD7Vis59ucz2p3cQFU5C+19tz3tLEAlhYKkK77IL0cjYjikY9wXnOaBeEdm1rOgSJjbZWpcZg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^26.5.2", + "read-pkg-up": "^7.0.1", + "resolve": "^1.17.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.5.2.tgz", + "integrity": "sha512-LLkc8LuRtxqOx0AtX/Npa2C4I23WcIrwUgNtHYXg4owYF/ZDQShcwBAHjYZIFR06+HpQcZ43+kCTMlQ3aDCYTg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "jest-regex-util": "^26.0.0", + "jest-snapshot": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/parse-json": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", + "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/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, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/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, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-resolve/node_modules/read-pkg/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.5.2.tgz", + "integrity": "sha512-GKhYxtSX5+tXZsd2QwfkDqPIj5C2HqOdXLRc2x2qYqWE26OJh17xo58/fN/mLhRkO4y6o60ZVloan7Kk5YA6hg==", + "dev": true, + "dependencies": { + "@jest/console": "^26.5.2", + "@jest/environment": "^26.5.2", + "@jest/test-result": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.7.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "jest-config": "^26.5.2", + "jest-docblock": "^26.0.0", + "jest-haste-map": "^26.5.2", + "jest-leak-detector": "^26.5.2", + "jest-message-util": "^26.5.2", + "jest-resolve": "^26.5.2", + "jest-runtime": "^26.5.2", + "jest-util": "^26.5.2", + "jest-worker": "^26.5.0", + "source-map-support": "^0.5.6", + "throat": "^5.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/jest-worker": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", + "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-runtime": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.5.2.tgz", + "integrity": "sha512-zArr4DatX/Sn0wswX/AnAuJgmwgAR5rNtrUz36HR8BfMuysHYNq5sDbYHuLC4ICyRdy5ae/KQ+sczxyS9G6Qvw==", + "dev": true, + "dependencies": { + "@jest/console": "^26.5.2", + "@jest/environment": "^26.5.2", + "@jest/fake-timers": "^26.5.2", + "@jest/globals": "^26.5.2", + "@jest/source-map": "^26.5.0", + "@jest/test-result": "^26.5.2", + "@jest/transform": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.4", + "jest-config": "^26.5.2", + "jest-haste-map": "^26.5.2", + "jest-message-util": "^26.5.2", + "jest-mock": "^26.5.2", + "jest-regex-util": "^26.0.0", + "jest-resolve": "^26.5.2", + "jest-snapshot": "^26.5.2", + "jest-util": "^26.5.2", + "jest-validate": "^26.5.2", + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.4.1" + }, + "bin": { + "jest-runtime": "bin/jest-runtime.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-runtime/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest-runtime/node_modules/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 + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jest-serializer": { + "version": "26.5.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.5.0.tgz", + "integrity": "sha512-+h3Gf5CDRlSLdgTv7y0vPIAoLgX/SI7T4v6hy+TEXMgYbv+ztzbg5PSN6mUXAT/hXYHvZRWm+MaObVfqkhCGxA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.4" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.5.2.tgz", + "integrity": "sha512-MkXIDvEefzDubI/WaDVSRH4xnkuirP/Pz8LhAIDXcVQTmcEfwxywj5LGwBmhz+kAAIldA7XM4l96vbpzltSjqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0", + "@jest/types": "^26.5.2", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.0.0", + "chalk": "^4.0.0", + "expect": "^26.5.2", + "graceful-fs": "^4.2.4", + "jest-diff": "^26.5.2", + "jest-get-type": "^26.3.0", + "jest-haste-map": "^26.5.2", + "jest-matcher-utils": "^26.5.2", + "jest-message-util": "^26.5.2", + "jest-resolve": "^26.5.2", + "natural-compare": "^1.4.0", + "pretty-format": "^26.5.2", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.5.2.tgz", + "integrity": "sha512-WTL675bK+GSSAYgS8z9FWdCT2nccO1yTIplNLPlP0OD8tUk/H5IrWKMMRudIQQ0qp8bb4k+1Qa8CxGKq9qnYdg==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "@types/node": "*", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.4", + "is-ci": "^2.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.5.2.tgz", + "integrity": "sha512-FmJks0zY36mp6Af/5sqO6CTL9bNMU45yKCJk3hrz8d2aIqQIlN1pr9HPIwZE8blLaewOla134nt5+xAmWsx3SQ==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "camelcase": "^6.0.0", + "chalk": "^4.0.0", + "jest-get-type": "^26.3.0", + "leven": "^3.1.0", + "pretty-format": "^26.5.2" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.5.2.tgz", + "integrity": "sha512-i3m1NtWzF+FXfJ3ljLBB/WQEp4uaNhX7QcQUWMokcifFTUQBDFyUMEwk0JkJ1kopHbx7Een3KX0Q7+9koGM/Pw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^26.5.2", + "@jest/types": "^26.5.2", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^26.5.2", + "string-length": "^4.0.1" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest-watcher/node_modules/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, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-worker": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.0.0.tgz", + "integrity": "sha512-pPaYa2+JnwmiZjK9x7p9BoZht+47ecFCDFA/CJxspHzeDvQcfVBLWzCiWyo+EGrSiQMWZtCFo9iSvMZnAAo8vw==", + "dev": true, + "dependencies": { + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/jest/node_modules/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 + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.5.2.tgz", + "integrity": "sha512-usm48COuUvRp8YEG5OWOaxbSM0my7eHn3QeBWxiGUuFhvkGVBvl1fic4UjC02EAEQtDv8KrNQUXdQTV6ZZBsoA==", + "dev": true, + "dependencies": { + "@jest/core": "^26.5.2", + "@jest/test-result": "^26.5.2", + "@jest/types": "^26.5.2", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.4", + "import-local": "^3.0.2", + "is-ci": "^2.0.0", + "jest-config": "^26.5.2", + "jest-util": "^26.5.2", + "jest-validate": "^26.5.2", + "prompts": "^2.0.1", + "yargs": "^15.4.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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 + }, + "node_modules/js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/jsdoctypeparser": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz", + "integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==", + "dev": true, + "bin": { + "jsdoctypeparser": "bin/jsdoctypeparser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", + "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "acorn": "^7.1.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.2.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.0", + "domexception": "^2.0.1", + "escodegen": "^1.14.1", + "html-encoding-sniffer": "^2.0.1", + "is-potential-custom-element-name": "^1.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.1", + "request": "^2.88.2", + "request-promise-native": "^1.0.8", + "saxes": "^5.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0", + "ws": "^7.2.3", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/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 + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/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==" + }, + "node_modules/json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, + "node_modules/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 + }, + "node_modules/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=" + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "node_modules/json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jsprim/node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/jszip": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "node_modules/just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", + "dev": true + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/keytar": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.2.0.tgz", + "integrity": "sha512-ECSaWvoLKI5SI0pGpZQeUV1/lpBYfkaxvoSp3zkiPOz05VavwSfLi8DdEaa9N2ekQZv3Chy+o7aP6n9mairBgw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-addon-api": "^3.0.0", + "prebuild-install": "^6.0.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", + "dev": true, + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "dependencies": { + "flush-write-stream": "^1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/leek": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/leek/-/leek-0.0.24.tgz", + "integrity": "sha1-5ADlfw5g2O8r1NBo3EKKVDRdvNo=", + "dev": true, + "dependencies": { + "debug": "^2.1.0", + "lodash.assign": "^3.2.0", + "rsvp": "^3.0.21" + } + }, + "node_modules/leek/node_modules/rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true, + "engines": { + "node": "0.12.* || 4.* || 6.* || >= 7.*" + } + }, + "node_modules/less": { + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", + "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "dev": true, + "dependencies": { + "tslib": "^1.10.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "native-request": "^1.0.5", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-6.1.0.tgz", + "integrity": "sha512-/jLzOwLyqJ7Kt3xg5sHHkXtOyShWwFj410K9Si9WO+/h8rmYxxkSR0A3/hFEntWudE20zZnWMtpMYnLzqTVdUA==", + "dev": true, + "dependencies": { + "clone": "^2.1.2", + "less": "^3.11.1", + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/less/node_modules/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, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/less/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "dependencies": { + "leven": "^3.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.2.0.tgz", + "integrity": "sha512-XPsdL/0brSHf+7dXIlRqotnCQ58RX2au6otkOg4U3dm8uH+Ka/fW4iukEs95uXm+qKe/SBs+s1Ll/aQddKG+tg==", + "dev": true, + "dependencies": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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 + }, + "node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "dependencies": { + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "node_modules/lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", + "dev": true + }, + "node_modules/lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "dev": true, + "dependencies": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "node_modules/lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "node_modules/lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "dev": true, + "dependencies": { + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "dev": true + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "dependencies": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/loglevel": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz", + "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-loglevel?utm_medium=referral&utm_source=npm_fund" + } + }, + "node_modules/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, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loud-rejection": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz", + "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==", + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/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 + }, + "node_modules/make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "dependencies": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/make-fetch-happen/node_modules/http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "node_modules/make-fetch-happen/node_modules/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, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-fetch-happen/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "dependencies": { + "tmpl": "1.0.x" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", + "dev": true, + "dependencies": { + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/matchdep/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/matchdep/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mathjax": { + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-2.7.7.tgz", + "integrity": "sha512-OOl0B2/0tSJAtAZarXnQuLDBLgTNRqiI9VqHTQzPsxf4okT2iIpDrvaklK9x2QEMD1sDj4yRn11Ygci41DxMAQ==" + }, + "node_modules/md5-file": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", + "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", + "bin": { + "md5-file": "cli.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/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, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-browser-compat-data": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.1.2.tgz", + "integrity": "sha512-uBNX2P4iu3PZcXP20rL+n7fxN9PWZLj0y43QMe/1aXzqP3H6HbVOeePS0cBZCtMwcfr2Tugf1OHj+/wLam+dUg==", + "deprecated": "mdn-browser-compat-data is deprecated. Upgrade to @mdn/browser-compat-data. Learn more: https://github.com/mdn/browser-compat-data/blob/v1.1.2/UPGRADE-2.0.x.md", + "dev": true, + "dependencies": { + "extend": "3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/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, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dependencies": { + "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/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, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/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 + }, + "node_modules/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 + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "optional": true + }, + "node_modules/moment": { + "version": "2.29.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", + "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==", + "engines": { + "node": "*" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", + "dev": true, + "dependencies": { + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/move-file/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "node_modules/nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true, + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "optional": true + }, + "node_modules/native-request": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.7.tgz", + "integrity": "sha512-9nRjinI9bmz+S7dgNtf4A70+/vPhnd+2krGpy4SUlADuOuSa24IDkNaZ+R/QT1wQ6S8jBdi6wE7fLekFZNfUpQ==", + "dev": true, + "optional": true + }, + "node_modules/native-run": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/native-run/-/native-run-1.4.0.tgz", + "integrity": "sha512-3XJiDxGNi6XCsn8KYDQFSYGDVkKEMg0y55qTMU0feEuPNNU4iztBwW5bE87sfybZsQPsYDJQyYt9CUKDSoJgdQ==", + "dev": true, + "dependencies": { + "@ionic/utils-fs": "^3.0.0", + "@ionic/utils-terminal": "^2.3.1", + "bplist-parser": "0.2.0", + "debug": "^4.1.1", + "elementtree": "^0.1.7", + "ini": "^1.3.5", + "plist": "^3.0.1", + "split2": "^3.1.0", + "through2": "^4.0.2", + "tslib": "^2.0.1", + "yauzl": "^2.10.0" + }, + "bin": { + "native-run": "bin/native-run" + }, + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/native-run/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/native-run/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/native-run/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/native-run/node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/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 + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/nl.kingsquare.cordova.background-audio": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nl.kingsquare.cordova.background-audio/-/nl.kingsquare.cordova.background-audio-1.0.1.tgz", + "integrity": "sha1-Gx1NzaijXAx/x5UzN7FzsUtPmGA=" + }, + "node_modules/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, + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-abi": { + "version": "2.19.3", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.19.3.tgz", + "integrity": "sha512-9xZrlyfvKhWme2EXFKQhZRp1yNWT/uI1luYPr3sFl+H4keYY4xR+1jO7mvTTijIsHf1M+QDe9uWuKeEpLInIlg==", + "optional": true, + "dependencies": { + "semver": "^5.4.1" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-addon-api": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", + "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==", + "optional": true + }, + "node_modules/node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "dependencies": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/node-libs-browser/node_modules/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, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-notifier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", + "dev": true, + "optional": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", + "dev": true, + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-releases": { + "version": "1.1.61", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz", + "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==", + "dev": true + }, + "node_modules/noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "optional": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/now-and-later": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", + "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", + "dev": true, + "dependencies": { + "once": "^1.3.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "node_modules/npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dependencies": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "JSONStream": "^1.3.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/npm-registry-fetch/node_modules/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, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/npm-registry-fetch/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-registry-fetch/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/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, + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz", + "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-path": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz", + "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.reduce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/objectorarray": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.4.tgz", + "integrity": "sha512-91k8bjcldstRz1bG6zJo8lWD7c6QXcB4nTDUqiEvIL1xAsLoZlOOZZG+nd6YPz+V7zY1580J4Xxh1vZtyv4i/w==" + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", + "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/ora/-/ora-4.0.4.tgz", + "integrity": "sha512-77iGeVU1cIdRhgFzCK8aw1fbtT1B/iZAvWjS+l/o1x0RShMgxHUZaD2yDpWsNCPwXg9z1ZA78Kbdvr8kBmG/Ww==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/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, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/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, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.1" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/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 + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dependencies": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-each-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit/node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4", + "get-uri": "3", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "5", + "pac-resolver": "^5.0.0", + "raw-body": "^2.2.0", + "socks-proxy-agent": "5" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pac-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pac-resolver": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", + "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", + "dev": true, + "dependencies": { + "degenerator": "^3.0.1", + "ip": "^1.1.5", + "netmask": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pacote": { + "version": "9.5.12", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-normalize-package-bin": "^1.0.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^3.0.0", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.10", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + } + }, + "node_modules/pacote/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/pacote/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/pacote/node_modules/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, + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/pacote/node_modules/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, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/pacote/node_modules/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, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/pacote/node_modules/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, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/pacote/node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/pacote/node_modules/npm-package-arg": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.7.1", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/pacote/node_modules/npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "node_modules/pacote/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/pacote/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/pacote/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/pacote/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/pacote/node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dev": true, + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/pacote/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/pacote/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/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, + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/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, + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "dependencies": { + "node-modules-regexp": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/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, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/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, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/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, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/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==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/plist": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", + "dependencies": { + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "dependencies": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "dependencies": { + "kind-of": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plugin-error/node_modules/kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz", + "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==", + "dev": true, + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.31.tgz", + "integrity": "sha512-a937VDHE1ftkjk+8/7nj/mrjtmkn69xxzJgRETXdAUU+IgOYPQNJF17haGWbeDxSyk++HA14UA98FurvPyBJOA==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-import/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/postcss-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-loader/node_modules/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, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "dependencies": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/chalk/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-modules-local-by-default/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss": { + "version": "7.0.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz", + "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "dependencies": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", + "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/postcss/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/chalk/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prebuild-install": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.0.0.tgz", + "integrity": "sha512-h2ZJ1PXHKWZpp1caLw0oX9sagVpL2YTk+ZwInQbQ3QqNd4J03O6MpFNmMTJlkfgPENWqe5kP0WjQLqz5OjLfsw==", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "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" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-format": { + "version": "26.5.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.5.2.tgz", + "integrity": "sha512-VizyV669eqESlkOikKJI8Ryxl/kPpbdLwNdPs2GrbQs18MpySB5S0Yo0N7zkg2xTRiFq4CFw8ct5Vg4a0xP0og==", + "dev": true, + "dependencies": { + "@jest/types": "^26.5.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/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==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "dependencies": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/promise-retry/node_modules/retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/promzard": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "dependencies": { + "read": "1" + } + }, + "node_modules/properties-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/properties-parser/-/properties-parser-0.3.1.tgz", + "integrity": "sha1-ExbpU5/7/ZOEXjabIRAiq9R4dxo=", + "dependencies": { + "string.prototype.codepointat": "^0.2.0" + }, + "engines": { + "node": ">= 0.3.1" + } + }, + "node_modules/protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "dependencies": { + "genfun": "^5.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.0", + "debug": "4", + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "lru-cache": "^5.1.1", + "pac-proxy-agent": "^5.0.0", + "proxy-from-env": "^1.0.0", + "socks-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-agent/node_modules/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, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/proxy-agent/node_modules/socks-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "4", + "socks": "^2.3.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-agent/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qrcode-reader": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/qrcode-reader/-/qrcode-reader-1.0.4.tgz", + "integrity": "sha512-rRjALGNh9zVqvweg1j5OKIQKNsw3bLC+7qwlnead5K/9cb1cEIAGkwikt/09U0K+2IDWGD9CC6SP7tHAjUeqvQ==" + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/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, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.1.tgz", + "integrity": "sha512-baolhQBSi3iNh1cglJjA0mYzga+wePk7vdEX//1dTFd+v4TsQlQE0jitJSNF1OIP82rdYulH7otaVmdlDaJ64A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/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 + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dependencies": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "deprecated": "The functionality that this package provided is now in @npmcli/arborist", + "dev": true, + "dependencies": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", + "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-parser": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", + "integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regextras": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", + "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", + "dev": true, + "engines": { + "node": ">=0.1.14" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/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 + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native/node_modules/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, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/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==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/resolve-url-loader": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", + "integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "2.0.0", + "camelcase": "5.3.1", + "compose-function": "3.0.3", + "convert-source-map": "1.7.0", + "es6-iterator": "2.0.3", + "loader-utils": "1.2.3", + "postcss": "7.0.21", + "rework": "1.0.1", + "rework-visit": "1.0.0", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/chalk/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/resolve-url-loader/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/resolve-url-loader/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/resolve-url-loader/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", + "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rework": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz", + "integrity": "sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc=", + "dev": true, + "dependencies": { + "convert-source-map": "^0.3.3", + "css": "^2.0.0" + } + }, + "node_modules/rework-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz", + "integrity": "sha1-mUWygD8hni96ygCtuLyfZA+ELJo=", + "dev": true + }, + "node_modules/rework/node_modules/convert-source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", + "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", + "dev": true + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rollup": { + "version": "2.10.9", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.9.tgz", + "integrity": "sha512-dY/EbjiWC17ZCUSyk14hkxATAMAShkMsD43XmZGWjLrgFj15M3Dw2kEkA9ns64BiLFm9PKN6vTQw8neHwK74eg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.2" + } + }, + "node_modules/rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true, + "engines": { + "node": "6.* || >= 7.*" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "node_modules/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==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", + "dev": true, + "dependencies": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "bin": { + "sane": "src/cli.js" + }, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/sane/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/sane/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/sane/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sane/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sane/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sane/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/sass": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.5.tgz", + "integrity": "sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q==", + "dev": true, + "dependencies": { + "chokidar": ">=2.0.0 <4.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/sass-loader": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", + "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.2.3", + "neo-async": "^2.6.1", + "schema-utils": "^2.6.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0", + "sass": "^1.3.0", + "webpack": "^4.36.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sass-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/sass-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sass-loader/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sax": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz", + "integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk=" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/sdp": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-1.5.4.tgz", + "integrity": "sha1-jgOPbdsUvXZa4fS1IW4SCUUR4NA=" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", + "dev": true, + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "dependencies": { + "semver": "^5.0.0" + } + }, + "node_modules/semver-intersect/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/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==" + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/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==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/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, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true, + "optional": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/simctl": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/simctl/-/simctl-2.0.3.tgz", + "integrity": "sha512-kKCak0yszxHae5eVWcmrjV3ouUGac3sjlhjdLWpyPu4eiQcWoHsCrqS34kkgzHN8Ystqkh/LFjzrldk/g3BYJg==", + "dependencies": { + "shelljs": "^0.8.5", + "tail": "^0.4.0" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "optional": true, + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/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==", + "optional": true, + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "optional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/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, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/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 + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/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, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/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, + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "node_modules/sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "dependencies": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "dependencies": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + }, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "dependencies": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.0.0.tgz", + "integrity": "sha512-ZayyQCSCrQazN50aCvuS84lJT4xc1ZAcykH5blHaBdVveSwjiFK8UGMPvao0ho54DTb0Jf7m57uRRG/YYUZ2Fg==", + "dev": true, + "dependencies": { + "data-urls": "^2.0.0", + "iconv-lite": "^0.5.1", + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6", + "source-map": "^0.6.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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=", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/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 + }, + "node_modules/sparkles": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", + "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/spdy-transport/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/speed-measure-webpack-plugin": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.3.tgz", + "integrity": "sha512-2ljD4Ch/rz2zG3HsLsnPfp23osuPBS0qPuz9sGpkNXTN1Ic4M+W9xB8l8rS8ob2cO4b1L+WTJw/0AJwWYVgcxQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": "^1 || ^2 || ^3 || ^4" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/speed-measure-webpack-plugin/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/speed-measure-webpack-plugin/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/ssh-config": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/ssh-config/-/ssh-config-1.1.6.tgz", + "integrity": "sha512-ZPO9rECxzs5JIQ6G/2EfL1I9ho/BVZkx9HRKn8+0af7QgwAmumQ7XBFP1ggMyPMo+/tUbmv0HFdv4qifdO/9JA==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.2.tgz", + "integrity": "sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/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, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dev": true, + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/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, + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-exhaust": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", + "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/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 + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-length": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", + "integrity": "sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==" + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==" + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-loader": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.2.1.tgz", + "integrity": "sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^2.6.6" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus": { + "version": "0.54.7", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.7.tgz", + "integrity": "sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==", + "dev": true, + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.3", + "mkdirp": "~0.5.x", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.0.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + }, + "peerDependencies": { + "stylus": ">=0.52.4" + } + }, + "node_modules/stylus-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/stylus-loader/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/stylus/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/superagent": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "superagent": ">= 0.15.4 || 1 || 2 || 3" + } + }, + "node_modules/superagent-proxy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent-proxy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/superagent/node_modules/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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sver-compat": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", + "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", + "dev": true, + "dependencies": { + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/svgo/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, + "node_modules/systeminformation": { + "version": "5.11.3", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.11.3.tgz", + "integrity": "sha512-sjvlk4SUefhwrONUeLijXt+NQyptAiqShd5v6bFJFNr9EVJUr3YSnNxDqCz0gp5EJBUj88pL1ssc8ZHPtngBOw==", + "os": [ + "darwin", + "linux", + "win32", + "freebsd", + "openbsd", + "netbsd", + "sunos", + "android" + ], + "bin": { + "systeminformation": "lib/cli.js" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "Buy me a coffee", + "url": "https://www.buymeacoffee.com/systeminfo" + } + }, + "node_modules/table": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.6.0.tgz", + "integrity": "sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz", + "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/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 + }, + "node_modules/table/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tail": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tail/-/tail-0.4.0.tgz", + "integrity": "sha1-0p3nJ1DMmdseBTr/E8NZ7PtxMAI=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "optional": true + }, + "node_modules/tar-stream": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/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==", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/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, + "dependencies": { + "type-fest": "^0.11.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link/node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", + "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dev": true, + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/terser-webpack-plugin/node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "dependencies": { + "through2": "^2.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", + "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-jest": { + "version": "26.4.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.4.1.tgz", + "integrity": "sha512-F4aFq01aS6mnAAa0DljNmKr/Kk9y4HVZ1m6/rtJ0ED56cuxINGq3Q9eVAh+z5vcYKe5qnTMvv90vE8vUMFxomg==", + "dev": true, + "dependencies": { + "@types/jest": "26.x", + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^26.1.0", + "json5": "2.x", + "lodash.memoize": "4.x", + "make-error": "1.x", + "mkdirp": "1.x", + "semver": "7.x", + "yargs-parser": "20.x" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "jest": ">=26 <27", + "typescript": ">=3.8 <5.0" + } + }, + "node_modules/ts-jest/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "20.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.1.tgz", + "integrity": "sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-md5": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.7.tgz", + "integrity": "sha512-emODogvKGWi1KO1l9c6YxLMBn6CEH3VrH5mVPIyOtxBG52BvV4jP3GWz6bOZCz61nLgBc3ffQYE4+EHfCD+V7w==" + }, + "node_modules/ts-node": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", + "integrity": "sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==", + "dev": true, + "dependencies": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + }, + "peerDependencies": { + "typescript": ">=2.0" + } + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tsutils": { + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz", + "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.9.tgz", + "integrity": "sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/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, + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "node_modules/uglify-js/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive/node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", + "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" + }, + "node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/undertaker/node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universal-analytics": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", + "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "dev": true, + "dependencies": { + "debug": "^3.0.0", + "request": "^2.88.0", + "uuid": "^3.0.0" + } + }, + "node_modules/universal-analytics/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/universal-analytics/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "node_modules/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, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/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=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util.promisify/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-5.0.1.tgz", + "integrity": "sha512-mbDNjuDajqYe3TXFk5qxcQy8L1msXNE37WTlLoqqpBfRsimbNcrlhQlDPntmECEcUvdC+AQ8CyMMf6EUx1r74Q==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/valid-identifier": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/valid-identifier/-/valid-identifier-0.0.2.tgz", + "integrity": "sha512-zaSmOW6ykXwrkX0YTuFUSoALNEKGaQHpxBJQLb3TXspRNDpBwbfrIQCZqAQ0LKBlKuyn2YOq7NNd6415hvZ33g==" + }, + "node_modules/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==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vinyl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", + "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", + "dev": true, + "dependencies": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, + "dependencies": { + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", + "graceful-fs": "^4.0.0", + "is-valid-glob": "^1.0.0", + "lazystream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", + "through2": "^2.0.0", + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "dependencies": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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 + }, + "node_modules/vm2": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "dev": true, + "dependencies": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/vm2/node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/vm2/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "dependencies": { + "makeerror": "1.0.x" + } + }, + "node_modules/watchpack": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", + "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.6.1", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/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, + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/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, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/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, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dev": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/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, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.4.1.tgz", + "integrity": "sha512-XMLFInbGbB1HV7K4vHWANzc1CN0t/c4bBvnlvGxGwV45yE/S/feAXIm8dJsCkzqWtSKnmaEgTp/meyeThxG4Iw==", + "dev": true, + "dependencies": { + "webpack-sources": "^1.3.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "html-webpack-plugin": "^2.21.0 || ~3 || >=4.0.0-alpha.2 <5", + "webpack": "^1.12.11 || ~2 || ~3 || ~4" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webpack/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/webrtc-adapter": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-3.4.3.tgz", + "integrity": "sha1-tjYGLu6abvFYrNDYUBtnhDS1bxY=", + "dependencies": { + "sdp": "^1.5.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "dependencies": { + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.3.0.tgz", + "integrity": "sha512-BQRf/ej5Rp3+n7k0grQXZj9a1cHtsp4lqj01p59xBWFKdezR8sO37XnpafwNqiFac/v2Il12EIMjX/Y4VZtT8Q==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^2.0.2", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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 + }, + "node_modules/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=", + "optional": true + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/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==" + }, + "node_modules/widest-line/node_modules/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dependencies": { + "execa": "^4.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dependencies": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-plugin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-4.0.3.tgz", + "integrity": "sha512-7hFDYWiKcE3yHZvemsoM9lZis/PzurHAEX1ej8PLCu818Rt6QqUAiDdxHPCKZctzmhqzPpcFSgvMCiPbtooqAg==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0" + }, + "peerDependencies": { + "webpack": ">= 4" + } + }, + "node_modules/worker-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/worker-plugin/node_modules/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, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/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, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xcode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", + "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", + "dependencies": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz", + "integrity": "sha1-OQTBQ/qOs6ADDsZG0pAqLxtwbEQ=" + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, + "node_modules/xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/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, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs/node_modules/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, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/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, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/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, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/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, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zone.js": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", + "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==" + } + }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1101.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.2.tgz", - "integrity": "sha512-MLmBfHiiyPhbFSSAX4oMecPjEuBauOui5uBpI6BKNnk/7783fznbkbAKjXlOco7M81gkNeEoHMR8c+mOfcvv7g==", + "@angular-builders/custom-webpack": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@angular-builders/custom-webpack/-/custom-webpack-10.0.1.tgz", + "integrity": "sha512-YDy5zEKVwXdoXLjmbsY6kGaEbmunQxaPipxrwLUc9hIjRLU2WcrX9vopf1R9Pgj4POad73IPBNGu+ibqNRFIEQ==", "dev": true, "requires": { - "@angular-devkit/core": "11.1.2", - "rxjs": "6.6.3" + "@angular-devkit/architect": ">=0.1000.0 < 0.1100.0", + "@angular-devkit/build-angular": ">=0.1000.0 < 0.1100.0", + "@angular-devkit/core": "^10.0.0", + "lodash": "^4.17.15", + "ts-node": "^9.0.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1002.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1002.3.tgz", + "integrity": "sha512-7ainXRNO1njZ6bBbJXGpMzCh0OYrzuIRe/+zRj0ncV1YfEsJb2yWBuiza0+y2Ljco7hdd4wr+7eJm7cfn+NvAw==", + "dev": true, + "requires": { + "@angular-devkit/core": "10.2.3", + "rxjs": "6.6.2" + } + }, + "@angular-devkit/core": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.2.3.tgz", + "integrity": "sha512-pMM1v9Xjqx6YLOQxQYs0D+03H6XPDZLS8cyEtoQX2iYdh8qlKHZVbJa2WsfzwMoIPtgcXfQAXn113VEgrQPLFA==", + "dev": true, + "requires": { + "ajv": "6.12.4", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.2", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "6.12.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz", + "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==", + "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" + } + }, + "rxjs": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz", + "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ts-node": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", + "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/architect": { + "version": "0.1202.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1202.7.tgz", + "integrity": "sha512-zqqw3h8jMDYsRrXUNY1J8xtUl6wmBO++yTka+CoEIFetNdLdoWmb5VpaA81i0aSBhXBgnBUUFvqZGdiI7BbV8A==", + "dev": true, + "requires": { + "@angular-devkit/core": "12.2.7", + "rxjs": "6.6.7" }, "dependencies": { "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -154,6 +31360,49 @@ "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "terser-webpack-plugin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", + "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", + "dev": true, + "requires": { + "cacache": "^15.0.3", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.0.0", + "source-map": "^0.6.1", + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "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 + } + } } } }, @@ -226,34 +31475,41 @@ } }, "@angular-devkit/core": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.2.tgz", - "integrity": "sha512-V7zOMqL2l56JcwXVyswkG+7+t67r9XtkrVzRcG2Z5ZYwafU+iKWMwg5kBFZr1SX7fM1M9E4MpskxqtagQeUKng==", + "version": "12.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-12.2.7.tgz", + "integrity": "sha512-WeLlDZaudpx10OGDPfVcWu/CaEWiWzAaLTUQz0Ww/yM+01FxR/P8yeH1sYAV1MS6d6KHvXGw7Lpf8PV7IA/zHA==", "dev": true, "requires": { - "ajv": "6.12.6", + "ajv": "8.6.2", + "ajv-formats": "2.1.0", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", - "rxjs": "6.6.3", + "rxjs": "6.6.7", "source-map": "0.7.3" }, "dependencies": { "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -309,7 +31565,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-4.2.0.tgz", "integrity": "sha512-qM4hpweuQ14ul8CU6LKpUWFZs6POUE7HZKdTllUrYuoZMrTpNB1XGelR0pweYzbfo4XRnUaO1NVgWhWOWiD5MA==", - "dev": true + "dev": true, + "requires": {} }, "@angular-eslint/eslint-plugin": { "version": "4.2.0", @@ -624,9 +31881,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "cli-cursor": { @@ -761,7 +32018,6 @@ "version": "10.0.14", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-10.0.14.tgz", "integrity": "sha512-lYNo6/MmnYAVFoDQDBB6HMFd9zHg3RHXc6hn+wchU0XSWiIsg6WYHbKOb/DyqUEyKebzy0gSKZf7gUeZHtj62Q==", - "dev": true, "requires": { "tslib": "^2.0.0" } @@ -788,9 +32044,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "cliui": { @@ -2279,19 +33535,17 @@ } } }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, "@ionic-native/badge": { "version": "5.33.0", "resolved": "https://registry.npmjs.org/@ionic-native/badge/-/badge-5.33.0.tgz", "integrity": "sha512-g/E2HLB53csZq5hWeyWUFj6r7CrllSPuOkV88XotIFTQFNuY7TaLtiFUVFSvWXRh0Kvu+w7TI5Hys67d/v7F/g==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/camera": { @@ -2299,14 +33553,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/camera/-/camera-5.33.0.tgz", "integrity": "sha512-cLAxM4e8IrTECvlszyUe9FnUjE4PbWR99NNDwkOuB85yJ3diyKxiQhHu89Qh9A6qzHTJQLa93iknY2Q40VM/5Q==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/chooser": { @@ -2314,14 +33561,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/chooser/-/chooser-5.33.0.tgz", "integrity": "sha512-hz2OtB8UsJpKdXZByDzGS6+U1FK8toIjKmIVCDQAuOXxjbw9dU2Ef+MSUKXOpK6MYnP56oP80JdSX9LDEFJnRA==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/clipboard": { @@ -2329,14 +33569,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/clipboard/-/clipboard-5.33.0.tgz", "integrity": "sha512-HFZN4tsAjFJ9Se9ik0/IOUvApL4zNPEKQAtUsjqP7vCnTsdrgS+FDMln1UDEKXCQ/dEEwU1N1ndFmPBGxjkGzQ==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/core": { @@ -2344,14 +33577,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.33.0.tgz", "integrity": "sha512-dnZHu7SadvQvliGJPndk2ohdoPvwiyBWJjsJw33BKyhadnmLlmkYKkRgPPI+i22BZofDKq4YiAfIIqhvfHU6gw==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/device": { @@ -2359,14 +33585,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/device/-/device-5.33.0.tgz", "integrity": "sha512-KYQvVsN98bGTEomI193Jf9r1vaXBFJQXuhkhwBI6lajynAlf2SIVJwthNUXnK43kNXy1cOelYxScUuKyPwqudw==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/diagnostic": { @@ -2374,14 +33593,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/diagnostic/-/diagnostic-5.33.0.tgz", "integrity": "sha512-zBDv/yNMvUkXfxy17rgrGVU3+XKREXRI7cqy/DyvpjdomOnmx2pnFvhszgMEgeD03LkXXKiFOR5yUAVNgYirmg==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/file": { @@ -2389,14 +33601,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file/-/file-5.33.0.tgz", "integrity": "sha512-RisSGJl2t8JrBgw30Vn5hJYYKEDTHR9f3KbQDfe1MQg+VrZo7vnbml/vk4l55u65c1TYZDH+F6i7s9nyif1QVQ==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/file-opener": { @@ -2404,14 +33609,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file-opener/-/file-opener-5.33.0.tgz", "integrity": "sha512-v7t1ndalAPYT9gvMAhxAup8tg1NPV415cfG6tzs1foPFP91UZC3MQny0tup8AgFivugT1GRdoSk1NMuK1jy8Cw==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/file-transfer": { @@ -2419,14 +33617,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/file-transfer/-/file-transfer-5.33.0.tgz", "integrity": "sha512-xDUpdJVgTBP6aEiU08iZ/pa9aMoGSMB9391dQKk+VSDs0hdbIwk+Cx4V40GIE4QF3TI06sUMdKXD2sIhVsr2QA==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/geolocation": { @@ -2434,14 +33625,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/geolocation/-/geolocation-5.33.0.tgz", "integrity": "sha512-oE6pi6l8/Wsv94vpJmPlPqE1LheP6cQTJrC78WYQp9WVDOOCGZnFznNoH8BlQfnfjuDx/kUARxzEJBO/gbUg1A==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/http": { @@ -2449,14 +33633,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/http/-/http-5.33.0.tgz", "integrity": "sha512-dqcPu3igSLlfDUK8Mvma/6o6aq7WtKBlcR8xXwE8tVsO/r4fEB6NevLLN4S4zCr381Jy+RxIIjn3CZx5XHF6JQ==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/in-app-browser": { @@ -2464,14 +33641,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/in-app-browser/-/in-app-browser-5.33.0.tgz", "integrity": "sha512-GGIvnYHf8FgaIae9yfRzxqxj0ZAxrYhOJpsHVSq1YKjxnDpRe6ImWWaHHfaeXE5IdUUMUXVuf75VTSBN00VBvA==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/ionic-webview": { @@ -2479,14 +33649,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/ionic-webview/-/ionic-webview-5.33.0.tgz", "integrity": "sha512-Jbr4M6z/Fya51F+QXuPLm/crFlZ9T6YvRM1cygGmFwZ7SgDAimYnjgSO8SEGJmvO2ZekYmFuF56qiVPSvx2wUA==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/keyboard": { @@ -2494,14 +33657,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/keyboard/-/keyboard-5.33.0.tgz", "integrity": "sha512-TIYU3LC+Yz/pcpBuHcxLThMNuN9y1E1wBu4SlmS6VlO3/D3R3At2WOg2UK3iA66G2kTJubed5haqTYZjeoA6Uw==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/local-notifications": { @@ -2509,14 +33665,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/local-notifications/-/local-notifications-5.33.0.tgz", "integrity": "sha512-ljn2uq0rFWpjG1I1qK+mPVX8T3T+09fsF8sZ9nK7uvD9YWShCVz2e2ctf8qPRFq+TWDeDqlnwXz3wCvWmbBUWw==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/media": { @@ -2524,14 +33673,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/media/-/media-5.33.0.tgz", "integrity": "sha512-nUu7/FSH41j9+BqHXYVMBd3EifNsTNOufD3NEiMVpHVDWLWqG7tG5h5cFlsVACxUaP4kNpSEke2mjom6CKyjxQ==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/media-capture": { @@ -2539,14 +33681,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/media-capture/-/media-capture-5.33.0.tgz", "integrity": "sha512-aQTnonVSeijpuZ9B7oYJCjIDqgFVhNdvqkx9vUoaO359BtJGpGS1rNPjEovt4DsqV7oe7TkbmBd8DMEwnB3A2g==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/network": { @@ -2554,14 +33689,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/network/-/network-5.33.0.tgz", "integrity": "sha512-J+3+rbDTMVNUspa/nV+P8a0hFKDicJK1rVIrm5aLBQdmN9n7WaqJmeMYTptyWOnZxQpktJAJDdhJTEvVmKQjjw==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/push": { @@ -2569,14 +33697,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/push/-/push-5.33.0.tgz", "integrity": "sha512-H4gOkMbOaNvi97cKKJDggWvAR1BVCUbtdLyWInA0q3cZBHWSc6KcRJGz+hcdDndCQJUnHofs1Tpw8LN3zhjYyQ==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/qr-scanner": { @@ -2584,14 +33705,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/qr-scanner/-/qr-scanner-5.33.0.tgz", "integrity": "sha512-cyiQv0Rje/fN9/JYoDXP1+ILJkRkjvPtoSx4vd2FsKAuJB60U2DpQfmVEE/KMF4iceTpx4MK/kGzr2WE2AYnIg==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/splash-screen": { @@ -2599,14 +33713,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/splash-screen/-/splash-screen-5.33.0.tgz", "integrity": "sha512-6PHk5WJeUoc3zru6wTvUmd9DCASvRQoQq1dysYI3JCECaAJ6X0x1RbzM8dBFs3JPLfWtDn+P8eTp+KaA0Xf58w==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/sqlite": { @@ -2614,14 +33721,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/sqlite/-/sqlite-5.33.0.tgz", "integrity": "sha512-JIdQJr6bcksotF/3ZMJQZo9lHgaHXvHOOK9R30mM/5Ds5fFu+rUoUf0wvyqaGzEFu94pGw2uPGnfD+WI7x7+1A==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/status-bar": { @@ -2629,14 +33729,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/status-bar/-/status-bar-5.33.0.tgz", "integrity": "sha512-cnyfd42N9gGfhyDtF7wbWoacKg/jfsoJQHOHltfhS4/EjxsVu4bjkwq1YBLMcMY3OIqFDSn2aFcejHn8wVNkDQ==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/web-intent": { @@ -2644,14 +33737,7 @@ "resolved": "https://registry.npmjs.org/@ionic-native/web-intent/-/web-intent-5.33.0.tgz", "integrity": "sha512-3CIAofrg9nkJQbSftFdMKYOduXy9Ra/a1Q0it6ysm9NFeAQn7iZPThSexBeZ9xiKKj/QTPZtnqAJ0MQ+4mkGag==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic-native/zip": { @@ -2659,22 +33745,15 @@ "resolved": "https://registry.npmjs.org/@ionic-native/zip/-/zip-5.33.0.tgz", "integrity": "sha512-hErISQ6/xqVErmVnnha5BR+3GWRNQIVfMTXzprEpNZxQl3iDe1UTIVQdFnMd3Nasz/naY+61Vq/y91PZ1Rrajw==", "requires": { - "@types/cordova": "^0.0.34" - }, - "dependencies": { - "@types/cordova": { - "version": "0.0.34", - "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", - "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" - } + "@types/cordova": "latest" } }, "@ionic/angular": { - "version": "5.6.6", - "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.6.6.tgz", - "integrity": "sha512-0psh2n4Y/3sx0e2Yj4WmNcukz0nrETEiJE6Fl4CldoB8QHZcXGi0hKrPAcbGSAF0+lAJ58+Z5Gp/HQVm/MQOMA==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/@ionic/angular/-/angular-5.9.2.tgz", + "integrity": "sha512-5GzKg+l4au3xFECky2v/USlRsmTAXgvNO5Zalt7NUXc//VJIL2lQvswojE6FBWuM/xR5W0CWbJdFth19TaZWVQ==", "requires": { - "@ionic/core": "5.6.6", + "@ionic/core": "5.9.2", "tslib": "^1.9.3" }, "dependencies": { @@ -2706,28 +33785,29 @@ "dev": true }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "dev": true, + "requires": {} } } }, "@ionic/cli": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.14.1.tgz", - "integrity": "sha512-QGmA5hjW4PvS8o0f+ptJ2bOknu4dPKzlECFApBiR7ayDgGTDMwmbxrtNpRhDnjdsVlMAzWq8eo9l76831+DBjQ==", + "version": "6.19.0", + "resolved": "https://registry.npmjs.org/@ionic/cli/-/cli-6.19.0.tgz", + "integrity": "sha512-JBseXBFRg6voCTg47HDLdrJCQFflqrlbv1f15MMPe1HtrHNY/q8U0QQdYnwWwiAMBUYMo6wrCbyXkoso4UdSKQ==", "dev": true, "requires": { - "@ionic/cli-framework": "5.1.0", - "@ionic/cli-framework-output": "2.2.2", + "@ionic/cli-framework": "5.1.1", + "@ionic/cli-framework-output": "2.2.3", "@ionic/cli-framework-prompts": "2.1.8", "@ionic/utils-array": "2.1.5", "@ionic/utils-fs": "3.1.5", "@ionic/utils-network": "2.1.5", "@ionic/utils-process": "2.1.8", "@ionic/utils-stream": "3.1.5", - "@ionic/utils-subprocess": "2.1.8", + "@ionic/utils-subprocess": "2.1.9", "@ionic/utils-terminal": "2.3.1", "chalk": "^4.0.0", "debug": "^4.0.0", @@ -2742,7 +33822,7 @@ "ssh-config": "^1.1.1", "stream-combiner2": "^1.1.1", "superagent": "^5.2.1", - "superagent-proxy": "^2.0.0", + "superagent-proxy": "^3.0.0", "tar": "^6.0.1", "tslib": "^2.0.1" }, @@ -2771,41 +33851,22 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true - }, - "os-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.0.tgz", - "integrity": "sha512-caABzDdJMbtykt7GmSogEat3faTKQhmZf0BS5l/pZGmP0vPWQjXWqOhbLyK+b6j2/DQPmEvYdzLXJXXLJNVDNg==", - "dev": true, - "requires": { - "macos-release": "^2.2.0", - "windows-release": "^4.0.0" - } - }, - "windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "requires": { - "execa": "^4.0.2" - } } } }, "@ionic/cli-framework": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.0.tgz", - "integrity": "sha512-Hb/P2zuHB3zQZN0qG7Lxda8IlP2mHisfb0KR+wc9cw2BSiH+rtXRd/A4JxndPznjWs00PHbWiEm0Ehas2pA/nw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework/-/cli-framework-5.1.1.tgz", + "integrity": "sha512-cew3/WamnRs7ddv5GShyruaaNH3wHWMPjvGnb0ePa0d9uPR4FM5nuWlQMb8vDz8wuJ2QHj6lAp9Isc7qh1zaPA==", "dev": true, "requires": { - "@ionic/cli-framework-output": "2.2.2", + "@ionic/cli-framework-output": "2.2.3", "@ionic/utils-array": "2.1.5", "@ionic/utils-fs": "3.1.5", "@ionic/utils-object": "2.1.5", "@ionic/utils-process": "2.1.8", "@ionic/utils-stream": "3.1.5", - "@ionic/utils-subprocess": "2.1.8", + "@ionic/utils-subprocess": "2.1.9", "@ionic/utils-terminal": "2.3.1", "chalk": "^4.0.0", "debug": "^4.0.0", @@ -2817,9 +33878,9 @@ }, "dependencies": { "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -2827,9 +33888,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2844,9 +33905,9 @@ } }, "@ionic/cli-framework-output": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.2.tgz", - "integrity": "sha512-eQYkqIW1/tCwSC6Bd0gjse96U11lDX/ikf3jvsjX7a8z/zwSmGzCHRizb7xogV65Ey+1/zyAZR71cpDRQuFLBQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@ionic/cli-framework-output/-/cli-framework-output-2.2.3.tgz", + "integrity": "sha512-Ok0DuQseeyEQnpq1eIE9Wt2oy80qmsprmQYu4bMeiaggbXTmzdf0wa+2CIRrAy1Mzh7Lnz95AI4KyYl3h+97GQ==", "dev": true, "requires": { "@ionic/utils-terminal": "2.3.1", @@ -2855,9 +33916,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -2893,9 +33954,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "chalk": { @@ -3036,20 +34097,13 @@ } }, "@ionic/core": { - "version": "5.6.6", - "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.6.6.tgz", - "integrity": "sha512-EbVIXOTVVPxBo7hsarBpRSFNsQ22wBFtWkKmrmliieknG5LUkf5WZBpj4EENQhzYA6c+//7/nfhcD9pWgtAofA==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/@ionic/core/-/core-5.9.2.tgz", + "integrity": "sha512-1ZqSBS8R6tGQsc+LsLxIRv0q3Ww6jwgJXLvdn6FmVWfpPbBvT+CjCuU9hqJ5qwM+atErblUMYSexvvpws8lGAA==", "requires": { "@stencil/core": "^2.4.0", - "ionicons": "^5.5.1", + "ionicons": "^5.5.3", "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==" - } } }, "@ionic/utils-array": { @@ -3063,9 +34117,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3145,9 +34199,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3176,9 +34230,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3203,9 +34257,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3220,9 +34274,9 @@ } }, "@ionic/utils-subprocess": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.8.tgz", - "integrity": "sha512-pkmtf1LtXcEMPn6/cctREL2aZtZoy0+0Sl+nT0NIkOHIoBUcqrcfMWdctCSM4Mp6+2/hLWtgpHE3TOIibkWfIg==", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@ionic/utils-subprocess/-/utils-subprocess-2.1.9.tgz", + "integrity": "sha512-OZ4QKyFOoC3+NCcBW8tvDUdLzWqOMKZPpzOQR009xVsfGbT3LwV8h60os7VRAbRV2KrA7t6YMMDrMQYV5DS+DQ==", "dev": true, "requires": { "@ionic/utils-array": "2.1.5", @@ -3230,15 +34284,15 @@ "@ionic/utils-process": "2.1.8", "@ionic/utils-stream": "3.1.5", "@ionic/utils-terminal": "2.3.1", - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.3", "debug": "^4.0.0", "tslib": "^2.0.1" }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -3269,9 +34323,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "debug": { @@ -3476,9 +34530,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "chalk": { @@ -3752,6 +34806,45 @@ } } }, + "@moodlehq/cordova-plugin-file-transfer": { + "version": "1.7.1-moodle.5", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-file-transfer/-/cordova-plugin-file-transfer-1.7.1-moodle.5.tgz", + "integrity": "sha512-1JzvVTLw2V7Pjo+uOXXaMneNR1UpEc9CLD/lsZi8njMe393THr/nfmgOkfmrrtMhIdfDCY1i+ygg1N5Z/D//Kg==" + }, + "@moodlehq/cordova-plugin-inappbrowser": { + "version": "5.0.0-moodle.3", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-inappbrowser/-/cordova-plugin-inappbrowser-5.0.0-moodle.3.tgz", + "integrity": "sha512-BDW53W8BzHIJY6lqV3IyYIO9Rh3qi/nA3qkwZjvJiw7iohlQMeR67LV+bXjM4I8N1PTGoBSXiS5BmaS9NFi/1A==" + }, + "@moodlehq/cordova-plugin-ionic-webview": { + "version": "5.0.0-moodle.1", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-5.0.0-moodle.1.tgz", + "integrity": "sha512-+6UrPKsEgXl3pcuTyI1hZIUw9y22Li/nvn7nxiphgZdldlhBvkMK/7nn4IAaXYlnrmIOpCkIrU4BbrAjSJGWSQ==" + }, + "@moodlehq/cordova-plugin-local-notification": { + "version": "0.9.0-moodle.3", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-local-notification/-/cordova-plugin-local-notification-0.9.0-moodle.3.tgz", + "integrity": "sha512-dSEvshH9fE3aUG4bO05gCMqWVCnvZGUeddIfB8OShN60sj0CUWuI1e7Mn5syzTcRRNRi8XQ4MTv85zk4c8mzww==" + }, + "@moodlehq/cordova-plugin-qrscanner": { + "version": "3.0.1-moodle.2", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-qrscanner/-/cordova-plugin-qrscanner-3.0.1-moodle.2.tgz", + "integrity": "sha512-bjMI94QTEaUOl5TbK8K+HZI3gcR8HHfYTocsA1/C1HMKD3nROhGtwvuVDNvb+ogknv9WVQDyGnfMAnNihYH+PQ==", + "requires": { + "qrcode-reader": "^1.0.4", + "webrtc-adapter": "^3.1.4" + } + }, + "@moodlehq/cordova-plugin-zip": { + "version": "3.1.0-moodle.1", + "resolved": "https://registry.npmjs.org/@moodlehq/cordova-plugin-zip/-/cordova-plugin-zip-3.1.0-moodle.1.tgz", + "integrity": "sha512-QD5S6bsm6awJrNMb8YN/vkYghKAMfZMHccdimx6s1i5S9fgZUSf7L477NJqjFu62imVZYJIJuavBbw5fR/562w==" + }, + "@moodlehq/phonegap-plugin-push": { + "version": "2.0.0-moodle.4", + "resolved": "https://registry.npmjs.org/@moodlehq/phonegap-plugin-push/-/phonegap-plugin-push-2.0.0-moodle.4.tgz", + "integrity": "sha512-nNcEn9ZpcGBc4b8/+nwFwRgOH5Cag2wNGRPeJzkNKt3DWRe1/avySudwB/24+ZmTXerisntNwerC5wSCnU29BQ==" + }, "@netflix/nerror": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@netflix/nerror/-/nerror-1.1.3.tgz", @@ -3840,11 +34933,111 @@ "fastq": "^1.6.0" } }, + "@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "@npmcli/move-file": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", - "dev": true, "requires": { "mkdirp": "^1.0.4" }, @@ -3852,11 +35045,34 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" } } }, + "@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==" + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", + "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^7.1.0", + "read-package-json-fast": "^2.0.1" + } + }, "@schematics/angular": { "version": "10.0.8", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-10.0.8.tgz", @@ -3962,9 +35178,9 @@ } }, "@stencil/core": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.5.2.tgz", - "integrity": "sha512-bgjPXkSzzg1WnTgVUm6m5ZzpKt602WmA/QljODAW1xVN40OHJdbGblzF/F6MFzqv2c5Cy30CB41arc8qADIdcQ==" + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.11.0.tgz", + "integrity": "sha512-/IubCWhVXCguyMUp/3zGrg3c882+RJNg/zpiKfyfJL3kRCOwe+/MD8OoAXVGdd+xAohZKIi1Ik+EHFlsptsjLg==" }, "@szmarczak/http-timer": { "version": "1.1.2", @@ -3977,8 +35193,7 @@ "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, "@types/babel__core": { "version": "7.1.10", @@ -4034,14 +35249,6 @@ "resolved": "https://registry.npmjs.org/@types/cordova/-/cordova-0.0.34.tgz", "integrity": "sha1-6nrd907Ow9dimCegw54smt3HPQQ=" }, - "@types/cordova-plugin-file-transfer": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@types/cordova-plugin-file-transfer/-/cordova-plugin-file-transfer-1.6.2.tgz", - "integrity": "sha512-jWZQefyVn/GiQAdummRoY1v5cUY4dT7GNk3Hg40iUtL68y40jKWD3ALAtMM4pnYt9RSMTlsgs1I7/apXexddvw==", - "requires": { - "cordova-plugin-file-transfer": "*" - } - }, "@types/dom-mediacapture-record": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@types/dom-mediacapture-record/-/dom-mediacapture-record-1.0.7.tgz", @@ -4129,9 +35336,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "diff-sequences": { @@ -4288,61 +35495,6 @@ "tsutils": "^3.17.1" }, "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz", - "integrity": "sha512-xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.3", - "@typescript-eslint/scope-manager": "4.22.0", - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/typescript-estree": "4.22.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^2.0.0" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", - "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0" - } - }, - "@typescript-eslint/types": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", - "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", - "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", - "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.22.0", - "eslint-visitor-keys": "^2.0.0" - } - }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -4352,16 +35504,6 @@ "ms": "2.1.2" } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4408,47 +35550,6 @@ "debug": "^4.1.1" }, "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz", - "integrity": "sha512-OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0" - } - }, - "@typescript-eslint/types": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz", - "integrity": "sha512-sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz", - "integrity": "sha512-TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.22.0", - "@typescript-eslint/visitor-keys": "4.22.0", - "debug": "^4.1.1", - "globby": "^11.0.1", - "is-glob": "^4.0.1", - "semver": "^7.3.2", - "tsutils": "^3.17.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz", - "integrity": "sha512-nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.22.0", - "eslint-visitor-keys": "^2.0.0" - } - }, "debug": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", @@ -4717,16 +35818,6 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -4775,7 +35866,8 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true + "dev": true, + "requires": {} }, "acorn-walk": { "version": "7.2.0", @@ -4852,7 +35944,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, "requires": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -4873,13 +35964,44 @@ "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 + "dev": true, + "requires": {} + }, + "ajv-formats": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.0.tgz", + "integrity": "sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } }, "ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "alphanum-sort": { "version": "1.0.2", @@ -4888,9 +36010,9 @@ "dev": true }, "android-versions": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.6.0.tgz", - "integrity": "sha512-ojC2Ig7b/KJ6iNtR8e4bacmOsJyEkoERk3CKMIsnH7kJz5z6551NMbrVaRb7KXYavu1d74Uhml/bfcmqT3nAcg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.7.0.tgz", + "integrity": "sha512-TCy4b8Dk8YS6A23ZPfhSKqK66JHFq0D8avGYiwvYpjno6HrrcI0DRgHx9+jtkvWYmrsE2vQWgbHJhvGGhhOb0g==", "requires": { "semver": "^5.7.1" }, @@ -4908,21 +36030,44 @@ "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { - "string-width": "^3.0.0" + "string-width": "^4.1.0" }, "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==" + }, + "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==" + }, "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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" } } } @@ -4972,9 +36117,9 @@ } }, "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" }, "ansi-styles": { "version": "4.3.0", @@ -5024,7 +36169,6 @@ "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==", - "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -5189,12 +36333,6 @@ "has-symbols": "^1.0.1" } }, - "object-inspect": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.2.tgz", - "integrity": "sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==", - "dev": true - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -5443,6 +36581,11 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "atomically": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", + "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==" + }, "autoprefixer": { "version": "9.8.0", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.0.tgz", @@ -5616,11 +36759,6 @@ } } }, - "babel-plugin-add-header-comment": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/babel-plugin-add-header-comment/-/babel-plugin-add-header-comment-1.0.3.tgz", - "integrity": "sha1-URxJAQYmQNWkgLSsPt1pRBlYUOw=" - }, "babel-plugin-dynamic-import-node": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", @@ -5768,9 +36906,9 @@ } }, "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==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -5912,24 +37050,38 @@ "dev": true }, "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "requires": { "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, "emoji-regex": { "version": "8.0.0", @@ -5942,31 +37094,46 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } }, "bplist-creator": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", - "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", "requires": { - "stream-buffers": "~2.2.0" + "stream-buffers": "2.2.x" } }, "bplist-parser": { @@ -6341,7 +37508,8 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true }, "caniuse-api": { "version": "3.0.0", @@ -6476,9 +37644,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -7101,8 +38269,7 @@ "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "chrome-trace-event": { "version": "1.0.2", @@ -7140,7 +38307,8 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", - "dev": true + "dev": true, + "requires": {} }, "class-utils": { "version": "0.3.6", @@ -7191,8 +38359,7 @@ "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, "cli-boxes": { "version": "2.2.1", @@ -7432,9 +38599,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", - "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -7459,9 +38626,9 @@ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" }, "com-darryncampbell-cordova-plugin-intent": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/com-darryncampbell-cordova-plugin-intent/-/com-darryncampbell-cordova-plugin-intent-1.3.0.tgz", - "integrity": "sha512-JXslndd4UiRHmirGZrwrHZHczoZ5sxM7zAylm4bPX7ZDwD4FdCHhILgDA8AeaG8wc11e0A7OEAFo0Esgc0M4yA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/com-darryncampbell-cordova-plugin-intent/-/com-darryncampbell-cordova-plugin-intent-2.2.0.tgz", + "integrity": "sha512-4ESoeYghE9GGuxKi4pnG+6CUJyYjS2j1tOmvlXXEM/9d5aBU47EpWbKKU1gjcfZFM4KCUbyba1NX6xNcH/L/wA==" }, "combined-stream": { "version": "1.0.8", @@ -7561,51 +38728,60 @@ } }, "conf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-1.4.0.tgz", - "integrity": "sha512-bzlVWS2THbMetHqXKB8ypsXN4DQ/1qopGwNJi1eYbpwesJcd86FBjFciCQX/YwAhp9bM7NVnPFqZ5LpV7gP0Dg==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/conf/-/conf-10.1.1.tgz", + "integrity": "sha512-z2civwq/k8TMYtcn3SVP0Peso4otIWnHtcTuHhQ0zDZDdP4NTxqEc8owfkz4zBsdMYdn/LFcE+ZhbCeqkhtq3Q==", "requires": { - "dot-prop": "^4.1.0", - "env-paths": "^1.0.0", - "make-dir": "^1.0.0", - "pkg-up": "^2.0.0", - "write-file-atomic": "^2.3.0" + "ajv": "^8.6.3", + "ajv-formats": "^2.1.1", + "atomically": "^1.7.0", + "debounce-fn": "^4.0.0", + "dot-prop": "^6.0.1", + "env-paths": "^2.2.1", + "json-schema-typed": "^7.0.3", + "onetime": "^5.1.2", + "pkg-up": "^3.1.0", + "semver": "^7.3.5" }, "dependencies": { + "ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "requires": { + "ajv": "^8.0.0" + } + }, "dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "requires": { - "is-obj": "^1.0.0" + "is-obj": "^2.0.0" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "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==", - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "lru-cache": "^6.0.0" } } } @@ -7638,8 +38814,7 @@ "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=", - "optional": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "constants-browserify": { "version": "1.0.0", @@ -7686,9 +38861,9 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==", "dev": true }, "copy-concurrently": { @@ -7723,13 +38898,21 @@ "dev": true }, "copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", "dev": true, "requires": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } } }, "copy-webpack-plugin": { @@ -7794,42 +38977,61 @@ } }, "cordova": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cordova/-/cordova-10.0.0.tgz", - "integrity": "sha512-00wMcj3X9ILhKtvRG2iEwO2qly4B+vgXFhH4WhVepWg2UVbD1opl1q9jSZ+j2AaI/vsBWW8e6M2M5FAHasnuWw==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/cordova/-/cordova-11.0.0.tgz", + "integrity": "sha512-Hu2YeT0naeP/1sEm/xfJYUsXN48XV6zagxbi1+4q0Ei9c5TKsIq8v4EWukvSHF4UO2pnh+9ViaDlGMcS1Wrnfg==", "requires": { "configstore": "^5.0.1", "cordova-common": "^4.0.2", - "cordova-create": "^3.0.0", - "cordova-lib": "^10.0.0", + "cordova-create": "^4.0.0", + "cordova-lib": "^11.0.0", "editor": "^1.0.0", - "execa": "^4.0.3", - "fs-extra": "^9.0.1", - "insight": "^0.10.3", + "execa": "^5.1.1", + "fs-extra": "^10.0.0", + "insight": "^0.11.1", "loud-rejection": "^2.2.0", - "nopt": "^4.0.3", - "semver": "^7.3.2", - "systeminformation": "^4.26.10", - "update-notifier": "^4.1.0" - } - }, - "cordova-android": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-9.1.0.tgz", - "integrity": "sha512-bzOX9E4eQsOSpa06oZZ7XAGq3DwB73juhhj0oPqHH/khWk0mkCD4aiVYMFoc0fmIaSQvzbY1ww7L6UBW5pyGfg==", - "requires": { - "android-versions": "^1.5.0", - "cordova-common": "^4.0.1", - "execa": "^4.0.2", - "fast-glob": "^3.2.4", - "fs-extra": "^9.0.1", - "is-path-inside": "^3.0.2", - "nopt": "^4.0.3", - "properties-parser": "^0.3.1", - "semver": "^7.3.4", - "which": "^2.0.2" + "nopt": "^5.0.0", + "semver": "^7.3.5", + "systeminformation": "^5.9.17", + "update-notifier": "^5.1.0" }, "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -7840,26 +39042,74 @@ } } }, - "cordova-android-support-gradle-release": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/cordova-android-support-gradle-release/-/cordova-android-support-gradle-release-3.0.1.tgz", - "integrity": "sha512-RSW55DkSckmqhX/kjj+a1YeVdy7s/AtlZn6Qa5XMQmmA4Iogq+IF2jvInZqzCF19DbI5YE95AP7VDbRk+DdDRw==", + "cordova-android": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-10.1.1.tgz", + "integrity": "sha512-eoJp5AcDMHniqmxj0CbUF/rVQfbbp108TWKU6oyJW9rl/ZTJqZxm5ybznl+1/1MBksklxhMeipMn0Iwd0kEzEQ==", "requires": { - "q": "^1.4.1", - "semver": "5.6.0" + "android-versions": "^1.7.0", + "cordova-common": "^4.0.2", + "execa": "^5.1.1", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "is-path-inside": "^3.0.3", + "nopt": "^5.0.0", + "properties-parser": "^0.3.1", + "semver": "^7.3.5", + "untildify": "^4.0.0", + "which": "^2.0.2" }, "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } } } }, "cordova-app-hello-world": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-5.0.0.tgz", - "integrity": "sha512-5My01wsYoeYwS0f/t5Ck52xPm0+2zYJ0SlvxG9vUsndDGtgiP6t/G8upPgWcyDRRz7Rs/50yZuOntmHqmJxccQ==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-6.0.0.tgz", + "integrity": "sha512-wPZsm+fzNUwdiTRODT+fQuPV410RNmd3Buiw63vT8BPxjC+cn6Bu8emrgwrDM4pbmU5sa5Unwu3xPcbQGQ3G3g==" }, "cordova-clipboard": { "version": "1.3.0", @@ -7888,41 +39138,266 @@ } }, "cordova-create": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cordova-create/-/cordova-create-3.0.0.tgz", - "integrity": "sha512-WxZRTnt5RHxSAB9urnHFUtVBcIe1YjR4sfwHLsxakNoKkFhcie3HrV5QmNBgRQ5DkxmanRN3VSx4OrPVsNmAaQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cordova-create/-/cordova-create-4.0.0.tgz", + "integrity": "sha512-t/4zaDZ4ZsFpC7j6x7s9hR9OeEo8nD2m7rSrzV2PUEfA4BPQujkmk0AIC+5iBvjfR7+ReHOHKsY/NfB1LnMQxQ==", "requires": { - "cordova-app-hello-world": "^5.0.0", - "cordova-common": "^4.0.1", - "cordova-fetch": "^3.0.0", - "fs-extra": "^9.0.0", - "globby": "^11.0.0", - "import-fresh": "^3.2.1", + "cordova-app-hello-world": "^6.0.0", + "cordova-common": "^4.0.2", + "cordova-fetch": "^3.0.1", + "fs-extra": "^10.0.0", + "globby": "^11.0.4", + "import-fresh": "^3.3.0", "isobject": "^4.0.0", - "npm-package-arg": "^8.0.1", + "npm-package-arg": "^8.1.5", "path-is-inside": "^1.0.2", "tmp": "^0.2.1", "valid-identifier": "0.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "cordova-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cordova-fetch/-/cordova-fetch-3.0.0.tgz", - "integrity": "sha512-N6mB/1GD8BNclxnfO85E4/s46nEJjIxYeJYHRGi6MjofhigJ3NlGwTCslbTcq8IOYEh0RdoA0mS4W2jA5UcWeQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cordova-fetch/-/cordova-fetch-3.0.1.tgz", + "integrity": "sha512-bxXk6H3FtGXpCtlO+XyXM4pa72azQomdurNeHbZai9eYBzA5vjyPnsgxsYcylLUc1wQFeR+XWQVfgJitx6ghEw==", "requires": { "cordova-common": "^4.0.0", "fs-extra": "^9.0.0", "npm-package-arg": "^8.0.1", + "pacote": "^11.1.11", "pify": "^5.0.0", "resolve": "^1.15.1", "semver": "^7.1.3", "which": "^2.0.2" }, "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", + "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==" + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "npm-packlist": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", + "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "requires": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "pacote": { + "version": "11.3.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", + "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", + "requires": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.8.2", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, "pify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==" + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + } } } }, @@ -7943,14 +39418,6 @@ "xml-escape": "^1.1.0" }, "dependencies": { - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "requires": { - "abbrev": "1" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -7976,32 +39443,76 @@ } }, "cordova-lib": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cordova-lib/-/cordova-lib-10.0.0.tgz", - "integrity": "sha512-azU/WH0x/3fQg33tU5bKCtj+Weh/bHelz9FWCVdXqVOHXmjzbi3p6p61z5Si967Tfh3TkmHRrodNxS0ovZ7iFQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/cordova-lib/-/cordova-lib-11.0.0.tgz", + "integrity": "sha512-3XSCIAlS060/hzxWKDrF+sMfv3PVU8bglCaL31HMCyj3YrZn1CZhqrRRrW5lwRxtz7Sh4XCxv97rNxF38uj9hg==", "requires": { "cordova-common": "^4.0.2", - "cordova-fetch": "^3.0.0", + "cordova-fetch": "^3.0.1", "cordova-serve": "^4.0.0", "dep-graph": "^1.1.0", - "detect-indent": "^6.0.0", + "detect-indent": "^6.1.0", "detect-newline": "^3.1.0", "elementtree": "^0.1.7", - "execa": "^4.0.3", - "fs-extra": "^9.0.1", - "globby": "^11.0.1", - "init-package-json": "^1.10.3", + "execa": "^5.1.1", + "fs-extra": "^10.0.0", + "globby": "^11.0.4", + "init-package-json": "^2.0.5", "md5-file": "^5.0.0", "pify": "^5.0.0", - "semver": "^7.3.2", + "semver": "^7.3.5", "stringify-package": "^1.0.1", "write-file-atomic": "^3.0.3" }, "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, "pify": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -8023,9 +39534,19 @@ } }, "cordova-plugin-advanced-http": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-advanced-http/-/cordova-plugin-advanced-http-3.1.0.tgz", - "integrity": "sha512-zlTlNJyTttE7TV5vW2WGvHqpbKMDVrr1meZU0fy4y3ObrI/hGk2UDcDNwpZdMfaytNZwDKU4sRgsTgQYdFNBew==" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/cordova-plugin-advanced-http/-/cordova-plugin-advanced-http-3.2.2.tgz", + "integrity": "sha512-9djtQuRwWMqCLTNRrtAIlGyRcs2D0AJXOzkedOQ6udlg3IVE58hhxjrFOdKz6WvoJ6w2MNVeRYafYvoWLHFuMA==" + }, + "cordova-plugin-androidx-adapter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/cordova-plugin-androidx-adapter/-/cordova-plugin-androidx-adapter-1.1.3.tgz", + "integrity": "sha512-W1SImn0cCCvOSTSfWWp5TnanIQrSuh2Bch+dcZXIzEn0km3Qb7VryeAqHhgBQYwwzC5Ollk1DtUAk/AJSojuZA==", + "dev": true, + "requires": { + "q": "^1.5.1", + "recursive-readdir": "^2.2.2" + } }, "cordova-plugin-badge": { "version": "0.8.8", @@ -8033,9 +39554,9 @@ "integrity": "sha512-RhIBtd5xhD/iLnxjt35jvOae28oNW/wtMZBOmQR3Rf0y4wirvA1bpAZEhBoFqL+rZGhsd6ddOdQXdex1T0DRyQ==" }, "cordova-plugin-camera": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-5.0.1.tgz", - "integrity": "sha512-9gXyZvI8u9KzsZuqmB8Yw+uheF+7f+usMAwvOMw7L7pqbykg+bm9US5zjhJbwit3A1cSblgZkpBafe5cFiMcTA==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-camera/-/cordova-plugin-camera-6.0.0.tgz", + "integrity": "sha512-FTFKep8HZI/2HkX+Gc/dUACfZGV9+k9waXlgoEOKXOiPPR/1zBw29Mw+adcz4FQUpdWyAgYDxNiaPUnP0P+H2Q==" }, "cordova-plugin-chooser": { "version": "1.3.2", @@ -8062,42 +39583,20 @@ "resolved": "https://registry.npmjs.org/cordova-plugin-file-opener2/-/cordova-plugin-file-opener2-3.0.5.tgz", "integrity": "sha512-tjLHDamH5+y0bJZYVe2967L1S4R8tL4Y0rJUzJGoxsyiw3FUlrJNS199POOpzZZ6Xhlntn9a2o7+84r1dMN21A==" }, - "cordova-plugin-file-transfer": { - "version": "git+https://github.com/moodlemobile/cordova-plugin-file-transfer.git#648b57792f2f33ffc9da6d2fa020d26a48799048", - "from": "git+https://github.com/moodlemobile/cordova-plugin-file-transfer.git" - }, "cordova-plugin-geolocation": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cordova-plugin-geolocation/-/cordova-plugin-geolocation-4.1.0.tgz", "integrity": "sha512-y5io/P10xGMxSn2KEqfv/fExK47eA1pmSonJdmDqDsaSADV9JpgdPx0mUSA08+5pzma/OS9R0LoODeDPx7Jvjg==" }, - "cordova-plugin-globalization": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-globalization/-/cordova-plugin-globalization-1.11.0.tgz", - "integrity": "sha1-6sMVgQAphJOvowvolA5pj2HvvP4=" - }, - "cordova-plugin-inappbrowser": { - "version": "git+https://github.com/moodlemobile/cordova-plugin-inappbrowser.git#a1ac936fd79596fd5841bd424cc782ee84e4a290", - "from": "git+https://github.com/moodlemobile/cordova-plugin-inappbrowser.git#moodle-ionic5" - }, "cordova-plugin-ionic-keyboard": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-keyboard/-/cordova-plugin-ionic-keyboard-2.2.0.tgz", "integrity": "sha512-yDUG+9ieKVRitq5mGlNxjaZh/MgEhFFIgTIPhqSbUaQ8UuZbawy5mhJAVClqY97q8/rcQtL6dCDa7x2sEtCLcA==" }, - "cordova-plugin-ionic-webview": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-ionic-webview/-/cordova-plugin-ionic-webview-5.0.0.tgz", - "integrity": "sha512-Wq0kCanxubK/JroTW4Mp5soayScnRyiY1eCkbwiz1Dyt1xHOiOW/v+1miqtBHtnZhcXw25TulCKAVJzkNBdmyg==" - }, - "cordova-plugin-local-notification": { - "version": "git+https://github.com/moodlemobile/cordova-plugin-local-notification.git#0bb96b757fb484553ceabf35a59802f7983a2836", - "from": "git+https://github.com/moodlemobile/cordova-plugin-local-notification.git#moodle" - }, "cordova-plugin-media": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/cordova-plugin-media/-/cordova-plugin-media-5.0.3.tgz", - "integrity": "sha512-UQPFlpk1zL4BY44zGi8RVmYCvcKBCN4Dyf8ovxqGYCC8zR1yhbTRWYDdO9vJdERwbfgWV7+z7FMWiSUfqWm9bQ==" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cordova-plugin-media/-/cordova-plugin-media-5.0.4.tgz", + "integrity": "sha512-mAqincYqOT5gu5LWyfgJu3qmOq+lhLAKhnOZULpG622FvYiHjjfsoJ/fkI55WwI3FIcHeeyhToGvHXBCNJePZg==" }, "cordova-plugin-media-capture": { "version": "3.0.3", @@ -8105,27 +39604,20 @@ "integrity": "sha512-pVQOrNM7VAuVUMXibAlMGIArrftHPrRs4dUCoE+e2HEFUp3LmN3Yj539LjdUxcWmz/A/cHC65m9E3DS56YJhcg==" }, "cordova-plugin-network-information": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cordova-plugin-network-information/-/cordova-plugin-network-information-2.0.2.tgz", - "integrity": "sha512-NwO3qDBNL/vJxUxBTPNOA1HvkDf9eTeGH8JSZiwy1jq2W2mJKQEDBwqWkaEQS19Yd/MQTiw0cykxg5D7u4J6cQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-network-information/-/cordova-plugin-network-information-3.0.0.tgz", + "integrity": "sha512-bBtP3PxIX8vshsfR0+F6co2e2cFLgjt18yKIdigzMwk6ANudWQ72RB3g2qMPyT6fBDWmUyE1Qd+bKQB/fZtQwQ==" }, "cordova-plugin-prevent-override": { - "version": "git+https://github.com/moodlemobile/cordova-plugin-prevent-override.git#49507eda3c929e488e58b8402cfc7e1521ebc400", - "from": "git+https://github.com/moodlemobile/cordova-plugin-prevent-override.git", - "dev": true - }, - "cordova-plugin-qrscanner": { - "version": "git+https://github.com/moodlemobile/cordova-plugin-qrscanner.git#857efee3a7a49104faabd108ff1f00a57d3aca94", - "from": "git+https://github.com/moodlemobile/cordova-plugin-qrscanner.git#dist", - "requires": { - "qrcode-reader": "^1.0.4", - "webrtc-adapter": "^3.1.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-prevent-override/-/cordova-plugin-prevent-override-1.0.1.tgz", + "integrity": "sha512-yy1JZ+lXTR33Ai1yloT6wdXJXe0a3LrfgnKORuPZv/QkbiqfIQKjy0R4zRP8qljaJSelF/xv5CgrVt8iS0SkBg==" }, "cordova-plugin-screen-orientation": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/cordova-plugin-screen-orientation/-/cordova-plugin-screen-orientation-3.0.2.tgz", - "integrity": "sha512-2w6CMC+HGvbhogJetalwGurL2Fx8DQCCPy3wlSZHN1/W7WoQ5n9ujVozcoKrY4VaagK6bxrPFih+ElkO8Uqfzg==" + "integrity": "sha512-2w6CMC+HGvbhogJetalwGurL2Fx8DQCCPy3wlSZHN1/W7WoQ5n9ujVozcoKrY4VaagK6bxrPFih+ElkO8Uqfzg==", + "dev": true }, "cordova-plugin-splashscreen": { "version": "6.0.0", @@ -8133,27 +39625,19 @@ "integrity": "sha512-pm4ZtJKQY4bCGXVeIInbGrXilryTevYSKgfvoQJpW9UClOWKAxSsYf2/4G2u1vcn492svOSL42OSa2MhujBWEQ==" }, "cordova-plugin-statusbar": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-2.4.3.tgz", - "integrity": "sha512-ThmXzl6QIKWFXf4wWw7Q/zpB+VKkz3VM958+5A0sXD4jmR++u7KnGttLksXshVwWr6lvGwUebLYtIyXwS4Ovcg==" - }, - "cordova-plugin-whitelist": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/cordova-plugin-whitelist/-/cordova-plugin-whitelist-1.3.4.tgz", - "integrity": "sha512-EYC5eQFVkoYXq39l7tYKE6lEjHJ04mvTmKXxGL7quHLdFPfJMNzru/UYpn92AOfpl3PQaZmou78C7EgmFOwFQQ==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-statusbar/-/cordova-plugin-statusbar-3.0.0.tgz", + "integrity": "sha512-nzkeWeyLA6+1FryzO0aeB6NS8MZ45gnBYeq2VZqfdNbddZEgtpI4XPYdBVxvm9NhcVoJ3tdA1OBnQD9JryoV0Q==" }, "cordova-plugin-wkuserscript": { - "version": "git+https://github.com/moodlemobile/cordova-plugin-wkuserscript.git#aa77d0f98a3fb106f2e798e5adf5882f01a2c947", - "from": "git+https://github.com/moodlemobile/cordova-plugin-wkuserscript.git" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-wkuserscript/-/cordova-plugin-wkuserscript-1.0.1.tgz", + "integrity": "sha512-qhb2JOFy+XnLIbPubDuAcZyf6fSsrQ2syM8PqAVvW7JJQVR7i64pZDLHmgYQrGN+2pO1fG8EdR2aUp5O0Kx/HA==" }, "cordova-plugin-wkwebview-cookies": { - "version": "git+https://github.com/moodlemobile/cordova-plugin-wkwebview-cookies.git#8c3a289e29b33edecff15f470c1630baf4ec3e88", - "from": "git+https://github.com/moodlemobile/cordova-plugin-wkwebview-cookies.git" - }, - "cordova-plugin-zip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cordova-plugin-zip/-/cordova-plugin-zip-3.1.0.tgz", - "integrity": "sha1-F2yCSOog058c+VnvXmFWrMqWshc=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cordova-plugin-wkwebview-cookies/-/cordova-plugin-wkwebview-cookies-1.0.1.tgz", + "integrity": "sha512-x984mlj21Newei7UFPTu4N3NJSTBZuuQXkDNJxq8FTGM1RH/YECqYAzk6ekk/regFamj1bCQ3IB8XJeCm5/dhA==" }, "cordova-serve": { "version": "4.0.0", @@ -8180,17 +39664,12 @@ "resolved": "https://registry.npmjs.org/cordova-sqlite-storage-dependencies/-/cordova-sqlite-storage-dependencies-4.0.0.tgz", "integrity": "sha512-dTBxYaX/RGzH6+pp49o4sb3FuHCvhrssaKn1XMJ4LL3f9dnvz3rhFK2LdcWrdFkhOLOndnW/azUkbzZd+WWhRA==" }, - "cordova-support-google-services": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/cordova-support-google-services/-/cordova-support-google-services-1.3.2.tgz", - "integrity": "sha512-RtEWzULreUX662MFWopGhFispLiHX7gUf2GijPOC2mY2oCNuUobj2mO4tl5q7PYbOreSxq+PrSekhmS6TAAWdw==" - }, "cordova.plugins.diagnostic": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/cordova.plugins.diagnostic/-/cordova.plugins.diagnostic-5.0.2.tgz", - "integrity": "sha512-H59o7YxJ2/COzvg+jyTpUqX8QoDcvti9dluJ9a+pHumE8lf3meWemwCl0QFa9GH+xgVd6X1Ikj/6P3+DKWd9eg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/cordova.plugins.diagnostic/-/cordova.plugins.diagnostic-6.1.1.tgz", + "integrity": "sha512-JEc7MEPNDDrLb4RGmIwxoKIQ1AVRbh7OuDI8MTsdRqKFA/fQgdF3tK54uWbICUYBx9bQ0YY4FqNmkO0zkDyx5g==", "requires": { - "colors": "^1.1.2", + "colors": "1.4.0", "elementtree": "^0.1.6", "minimist": "1.2.0" }, @@ -8311,6 +39790,21 @@ "sha.js": "^2.4.8" } }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -8669,6 +40163,21 @@ "whatwg-url": "^8.0.0" } }, + "debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "requires": { + "mimic-fn": "^3.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" + } + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -8947,14 +40456,15 @@ } }, "degenerator": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz", + "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==", "dev": true, "requires": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", - "esprima": "^4.0.0" + "esprima": "^4.0.0", + "vm2": "^3.9.8" } }, "del": { @@ -9027,8 +40537,7 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "optional": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "dep-graph": { "version": "1.1.0", @@ -9078,9 +40587,9 @@ "dev": true }, "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" }, "detect-libc": { "version": "1.0.3", @@ -9155,9 +40664,9 @@ "dev": true }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dev": true, "requires": { "ip": "^1.1.0", @@ -9326,18 +40835,18 @@ } }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "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" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" }, "dependencies": { "bn.js": { @@ -9357,7 +40866,8 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true }, "emojis-list": { "version": "3.0.0", @@ -9374,7 +40884,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, + "devOptional": true, "requires": { "iconv-lite": "^0.6.2" }, @@ -9383,7 +40893,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "dev": true, + "devOptional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -9443,9 +40953,9 @@ "dev": true }, "env-paths": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" }, "err-code": { "version": "1.1.2", @@ -9703,9 +41213,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "chalk": { @@ -9752,12 +41262,6 @@ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9791,7 +41295,8 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.4", @@ -9867,7 +41372,8 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-import": { "version": "2.22.1", @@ -9935,12 +41441,6 @@ "ms": "2.1.2" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9962,13 +41462,15 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-promise": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "4.0.3", @@ -10402,16 +41904,15 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", + "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-parse": { @@ -10431,9 +41932,9 @@ "dev": true }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, "fastq": { @@ -10602,6 +42103,7 @@ "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" } @@ -10775,9 +42277,9 @@ } }, "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true }, "for-in": { @@ -10811,9 +42313,9 @@ } }, "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", "dev": true }, "forwarded": { @@ -10866,7 +42368,6 @@ "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" } @@ -10944,8 +42445,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -10957,7 +42457,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -10972,14 +42471,12 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "optional": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "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=", - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -10988,7 +42485,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -10999,7 +42495,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -11064,9 +42559,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -11146,9 +42641,9 @@ } }, "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==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } @@ -11418,11 +42913,18 @@ } }, "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "requires": { - "ini": "^1.3.5" + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } } }, "global-modules": { @@ -11467,16 +42969,23 @@ "dev": true }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + } } }, "glogg": { @@ -11750,9 +43259,9 @@ } }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", "dev": true }, "yargs": { @@ -11925,6 +43434,11 @@ "glogg": "^1.0.0" } }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -11949,7 +43463,6 @@ "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" } @@ -11974,8 +43487,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "optional": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", @@ -12115,9 +43627,9 @@ } }, "hosted-git-info": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", - "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "requires": { "lru-cache": "^6.0.0" } @@ -12146,12 +43658,6 @@ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", "dev": true }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", - "dev": true - }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -12466,7 +43972,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "dev": true, "requires": { "ms": "^2.0.0" } @@ -12491,7 +43996,8 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "devOptional": true }, "iferr": { "version": "0.1.5", @@ -12502,13 +44008,13 @@ "ignore": { "version": "5.1.8", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true }, "ignore-walk": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "dev": true, "requires": { "minimatch": "^3.0.4" } @@ -12535,9 +44041,9 @@ } }, "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==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -12583,8 +44089,7 @@ "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 + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "indexes-of": { "version": "1.0.1", @@ -12595,8 +44100,7 @@ "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 + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", @@ -12618,40 +44122,66 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "init-package-json": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", - "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-2.0.5.tgz", + "integrity": "sha512-u1uGAtEFu3VA6HNl/yUWw57jmKEMx8SKOxHhxjGnOFUiIlFnohKDFg4ZrPpv9wWqk44nDxGJAtqjdQFm+9XXQA==", "requires": { - "glob": "^7.1.1", - "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "npm-package-arg": "^8.1.5", "promzard": "^0.3.0", "read": "~1.0.1", - "read-package-json": "1 || 2", - "semver": "2.x || 3.x || 4 || 5", - "validate-npm-package-license": "^3.0.1", + "read-package-json": "^4.1.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", "validate-npm-package-name": "^3.0.0" }, "dependencies": { "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==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } }, "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", "validate-npm-package-name": "^3.0.0" } }, + "read-package-json": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-4.1.1.tgz", + "integrity": "sha512-P82sbZJ3ldDrWCOSKxJT0r/CXMWR0OR3KRh55SgKo3p91GSIEEC32v3lSHAvO/UcH3/IoL7uqhOFBduAnwdldw==", + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^3.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -12727,72 +44257,52 @@ } }, "insight": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/insight/-/insight-0.10.3.tgz", - "integrity": "sha512-YOncxSN6Omh+1Oqxt+OJAvJVMDKw7l6IEG0wT2cTMGxjsTcroOGW4IR926QDzxg/uZHcFZ2cZbckDWdZhc2pZw==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.11.1.tgz", + "integrity": "sha512-TBcZ0qC9dgdmcxL93OoqkY/RZXJtIi0i07phX/QyYk2ysmJtZex59dgTj4Doq50N9CG9dLRe/RIudc/5CCoFNw==", "requires": { "async": "^2.6.2", - "chalk": "^2.4.2", - "conf": "^1.4.0", + "chalk": "^4.1.1", + "conf": "^10.0.1", "inquirer": "^6.3.1", "lodash.debounce": "^4.0.8", - "os-name": "^3.1.0", + "os-name": "^4.0.1", "request": "^2.88.0", - "tough-cookie": "^3.0.1", - "uuid": "^3.3.2" + "tough-cookie": "^4.0.0", + "uuid": "^8.3.2" }, "dependencies": { - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "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==", + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "requires": { - "color-name": "1.1.3" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" } } }, - "install": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/install/-/install-0.8.9.tgz", - "integrity": "sha1-n0tcDRhR74cunfheT3Fi1OXc2+0=" - }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", @@ -12806,8 +44316,7 @@ "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" }, "invariant": { "version": "2.2.4", @@ -12825,11 +44334,18 @@ "dev": true }, "ionicons": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.5.1.tgz", - "integrity": "sha512-1auVisfaXmkmxINer8Q3kJGHP1vSxk86hf7By95eJ+Av9+oBcNuAEBfSe3jaMaGRVxVw8U/2j23MFq7R3c0HPg==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/ionicons/-/ionicons-5.5.4.tgz", + "integrity": "sha512-3ph8X9my3inhabWEZ7N0XRA0MnnNQ1v9a602mLNgWsIXnxE9G5BybIZ/pws/OZZ/hoNlvSjk801N03yL9/FNgQ==", "requires": { - "@stencil/core": "^2.5.0" + "@stencil/core": "~2.10.0" + }, + "dependencies": { + "@stencil/core": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@stencil/core/-/core-2.10.0.tgz", + "integrity": "sha512-15rWMTPQ/sp0lSV82HVCXkIya3QLN+uBl7pqK4JnTrp4HiLrzLmNbWjbvgCs55gw0lULbCIGbRIEsFz+Pe/Q+A==" + } } }, "ios-sim": { @@ -12861,13 +44377,13 @@ "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", - "dev": true + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true }, "ipaddr.js": { "version": "1.9.1", @@ -12980,6 +44496,14 @@ "rgba-regex": "^1.0.0" } }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "requires": { + "has": "^1.0.3" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", @@ -13067,12 +44591,12 @@ } }, "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, "is-interactive": { @@ -13081,6 +44605,11 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" + }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -13094,9 +44623,9 @@ "dev": true }, "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" }, "is-number": { "version": "7.0.0", @@ -13141,9 +44670,9 @@ } }, "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" }, "is-plain-obj": { "version": "1.1.0", @@ -13209,15 +44738,6 @@ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", "dev": true }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dev": true, - "requires": { - "html-comment-regex": "^1.1.0" - } - }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -13385,9 +44905,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "chalk": { @@ -13874,7 +45394,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true + "dev": true, + "requires": {} }, "jest-preset-angular": { "version": "8.3.1", @@ -14103,9 +45624,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "chalk": { @@ -14476,10 +45997,11 @@ "dev": true }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", - "dev": true + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "dev": true, + "requires": {} } } }, @@ -14506,15 +46028,20 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "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==" }, + "json-schema-typed": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", + "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" + }, "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", @@ -14559,17 +46086,26 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" }, "dependencies": { @@ -14581,9 +46117,9 @@ } }, "jszip": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", - "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz", + "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==", "requires": { "lie": "~3.3.0", "pako": "~1.0.2", @@ -14888,15 +46424,16 @@ "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" } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash._baseassign": { "version": "3.2.0", @@ -15129,9 +46666,9 @@ } }, "macos-release": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", - "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==" }, "magic-string": { "version": "0.25.7", @@ -15236,9 +46773,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -15518,12 +47055,12 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "requires": { "braces": "^3.0.1", - "picomatch": "^2.0.5" + "picomatch": "^2.2.3" } }, "miller-rabin": { @@ -15664,7 +47201,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -15673,25 +47209,50 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, "requires": { "minipass": "^3.0.0" } }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, "requires": { "minipass": "^3.0.0" } }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, "minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "requires": { "minipass": "^3.0.0" } @@ -15700,7 +47261,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -15761,9 +47321,9 @@ "optional": true }, "moment": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.0.tgz", - "integrity": "sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA==" + "version": "2.29.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz", + "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==" }, "move-concurrently": { "version": "1.0.1", @@ -15966,7 +47526,8 @@ "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true }, "nl.kingsquare.cordova.background-audio": { "version": "1.0.1", @@ -16022,6 +47583,23 @@ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16089,9 +47667,9 @@ "dev": true }, "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, "optional": true, "requires": { @@ -16125,18 +47703,18 @@ "optional": true }, "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1" } }, "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", @@ -16145,14 +47723,16 @@ }, "dependencies": { "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==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -16169,9 +47749,9 @@ "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==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, "now-and-later": { "version": "2.0.1", @@ -16186,7 +47766,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } @@ -16195,7 +47774,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, "requires": { "semver": "^7.1.1" } @@ -16230,7 +47808,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", - "dev": true, "requires": { "npm-install-checks": "^4.0.0", "npm-package-arg": "^8.0.0", @@ -16243,9 +47820,9 @@ "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", "dev": true, "requires": { - "JSONStream": "^1.3.4", "bluebird": "^3.5.1", "figgy-pudding": "^3.4.1", + "JSONStream": "^1.3.4", "lru-cache": "^5.1.1", "make-fetch-happen": "^5.0.0", "npm-package-arg": "^6.1.0", @@ -16253,9 +47830,9 @@ }, "dependencies": { "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==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "lru-cache": { @@ -16311,7 +47888,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -16387,9 +47963,9 @@ } }, "object-inspect": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", - "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", "dev": true }, "object-is": { @@ -16661,9 +48237,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "cli-cursor": { @@ -16723,7 +48299,8 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true }, "os-locale": { "version": "1.4.0", @@ -16735,12 +48312,12 @@ } }, "os-name": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", - "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "requires": { - "macos-release": "^2.2.0", - "windows-release": "^3.1.0" + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" } }, "os-tmpdir": { @@ -16752,6 +48329,7 @@ "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" @@ -16777,6 +48355,7 @@ "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" }, @@ -16784,7 +48363,8 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true } } }, @@ -16792,6 +48372,7 @@ "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" } @@ -16800,7 +48381,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, "requires": { "aggregate-error": "^3.0.0" } @@ -16820,9 +48400,9 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "dev": true, "requires": { "@tootallnate/once": "1", @@ -16831,7 +48411,7 @@ "get-uri": "3", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", + "pac-resolver": "^5.0.0", "raw-body": "^2.2.0", "socks-proxy-agent": "5" }, @@ -16846,9 +48426,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -16882,12 +48462,12 @@ "dev": true }, "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^6.0.2", "debug": "4", "socks": "^2.3.3" } @@ -16895,12 +48475,12 @@ } }, "pac-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz", - "integrity": "sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", + "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", "dev": true, "requires": { - "degenerator": "^2.2.0", + "degenerator": "^3.0.1", "ip": "^1.1.5", "netmask": "^2.0.1" } @@ -17009,9 +48589,9 @@ } }, "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==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "lru-cache": { @@ -17074,6 +48654,12 @@ "glob": "^7.1.3" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -17081,27 +48667,27 @@ "dev": true }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" } }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "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" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" } }, "which": { @@ -17250,9 +48836,9 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "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==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-root": { "version": "0.1.1", @@ -17303,23 +48889,10 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "phonegap-plugin-multidex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/phonegap-plugin-multidex/-/phonegap-plugin-multidex-1.0.0.tgz", - "integrity": "sha512-1wvc3iQOQpEBaQbXgLxA2JUiLSQ2azdF/bF29ghXDiQJWSpQ1BF8gSuqttM8WZoj081Ps8OKL0gYxdDBkFNPqA==" - }, - "phonegap-plugin-push": { - "version": "git+https://github.com/moodlemobile/phonegap-plugin-push.git#cb332d5ec8a1a0d43916fc6d35455fe6bea7a7f9", - "from": "git+https://github.com/moodlemobile/phonegap-plugin-push.git#moodle-v3", - "requires": { - "babel-plugin-add-header-comment": "^1.0.3", - "install": "^0.8.2" - } - }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "4.0.1", @@ -17399,21 +48972,55 @@ } }, "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", "requires": { - "find-up": "^2.1.0" + "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==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "requires": { + "p-limit": "^2.0.0" + } + } } }, "plist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", - "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.5.tgz", + "integrity": "sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA==", "requires": { - "base64-js": "^1.2.3", - "xmlbuilder": "^9.0.7", - "xmldom": "0.1.x" + "base64-js": "^1.5.1", + "xmlbuilder": "^9.0.7" } }, "plugin-error": { @@ -18238,12 +49845,11 @@ } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "dev": true, "requires": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" @@ -18321,9 +49927,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true } } @@ -18354,8 +49960,7 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "promise-retry": { "version": "1.1.1", @@ -18420,9 +50025,9 @@ } }, "proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", - "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dev": true, "requires": { "agent-base": "^6.0.0", @@ -18430,7 +50035,7 @@ "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", + "pac-proxy-agent": "^5.0.0", "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^5.0.0" }, @@ -18445,9 +50050,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -18490,12 +50095,12 @@ "dev": true }, "socks-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", - "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz", + "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==", "dev": true, "requires": { - "agent-base": "6", + "agent-base": "^6.0.2", "debug": "4", "socks": "^2.3.3" } @@ -18585,9 +50190,9 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "pupa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", - "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", "requires": { "escape-goat": "^2.0.0" } @@ -18742,6 +50347,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, "requires": { "glob": "^7.1.1", "json-parse-even-better-errors": "^2.3.0", @@ -18749,6 +50355,15 @@ "npm-normalize-package-bin": "^1.0.0" } }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, "read-package-tree": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", @@ -18837,11 +50452,19 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, "requires": { "resolve": "^1.1.6" } }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -18952,9 +50575,9 @@ "dev": true }, "registry-auth-token": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", - "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "requires": { "rc": "^1.2.8" } @@ -19136,8 +50759,7 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -19371,8 +50993,7 @@ "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", - "dev": true + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" }, "reusify": { "version": "1.0.4", @@ -20041,6 +51662,16 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "shellwords": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", @@ -20057,14 +51688,6 @@ "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" - }, - "dependencies": { - "object-inspect": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", - "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", - "dev": true - } } }, "signal-exit": { @@ -20073,19 +51696,12 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "simctl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simctl/-/simctl-2.0.0.tgz", - "integrity": "sha512-5rB7rN4N3b0z0nFdy9eczVssXqrv2aAgdVRksPVqVoiDtvXmfzNvebp3EMdId2sAUzXIflarQlx4P0hjVQEzKQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/simctl/-/simctl-2.0.3.tgz", + "integrity": "sha512-kKCak0yszxHae5eVWcmrjV3ouUGac3sjlhjdLWpyPu4eiQcWoHsCrqS34kkgzHN8Ystqkh/LFjzrldk/g3BYJg==", "requires": { - "shelljs": "^0.2.6", + "shelljs": "^0.8.5", "tail": "^0.4.0" - }, - "dependencies": { - "shelljs": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.2.6.tgz", - "integrity": "sha1-kEktcv/MgVmXa6umL7D2iE8MM3g=" - } } }, "simple-concat": { @@ -20095,9 +51711,9 @@ "optional": 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==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", "optional": true, "requires": { "decompress-response": "^4.2.0", @@ -20123,13 +51739,23 @@ } }, "simple-plist": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.1.tgz", - "integrity": "sha512-pKMCVKvZbZTsqYR6RKgLfBHkh2cV89GXcA/0CVPje3sOiNOnXA8+rp/ciAMZ7JRaUdLzlEM6JFfUn+fS6Nt3hg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", "requires": { - "bplist-creator": "0.0.8", - "bplist-parser": "0.2.0", - "plist": "^3.0.1" + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + }, + "dependencies": { + "bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "requires": { + "big-integer": "1.6.x" + } + } } }, "simple-swizzle": { @@ -20180,10 +51806,9 @@ } }, "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, "snapdragon": { "version": "0.8.2", @@ -20707,10 +52332,9 @@ } }, "ssri": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", - "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", - "dev": true, + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", "requires": { "minipass": "^3.1.1" } @@ -20842,6 +52466,14 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "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" + } + }, "string-length": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz", @@ -20853,9 +52485,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { @@ -20955,14 +52587,6 @@ } } }, - "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" - } - }, "stringify-package": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", @@ -20977,9 +52601,9 @@ }, "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==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" } } }, @@ -20991,7 +52615,8 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true }, "strip-final-newline": { "version": "2.0.0", @@ -21129,9 +52754,9 @@ }, "dependencies": { "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -21149,9 +52774,9 @@ } }, "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "ms": { @@ -21161,9 +52786,9 @@ "dev": true }, "qs": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", - "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, "requires": { "side-channel": "^1.0.4" @@ -21183,28 +52808,28 @@ } }, "superagent-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-2.1.0.tgz", - "integrity": "sha512-DnarpKN6Xn8e3pYlFV4Yvsj9yxLY4q5FIsUe5JvN7vjzP+YCfzXv03dTkZSD2yzrSadsNYHf0IgOUJwKjX457A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/superagent-proxy/-/superagent-proxy-3.0.0.tgz", + "integrity": "sha512-wAlRInOeDFyd9pyonrkJspdRAxdLrcsZ6aSnS+8+nu4x1aXbz6FWSTT9M6Ibze+eG60szlL7JA8wEIV7bPWuyQ==", "dev": true, "requires": { - "debug": "^3.1.0", - "proxy-agent": "^4.0.0" + "debug": "^4.3.2", + "proxy-agent": "^5.0.0" }, "dependencies": { "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } @@ -21329,9 +52954,9 @@ "dev": true }, "systeminformation": { - "version": "4.27.7", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-4.27.7.tgz", - "integrity": "sha512-3ozUwGSf5jmrhGgOXlX/O6hk1KQ28XPb7d3NiPZX267QmimuDq3TuIgnkw+vICUrGJGKWPLKmXVASnuJ3w07nw==" + "version": "5.11.3", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.11.3.tgz", + "integrity": "sha512-sjvlk4SUefhwrONUeLijXt+NQyptAiqShd5v6bFJFNr9EVJUr3YSnNxDqCz0gp5EJBUj88pL1ssc8ZHPtngBOw==" }, "table": { "version": "6.6.0", @@ -21361,9 +52986,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "emoji-regex": { @@ -21418,10 +53043,9 @@ "dev": true }, "tar": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", - "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", - "dev": true, + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -21434,8 +53058,7 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" } } }, @@ -21485,11 +53108,6 @@ } } }, - "term-size": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", - "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" - }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -21537,35 +53155,95 @@ } }, "terser-webpack-plugin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz", - "integrity": "sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", "dev": true, "requires": { - "cacache": "^15.0.3", + "cacache": "^15.0.5", "find-cache-dir": "^3.3.1", - "jest-worker": "^26.0.0", - "p-limit": "^2.3.0", - "schema-utils": "^2.6.6", - "serialize-javascript": "^3.0.0", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", "source-map": "^0.6.1", - "terser": "^4.6.13", + "terser": "^5.3.4", "webpack-sources": "^1.4.3" }, "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, "serialize-javascript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", - "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -21576,6 +53254,35 @@ "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.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } } } }, @@ -21663,9 +53370,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-absolute-glob": { @@ -21753,6 +53460,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, "requires": { "ip-regex": "^2.1.0", "psl": "^1.1.28", @@ -21861,9 +53569,9 @@ } }, "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "tsutils": { "version": "3.17.1", @@ -21925,7 +53633,8 @@ "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true }, "type-is": { "version": "1.6.18", @@ -22007,9 +53716,9 @@ "dev": true }, "underscore": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.11.0.tgz", - "integrity": "sha512-xY96SsN3NA461qIRKZ/+qox37YXPtSBswMGfiNptr+wrt6ds4HaMw23TP612fEyGekRE6LNRiLYr/aqbHXNedw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.2.tgz", + "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==" }, "undertaker": { "version": "1.3.0", @@ -22099,7 +53808,6 @@ "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" } @@ -22108,7 +53816,6 @@ "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" } @@ -22229,8 +53936,7 @@ "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==" }, "upath": { "version": "1.2.0", @@ -22239,23 +53945,43 @@ "dev": true }, "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", + "boxen": "^5.0.0", + "chalk": "^4.1.0", "configstore": "^5.0.1", "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "upper-case": { @@ -22297,9 +54023,9 @@ } }, "url-parse": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", - "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", @@ -22540,6 +54266,30 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "vm2": { + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.9.tgz", + "integrity": "sha512-xwTm7NLh/uOjARRBs8/95H0e8fT3Ukw5D/JJWhxMbhKzNh1Nu981jQKvkep9iKYNxzlVrdzD0mlBGkDKZWprlw==", + "dev": true, + "requires": { + "acorn": "^8.7.0", + "acorn-walk": "^8.2.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + } + } + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -22579,243 +54329,6 @@ "watchpack-chokidar2": "^2.0.0" } }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": 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" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "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, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": 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, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": 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" - } - }, - "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, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "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, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "wbuf": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", @@ -23098,9 +54611,9 @@ "dev": true }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -23629,7 +55142,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "optional": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -23643,9 +55155,9 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "emoji-regex": { "version": "8.0.0", @@ -23658,111 +55170,31 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "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==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } }, "windows-release": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz", - "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "requires": { - "execa": "^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==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "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" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "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=", - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "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=" - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } + "execa": "^4.0.2" } }, "with-open-file": { @@ -23895,9 +55327,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -23939,11 +55371,6 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, - "xmldom": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", - "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" - }, "xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", @@ -23957,9 +55384,9 @@ "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==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yallist": { @@ -24061,6 +55488,12 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, "zone.js": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", diff --git a/package.json b/package.json index 01beb7354..3c3909d5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moodlemobile", - "version": "3.9.5", + "version": "4.0.0", "description": "The official app for Moodle.", "author": { "name": "Moodle Pty Ltd.", @@ -8,7 +8,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/moodlehq/moodlemobile2.git" + "url": "https://github.com/moodlehq/moodleapp.git" }, "license": "Apache-2.0", "licenses": [ @@ -19,21 +19,22 @@ ], "scripts": { "ng": "ng", - "start": "ionic serve", + "start": "ionic serve --browser=$MOODLE_APP_BROWSER", + "serve:test": "NODE_ENV=testing ionic serve --no-open", "build": "ionic build", "build:prod": "NODE_ENV=production ionic build --prod", - "build:test": "NODE_ENV=testing ionic build", + "build:test": "NODE_ENV=testing ionic build --configuration=testing", "dev:android": "ionic cordova run android --livereload", - "dev:ios": "ionic cordova run ios --livereload", - "prod:android": "NODE_ENV=production ionic cordova run android --aot", - "prod:ios": "NODE_ENV=production ionic cordova run ios --aot", + "dev:ios": "ionic cordova run ios", + "prod:android": "NODE_ENV=production ionic cordova run android --prod", + "prod:ios": "NODE_ENV=production ionic cordova run ios --prod", "test": "NODE_ENV=testing gulp && jest --verbose", "test:ci": "NODE_ENV=testing gulp && jest -ci --runInBand --verbose", "test:watch": "NODE_ENV=testing gulp watch & jest --watch", "test:coverage": "NODE_ENV=testing gulp && jest --coverage", "lint": "NODE_OPTIONS=--max-old-space-size=4096 ng lint", "ionic:serve:before": "gulp", - "ionic:serve": "gulp watch & NODE_OPTIONS=--max-old-space-size=4096 ng serve", + "ionic:serve": "cross-env-shell ./scripts/serve.sh", "ionic:build:before": "gulp" }, "dependencies": { @@ -70,65 +71,61 @@ "@ionic-native/status-bar": "5.33.0", "@ionic-native/web-intent": "5.33.0", "@ionic-native/zip": "5.33.0", - "@ionic/angular": "5.6.6", + "@ionic/angular": "5.9.2", + "@moodlehq/cordova-plugin-file-transfer": "1.7.1-moodle.5", + "@moodlehq/cordova-plugin-inappbrowser": "5.0.0-moodle.3", + "@moodlehq/cordova-plugin-ionic-webview": "5.0.0-moodle.1", + "@moodlehq/cordova-plugin-local-notification": "0.9.0-moodle.3", + "@moodlehq/cordova-plugin-qrscanner": "3.0.1-moodle.2", + "@moodlehq/cordova-plugin-zip": "3.1.0-moodle.1", + "@moodlehq/phonegap-plugin-push": "2.0.0-moodle.4", "@ngx-translate/core": "13.0.0", "@ngx-translate/http-loader": "6.0.0", "@types/chart.js": "2.9.31", "@types/cordova": "0.0.34", - "@types/cordova-plugin-file-transfer": "1.6.2", "@types/dom-mediacapture-record": "1.0.7", "chart.js": "2.9.4", - "com-darryncampbell-cordova-plugin-intent": "1.3.0", - "cordova": "10.0.0", - "cordova-android": "9.1.0", - "cordova-android-support-gradle-release": "3.0.1", + "com-darryncampbell-cordova-plugin-intent": "2.2.0", + "cordova": "11.0.0", + "cordova-android": "10.1.1", "cordova-clipboard": "1.3.0", "cordova-ios": "6.2.0", "cordova-plugin-add-swift-support": "2.0.2", - "cordova-plugin-advanced-http": "3.1.0", + "cordova-plugin-advanced-http": "3.2.2", "cordova-plugin-badge": "0.8.8", - "cordova-plugin-camera": "5.0.1", + "cordova-plugin-camera": "6.0.0", "cordova-plugin-chooser": "1.3.2", "cordova-plugin-customurlscheme": "5.0.2", "cordova-plugin-device": "2.0.3", "cordova-plugin-file": "6.0.2", "cordova-plugin-file-opener2": "3.0.5", - "cordova-plugin-file-transfer": "git+https://github.com/moodlemobile/cordova-plugin-file-transfer.git", "cordova-plugin-geolocation": "4.1.0", - "cordova-plugin-globalization": "1.11.0", - "cordova-plugin-inappbrowser": "git+https://github.com/moodlemobile/cordova-plugin-inappbrowser.git#moodle-ionic5", "cordova-plugin-ionic-keyboard": "2.2.0", - "cordova-plugin-ionic-webview": "5.0.0", - "cordova-plugin-local-notification": "git+https://github.com/moodlemobile/cordova-plugin-local-notification.git#moodle", - "cordova-plugin-media": "5.0.3", + "cordova-plugin-media": "5.0.4", "cordova-plugin-media-capture": "3.0.3", - "cordova-plugin-network-information": "2.0.2", - "cordova-plugin-qrscanner": "git+https://github.com/moodlemobile/cordova-plugin-qrscanner.git#dist", - "cordova-plugin-screen-orientation": "3.0.2", + "cordova-plugin-network-information": "3.0.0", + "cordova-plugin-prevent-override": "1.0.1", "cordova-plugin-splashscreen": "6.0.0", - "cordova-plugin-statusbar": "2.4.3", - "cordova-plugin-whitelist": "1.3.4", - "cordova-plugin-wkuserscript": "git+https://github.com/moodlemobile/cordova-plugin-wkuserscript.git", - "cordova-plugin-wkwebview-cookies": "git+https://github.com/moodlemobile/cordova-plugin-wkwebview-cookies.git", - "cordova-plugin-zip": "3.1.0", + "cordova-plugin-statusbar": "3.0.0", + "cordova-plugin-wkuserscript": "1.0.1", + "cordova-plugin-wkwebview-cookies": "1.0.1", "cordova-sqlite-storage": "6.0.0", - "cordova-support-google-services": "1.3.2", - "cordova.plugins.diagnostic": "5.0.2", + "cordova.plugins.diagnostic": "6.1.1", "core-js": "3.9.1", "es6-promise-plugin": "4.2.2", - "jszip": "3.5.0", + "hammerjs": "2.0.8", + "jszip": "3.7.1", "mathjax": "2.7.7", - "moment": "2.29.0", + "moment": "2.29.2", "nl.kingsquare.cordova.background-audio": "1.0.1", - "phonegap-plugin-multidex": "1.0.0", - "phonegap-plugin-push": "git+https://github.com/moodlemobile/phonegap-plugin-push.git#moodle-v3", "rxjs": "6.5.5", "ts-md5": "1.2.7", - "tslib": "2.0.1", + "tslib": "2.3.1", "zone.js": "0.10.3" }, "devDependencies": { - "@angular-devkit/architect": "0.1101.2", + "@angular-builders/custom-webpack": "10.0.1", + "@angular-devkit/architect": "0.1202.7", "@angular-devkit/build-angular": "0.1000.8", "@angular-eslint/builder": "4.2.0", "@angular-eslint/eslint-plugin": "4.2.0", @@ -140,7 +137,7 @@ "@angular/compiler-cli": "10.0.14", "@angular/language-service": "10.0.14", "@ionic/angular-toolkit": "2.3.3", - "@ionic/cli": "6.14.1", + "@ionic/cli": "6.19.0", "@types/faker": "5.1.3", "@types/node": "12.12.64", "@types/resize-observer-browser": "0.1.5", @@ -148,7 +145,9 @@ "@typescript-eslint/eslint-plugin": "4.22.0", "@typescript-eslint/parser": "4.22.0", "check-es-compat": "1.1.1", - "cordova-plugin-prevent-override": "git+https://github.com/moodlemobile/cordova-plugin-prevent-override.git", + "cordova-plugin-androidx-adapter": "1.1.3", + "cordova-plugin-screen-orientation": "^3.0.2", + "cross-env": "7.0.3", "eslint": "7.25.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-header": "3.1.1", @@ -169,13 +168,14 @@ "jest": "26.5.2", "jest-preset-angular": "8.3.1", "jsonc-parser": "2.3.1", - "native-run": "^1.4.0", + "native-run": "1.4.0", + "terser-webpack-plugin": "4.2.3", "ts-jest": "26.4.1", "ts-node": "8.3.0", "typescript": "3.9.9" }, "engines": { - "node": ">=12.x" + "node": ">=14.15.0 <15" }, "cordova": { "platforms": [ @@ -183,11 +183,14 @@ "ios" ], "plugins": { - "cordova-plugin-advanced-http": {}, + "cordova-plugin-advanced-http": { + "ANDROIDBLACKLISTSECURESOCKETPROTOCOLS": "SSLv3,TLSv1" + }, "cordova-clipboard": {}, "cordova-plugin-badge": {}, "cordova-plugin-camera": { - "ANDROID_SUPPORT_V4_VERSION": "27.+" + "ANDROID_SUPPORT_V4_VERSION": "27.+", + "ANDROIDX_CORE_VERSION": "1.6.+" }, "cordova-plugin-chooser": {}, "cordova-plugin-customurlscheme": { @@ -203,10 +206,10 @@ "cordova-plugin-geolocation": { "GPS_REQUIRED": "false" }, - "cordova-plugin-inappbrowser": {}, + "@moodlehq/cordova-plugin-inappbrowser": {}, "cordova-plugin-ionic-keyboard": {}, - "cordova-plugin-ionic-webview": {}, - "cordova-plugin-local-notification": { + "@moodlehq/cordova-plugin-ionic-webview": {}, + "@moodlehq/cordova-plugin-local-notification": { "ANDROID_SUPPORT_V4_VERSION": "26.+" }, "cordova-plugin-media-capture": {}, @@ -214,30 +217,29 @@ "KEEP_AVAUDIOSESSION_ALWAYS_ACTIVE": "NO" }, "cordova-plugin-network-information": {}, - "cordova-plugin-qrscanner": {}, - "cordova-plugin-screen-orientation": {}, + "@moodlehq/cordova-plugin-qrscanner": {}, "cordova-plugin-splashscreen": {}, "cordova-plugin-statusbar": {}, - "cordova-plugin-whitelist": {}, "cordova-plugin-wkuserscript": {}, "cordova-plugin-wkwebview-cookies": {}, - "cordova-plugin-zip": {}, + "@moodlehq/cordova-plugin-zip": {}, "cordova-sqlite-storage": {}, - "phonegap-plugin-push": { - "ANDROID_SUPPORT_V13_VERSION": "27.+", - "FCM_VERSION": "17.0.+" + "@moodlehq/phonegap-plugin-push": { + "ANDROID_SUPPORT_V13_VERSION": "28.0.0", + "FCM_VERSION": "18.+", + "IOS_FIREBASE_MESSAGING_VERSION": "~> 6.32.2" }, "com-darryncampbell-cordova-plugin-intent": {}, "nl.kingsquare.cordova.background-audio": {}, - "cordova-android-support-gradle-release": { - "ANDROID_SUPPORT_VERSION": "27.+" - }, "cordova.plugins.diagnostic": { - "ANDROID_SUPPORT_VERSION": "28.+" + "ANDROID_SUPPORT_VERSION": "28.+", + "ANDROIDX_VERSION": "1.0.0", + "ANDROIDX_APPCOMPAT_VERSION": "1.3.1" }, - "cordova-plugin-globalization": {}, - "cordova-plugin-file-transfer": {}, - "cordova-plugin-prevent-override": {} + "@moodlehq/cordova-plugin-file-transfer": {}, + "cordova-plugin-prevent-override": {}, + "cordova-plugin-androidx-adapter": {}, + "cordova-plugin-screen-orientation": {} } }, "optionalDependencies": { diff --git a/resources/android/xml/network_security_config.xml b/resources/android/xml/network_security_config.xml index de61259aa..dca93c079 100644 --- a/resources/android/xml/network_security_config.xml +++ b/resources/android/xml/network_security_config.xml @@ -1,6 +1,4 @@ - - localhost - - + + \ No newline at end of file diff --git a/scripts/lang_functions.php b/scripts/lang_functions.php index a0cd6f9ba..a6698560c 100644 --- a/scripts/lang_functions.php +++ b/scripts/lang_functions.php @@ -113,10 +113,17 @@ function add_langs_to_config($langs, $config) { $config['languages'] = json_decode( json_encode( $config['languages'] ), true ); ksort($config['languages']); $config['languages'] = json_decode( json_encode( $config['languages'] ), false ); - file_put_contents(CONFIG, json_encode($config, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); + save_json(CONFIG, $config); } } +/** + * Save json data. + */ +function save_json($path, $content) { + file_put_contents($path, str_replace('\/', '/', json_encode($content, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT))."\n"); +} + function get_langfolder($lang) { $folder = LANGPACKSFOLDER.'/'.str_replace('-', '_', $lang); if (!is_dir($folder) || !is_file($folder.'/langconfig.php')) { @@ -246,9 +253,11 @@ function build_lang($lang, $keys) { } if ($value->file != 'local_moodlemobileapp') { + $text = str_replace('$a->@', '$a.', $text); $text = str_replace('$a->', '$a.', $text); $text = str_replace('{$a', '{{$a', $text); $text = str_replace('}', '}}', $text); + $text = preg_replace('/@@.+?@@(
)?\\s*/', '', $text); // Prevent double. $text = str_replace(array('{{{', '}}}'), array('{{', '}}'), $text); } else { @@ -270,7 +279,7 @@ function build_lang($lang, $keys) { // Sort and save. ksort($translations); - file_put_contents(ASSETSPATH.$lang.'.json', str_replace('\/', '/', json_encode($translations, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT))); + save_json(ASSETSPATH.$lang.'.json', $translations); $success = count($translations); $percentage = floor($success/$total * 100); @@ -365,7 +374,7 @@ function save_key($key, $value, $filePath) { if (!isset($file[$key]) || $file[$key] != $value) { $file[$key] = $value; ksort($file); - file_put_contents($filePath, str_replace('\/', '/', json_encode($file, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT))); + save_json($filePath, $file); } } diff --git a/scripts/lang_functions.sh b/scripts/lang_functions.sh index ef7de3a0f..2dc18ad05 100755 --- a/scripts/lang_functions.sh +++ b/scripts/lang_functions.sh @@ -102,6 +102,15 @@ function get_language { pushd $LANGPACKSFOLDER > /dev/null curl -s $MOODLEORG_URL/$lastversion/$lang.zip --output $lang.zip > /dev/null + size=$(du -k "$lang.zip" | cut -f 1) + if [ ! -n $lang.zip ] || [ $size -le 60 ]; then + echo "Wrong language name or corrupt file for $lang" + rm $lang.zip + + popd > /dev/null + return + fi + rm -R $lang > /dev/null 2>&1> /dev/null unzip -o -u $lang.zip > /dev/null @@ -114,6 +123,11 @@ function get_language { # Entry function to get all language files. function get_languages { + suffix=$1 + if [ -z $suffix ]; then + suffix='' + fi + get_last_version if [ -d $LANGPACKSFOLDER ]; then @@ -131,6 +145,7 @@ function get_languages { if [ $AWS_SERVICE -eq 1 ]; then get_all_languages_aws + suffix='' else echo "Fallback language list will only get current installation languages" get_installed_languages @@ -138,5 +153,9 @@ function get_languages { for lang in $langs; do get_language "$lang" + + if [ $suffix != '' ]; then + get_language "$lang$suffix" + fi done } diff --git a/scripts/langindex.json b/scripts/langindex.json index 57ee82499..fd706d2f8 100644 --- a/scripts/langindex.json +++ b/scripts/langindex.json @@ -40,12 +40,18 @@ "addon.block_learningplans.pluginname": "block_lp", "addon.block_myoverview.all": "block_myoverview", "addon.block_myoverview.allincludinghidden": "block_myoverview", + "addon.block_myoverview.browseallcourses": "local_moodlemobileapp", + "addon.block_myoverview.card": "block_myoverview", "addon.block_myoverview.favourites": "block_myoverview", "addon.block_myoverview.future": "block_myoverview", "addon.block_myoverview.hiddencourses": "block_myoverview", "addon.block_myoverview.inprogress": "block_myoverview", "addon.block_myoverview.lastaccessed": "block_myoverview", - "addon.block_myoverview.nocourses": "block_myoverview", + "addon.block_myoverview.list": "block_myoverview", + "addon.block_myoverview.nocoursesenrolled": "local_moodlemobileapp", + "addon.block_myoverview.nocoursesenrolleddescription": "local_moodlemobileapp", + "addon.block_myoverview.noresult": "local_moodlemobileapp", + "addon.block_myoverview.noresultdescription": "local_moodlemobileapp", "addon.block_myoverview.past": "block_myoverview", "addon.block_myoverview.pluginname": "block_myoverview", "addon.block_myoverview.shortname": "block_myoverview", @@ -73,6 +79,7 @@ "addon.block_timeline.noevents": "block_timeline", "addon.block_timeline.overdue": "block_timeline", "addon.block_timeline.pluginname": "block_timeline", + "addon.block_timeline.searchevents": "block_timeline", "addon.block_timeline.sortbycourses": "block_timeline", "addon.block_timeline.sortbydates": "block_timeline", "addon.blog.blog": "blog", @@ -140,6 +147,7 @@ "addon.calendar.sunday": "calendar", "addon.calendar.thu": "calendar", "addon.calendar.thursday": "calendar", + "addon.calendar.timebefore": "local_moodlemobileapp", "addon.calendar.today": "calendar", "addon.calendar.tomorrow": "calendar", "addon.calendar.tue": "calendar", @@ -153,6 +161,7 @@ "addon.calendar.typeopen": "calendar", "addon.calendar.typesite": "calendar", "addon.calendar.typeuser": "calendar", + "addon.calendar.units": "qtype_numerical", "addon.calendar.upcomingevents": "calendar", "addon.calendar.userevents": "calendar", "addon.calendar.wed": "calendar", @@ -229,6 +238,7 @@ "addon.coursecompletion.status": "moodle", "addon.coursecompletion.viewcoursereport": "completion", "addon.messageoutput_airnotifier.processorsettingsdesc": "local_moodlemobileapp", + "addon.messageoutput_airnotifier.pushdisabledwarning": "local_moodlemobileapp", "addon.messages.acceptandaddcontact": "message", "addon.messages.addcontact": "message", "addon.messages.addcontactconfirm": "message", @@ -325,14 +335,18 @@ "addon.mod_assign.allowsubmissionsfromdatesummary": "assign", "addon.mod_assign.applytoteam": "assign", "addon.mod_assign.assignmentisdue": "assign", + "addon.mod_assign.assigntimeleft": "assign", "addon.mod_assign.attemptnumber": "assign", "addon.mod_assign.attemptreopenmethod": "assign", "addon.mod_assign.attemptreopenmethod_manual": "assign", "addon.mod_assign.attemptreopenmethod_untilpass": "assign", "addon.mod_assign.attemptsettings": "assign", + "addon.mod_assign.beginassignment": "assign", + "addon.mod_assign.caneditsubmission": "assign", "addon.mod_assign.cannoteditduetostatementsubmission": "local_moodlemobileapp", "addon.mod_assign.cannotgradefromapp": "local_moodlemobileapp", "addon.mod_assign.cannotsubmitduetostatementsubmission": "local_moodlemobileapp", + "addon.mod_assign.confirmstart": "assign", "addon.mod_assign.confirmsubmission": "assign", "addon.mod_assign.currentattempt": "assign", "addon.mod_assign.currentattemptof": "assign", @@ -340,7 +354,7 @@ "addon.mod_assign.cutoffdate": "assign", "addon.mod_assign.defaultteam": "assign", "addon.mod_assign.duedate": "assign", - "addon.mod_assign.duedateno": "assign", + "addon.mod_assign.duedateno": "local_moodlemobileapp", "addon.mod_assign.duedatereached": "assign", "addon.mod_assign.editingstatus": "assign", "addon.mod_assign.editsubmission": "assign", @@ -410,7 +424,10 @@ "addon.mod_assign.submitassignment_help": "assign", "addon.mod_assign.submittedearly": "assign", "addon.mod_assign.submittedlate": "assign", + "addon.mod_assign.submittedovertime": "assign", + "addon.mod_assign.submittedundertime": "assign", "addon.mod_assign.syncblockedusercomponent": "local_moodlemobileapp", + "addon.mod_assign.timelimit": "assign", "addon.mod_assign.timemodified": "assign", "addon.mod_assign.timeremaining": "assign", "addon.mod_assign.ungroupedusers": "assign", @@ -428,6 +445,23 @@ "addon.mod_assign_submission_file.pluginname": "assignsubmission_file", "addon.mod_assign_submission_onlinetext.pluginname": "assignsubmission_onlinetext", "addon.mod_assign_submission_onlinetext.wordlimitexceeded": "assignsubmission_onlinetext", + "addon.mod_bigbluebuttonbn.end_session_confirm": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.end_session_confirm_title": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.mod_form_field_closingtime": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.mod_form_field_openingtime": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.userlimitreached": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_conference_action_end": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_conference_action_join": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_error_unable_join_student": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_groups_selection_warning": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_message_conference_in_progress": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_message_conference_room_ready": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_message_moderator": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_message_moderators": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_message_session_started_at": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_message_viewer": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_message_viewers": "bigbluebuttonbn", + "addon.mod_bigbluebuttonbn.view_nojoin": "bigbluebuttonbn", "addon.mod_book.errorchapter": "book", "addon.mod_book.modulenameplural": "book", "addon.mod_book.navnexttitle": "book", @@ -538,6 +572,7 @@ "addon.mod_feedback.analysis": "feedback", "addon.mod_feedback.anonymous": "feedback", "addon.mod_feedback.anonymous_entries": "feedback", + "addon.mod_feedback.anonymous_user": "feedback", "addon.mod_feedback.average": "feedback", "addon.mod_feedback.captchaofflinewarning": "local_moodlemobileapp", "addon.mod_feedback.complete_the_form": "feedback", @@ -553,7 +588,6 @@ "addon.mod_feedback.minimal": "feedback", "addon.mod_feedback.mode": "feedback", "addon.mod_feedback.modulenameplural": "feedback", - "addon.mod_feedback.next_page": "feedback", "addon.mod_feedback.non_anonymous": "feedback", "addon.mod_feedback.non_anonymous_entries": "feedback", "addon.mod_feedback.non_respondents_students": "feedback", @@ -563,7 +597,6 @@ "addon.mod_feedback.overview": "feedback", "addon.mod_feedback.page_after_submit": "feedback", "addon.mod_feedback.preview": "moodle", - "addon.mod_feedback.previous_page": "feedback", "addon.mod_feedback.questions": "feedback", "addon.mod_feedback.questionscountdescription": "local_moodlemobileapp", "addon.mod_feedback.response_nr": "feedback", @@ -625,8 +658,8 @@ "addon.mod_forum.posttoforum": "forum", "addon.mod_forum.posttomygroups": "forum", "addon.mod_forum.privatereply": "forum", + "addon.mod_forum.qandanotify": "forum", "addon.mod_forum.re": "forum", - "addon.mod_forum.refreshdiscussions": "local_moodlemobileapp", "addon.mod_forum.refreshposts": "local_moodlemobileapp", "addon.mod_forum.removefromfavourites": "forum", "addon.mod_forum.reply": "forum", @@ -681,7 +714,9 @@ "addon.mod_h5pactivity.attempt_success_fail": "h5pactivity", "addon.mod_h5pactivity.attempt_success_pass": "h5pactivity", "addon.mod_h5pactivity.attempt_success_unknown": "h5pactivity", + "addon.mod_h5pactivity.attempts": "h5pactivity", "addon.mod_h5pactivity.attempts_none": "h5pactivity", + "addon.mod_h5pactivity.attempts_report": "h5pactivity", "addon.mod_h5pactivity.completion": "h5pactivity", "addon.mod_h5pactivity.downloadh5pfile": "local_moodlemobileapp", "addon.mod_h5pactivity.duration": "h5pactivity", @@ -692,12 +727,13 @@ "addon.mod_h5pactivity.modulenameplural": "h5pactivity", "addon.mod_h5pactivity.myattempts": "h5pactivity", "addon.mod_h5pactivity.no_compatible_track": "h5pactivity", + "addon.mod_h5pactivity.noparticipants": "h5pactivity", "addon.mod_h5pactivity.offlinedisabledwarning": "local_moodlemobileapp", "addon.mod_h5pactivity.outcome": "h5pactivity", "addon.mod_h5pactivity.previewmode": "h5pactivity", "addon.mod_h5pactivity.result_fill-in": "h5pactivity", "addon.mod_h5pactivity.result_other": "h5pactivity", - "addon.mod_h5pactivity.review_my_attempts": "h5pactivity", + "addon.mod_h5pactivity.review_user_attempts": "h5pactivity", "addon.mod_h5pactivity.score": "h5pactivity", "addon.mod_h5pactivity.score_out_of": "h5pactivity", "addon.mod_h5pactivity.startdate": "h5pactivity", @@ -855,8 +891,6 @@ "addon.mod_quiz.requirepasswordmessage": "quizaccess_password", "addon.mod_quiz.returnattempt": "quiz", "addon.mod_quiz.review": "quiz", - "addon.mod_quiz.reviewofattempt": "quiz", - "addon.mod_quiz.reviewofpreview": "quiz", "addon.mod_quiz.showall": "quiz", "addon.mod_quiz.showeachpage": "quiz", "addon.mod_quiz.startattempt": "quiz", @@ -883,6 +917,8 @@ "addon.mod_resource.modifieddate": "resource", "addon.mod_resource.modulenameplural": "resource", "addon.mod_resource.openthefile": "local_moodlemobileapp", + "addon.mod_resource.resourcestatusoutdated": "local_moodlemobileapp", + "addon.mod_resource.resourcestatusoutdatedconfirm": "local_moodlemobileapp", "addon.mod_resource.uploadeddate": "resource", "addon.mod_scorm.asset": "scorm", "addon.mod_scorm.assetlaunched": "scorm", @@ -1069,12 +1105,30 @@ "addon.privatefiles.sitefiles": "moodle", "addon.qtype_essay.maxwordlimitboundary": "qtype_essay", "addon.qtype_essay.minwordlimitboundary": "qtype_essay", - "addon.storagemanager.deletecourse": "local_moodlemobileapp", + "addon.report_insights.actionsaved": "report_insights", + "addon.report_insights.fixedack": "analytics", + "addon.report_insights.incorrectlyflagged": "analytics", + "addon.report_insights.notapplicable": "analytics", + "addon.report_insights.notuseful": "analytics", + "addon.report_insights.useful": "analytics", + "addon.storagemanager.alldata": "tool_wp", + "addon.storagemanager.confirmdeleteallsitedata": "local_moodlemobileapp", + "addon.storagemanager.confirmdeletecourses": "local_moodlemobileapp", + "addon.storagemanager.confirmdeletedatafrom": "local_moodlemobileapp", + "addon.storagemanager.coursedownloads": "local_moodlemobileapp", + "addon.storagemanager.courseinfo": "local_moodlemobileapp", + "addon.storagemanager.deleteall": "moodle", + "addon.storagemanager.deleteallsitedata": "local_moodlemobileapp", + "addon.storagemanager.deleteallsitedatainfo": "local_moodlemobileapp", "addon.storagemanager.deletecourses": "local_moodlemobileapp", + "addon.storagemanager.deletedata": "local_moodlemobileapp", "addon.storagemanager.deletedatafrom": "local_moodlemobileapp", - "addon.storagemanager.info": "local_moodlemobileapp", - "addon.storagemanager.managestorage": "local_moodlemobileapp", - "addon.storagemanager.storageused": "local_moodlemobileapp", + "addon.storagemanager.downloadedcourses": "local_moodlemobileapp", + "addon.storagemanager.downloads": "local_moodlemobileapp", + "addon.storagemanager.errordeletedownloadeddata": "local_moodlemobileapp", + "addon.storagemanager.managedownloads": "local_moodlemobileapp", + "addon.storagemanager.totaldownloads": "local_moodlemobileapp", + "addon.storagemanager.totalspaceusage": "local_moodlemobileapp", "assets.countries.AD": "countries", "assets.countries.AE": "countries", "assets.countries.AF": "countries", @@ -1324,9 +1378,23 @@ "assets.countries.ZA": "countries", "assets.countries.ZM": "countries", "assets.countries.ZW": "countries", + "assets.mimetypes.application/dash_xml": "mimetypes", "assets.mimetypes.application/epub_zip": "mimetypes", + "assets.mimetypes.application/json": "mimetypes", "assets.mimetypes.application/msword": "mimetypes", "assets.mimetypes.application/pdf": "mimetypes", + "assets.mimetypes.application/vnd.google-apps.audio": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.document": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.drawing": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.file": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.folder": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.form": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.fusiontable": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.presentation": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.script": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.site": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.spreadsheet": "local_moodlemobileapp", + "assets.mimetypes.application/vnd.google-apps.video": "local_moodlemobileapp", "assets.mimetypes.application/vnd.moodle.backup": "mimetypes", "assets.mimetypes.application/vnd.ms-excel": "mimetypes", "assets.mimetypes.application/vnd.ms-excel.sheet.macroEnabled.12": "mimetypes", @@ -1345,6 +1413,7 @@ "assets.mimetypes.application/x-iwork-numbers-sffnumbers": "mimetypes", "assets.mimetypes.application/x-iwork-pages-sffpages": "mimetypes", "assets.mimetypes.application/x-javascript": "mimetypes", + "assets.mimetypes.application/x-mpegURL": "mimetypes", "assets.mimetypes.application/x-mspublisher": "mimetypes", "assets.mimetypes.application/x-shockwave-flash": "mimetypes", "assets.mimetypes.application/xhtml_xml": "mimetypes", @@ -1359,6 +1428,8 @@ "assets.mimetypes.group:html_track": "mimetypes", "assets.mimetypes.group:html_video": "mimetypes", "assets.mimetypes.group:image": "mimetypes", + "assets.mimetypes.group:media_source": "mimetypes", + "assets.mimetypes.group:optimised_image": "mimetypes", "assets.mimetypes.group:presentation": "mimetypes", "assets.mimetypes.group:sourcecode": "mimetypes", "assets.mimetypes.group:spreadsheet": "mimetypes", @@ -1380,6 +1451,7 @@ "core.add": "moodle", "core.agelocationverification": "moodle", "core.ago": "message", + "core.ajaxendpointnotfound": "local_moodlemobileapp", "core.all": "moodle", "core.allgroups": "moodle", "core.allparticipants": "moodle", @@ -1388,12 +1460,18 @@ "core.areyousure": "moodle", "core.back": "moodle", "core.block.blocks": "moodle", + "core.block.noblocks": "error", + "core.block.opendrawerblocks": "moodle", + "core.block.tour_navigation_dashboard_content": "tool_usertours", + "core.block.tour_navigation_dashboard_title": "tool_usertours", "core.browser": "local_moodlemobileapp", + "core.calculating": "local_moodlemobileapp", "core.cancel": "moodle", "core.cannotconnect": "local_moodlemobileapp", "core.cannotconnecttrouble": "local_moodlemobileapp", "core.cannotconnectverify": "local_moodlemobileapp", "core.cannotdownloadfiles": "local_moodlemobileapp", + "core.cannotlogoutpageblocks": "local_moodlemobileapp", "core.cannotopeninapp": "local_moodlemobileapp", "core.cannotopeninappdownload": "local_moodlemobileapp", "core.captureaudio": "local_moodlemobileapp", @@ -1401,6 +1479,7 @@ "core.captureimage": "local_moodlemobileapp", "core.capturevideo": "local_moodlemobileapp", "core.category": "moodle", + "core.certificaterror": "local_moodlemobileapp", "core.choose": "moodle", "core.choosedots": "moodle", "core.clearsearch": "local_moodlemobileapp", @@ -1433,8 +1512,6 @@ "core.completion-alt-manual-y-override": "completion", "core.confirmcanceledit": "local_moodlemobileapp", "core.confirmdeletefile": "repository", - "core.confirmgotabroot": "local_moodlemobileapp", - "core.confirmgotabrootdefault": "local_moodlemobileapp", "core.confirmleaveunknownchanges": "local_moodlemobileapp", "core.confirmloss": "local_moodlemobileapp", "core.confirmopeninbrowser": "local_moodlemobileapp", @@ -1453,10 +1530,8 @@ "core.course": "moodle", "core.course.activitydisabled": "local_moodlemobileapp", "core.course.activitynotyetviewableremoteaddon": "local_moodlemobileapp", - "core.course.activitynotyetviewablesiteupgradeneeded": "local_moodlemobileapp", "core.course.allsections": "local_moodlemobileapp", "core.course.aria:sectionprogress": "local_moodlemobileapp", - "core.course.askadmintosupport": "local_moodlemobileapp", "core.course.availablespace": "local_moodlemobileapp", "core.course.cannotdeletewhiledownloading": "local_moodlemobileapp", "core.course.completion_automatic:done": "course", @@ -1471,34 +1546,47 @@ "core.course.completion_setby:manual:done": "course", "core.course.completion_setby:manual:markdone": "course", "core.course.completionrequirements": "course", - "core.course.confirmdeletemodulefiles": "local_moodlemobileapp", - "core.course.confirmdeletestoreddata": "local_moodlemobileapp", "core.course.confirmdownload": "local_moodlemobileapp", "core.course.confirmdownloadunknownsize": "local_moodlemobileapp", "core.course.confirmdownloadzerosize": "local_moodlemobileapp", "core.course.confirmlimiteddownload": "local_moodlemobileapp", "core.course.confirmpartialdownloadsize": "local_moodlemobileapp", - "core.course.contents": "local_moodlemobileapp", "core.course.couldnotloadsectioncontent": "local_moodlemobileapp", "core.course.couldnotloadsections": "local_moodlemobileapp", + "core.course.courseindex": "courseformat", "core.course.coursesummary": "moodle", + "core.course.done": "completion", "core.course.downloadcourse": "tool_mobile", "core.course.downloadcoursesprogressdescription": "local_moodlemobileapp", "core.course.downloadsectionprogressdescription": "local_moodlemobileapp", + "core.course.enddate": "moodle", "core.course.errordownloadingcourse": "local_moodlemobileapp", "core.course.errordownloadingsection": "local_moodlemobileapp", "core.course.errorgetmodule": "local_moodlemobileapp", + "core.course.failed": "completion", "core.course.hiddenfromstudents": "moodle", "core.course.hiddenoncoursepage": "moodle", + "core.course.highlighted": "moodle", "core.course.insufficientavailablequota": "local_moodlemobileapp", "core.course.insufficientavailablespace": "local_moodlemobileapp", + "core.course.lastaccessedactivity": "local_moodlemobileapp", "core.course.manualcompletionnotsynced": "local_moodlemobileapp", + "core.course.modulenotfound": "local_moodlemobileapp", + "core.course.nextactivity": "local_moodlemobileapp", + "core.course.nextactivitynotfound": "local_moodlemobileapp", "core.course.nocontentavailable": "local_moodlemobileapp", "core.course.overriddennotice": "grades", + "core.course.previousactivity": "local_moodlemobileapp", + "core.course.previousactivitynotfound": "local_moodlemobileapp", "core.course.refreshcourse": "local_moodlemobileapp", "core.course.section": "moodle", - "core.course.sections": "moodle", + "core.course.startdate": "moodle", + "core.course.thisweek": "format_weeks/currentsection", + "core.course.todo": "completion", + "core.course.tour_navigation_course_index_student_content": "tool_usertours", + "core.course.tour_navigation_course_index_student_title": "tool_usertours", "core.course.useactivityonbrowser": "local_moodlemobileapp", + "core.course.viewcourse": "block_timeline", "core.course.warningmanualcompletionmodified": "local_moodlemobileapp", "core.course.warningofflinemanualcompletiondeleted": "local_moodlemobileapp", "core.coursedetails": "moodle", @@ -1510,8 +1598,10 @@ "core.courses.aria:courseprogress": "block_myoverview", "core.courses.aria:favourite": "course", "core.courses.availablecourses": "moodle", + "core.courses.browserenrolinstructions": "local_moodlemobileapp", "core.courses.cannotretrievemorecategories": "local_moodlemobileapp", "core.courses.categories": "moodle", + "core.courses.completeenrolmentbrowser": "local_moodlemobileapp", "core.courses.confirmselfenrol": "local_moodlemobileapp", "core.courses.courses": "moodle", "core.courses.downloadcourses": "local_moodlemobileapp", @@ -1533,22 +1623,25 @@ "core.courses.nosearchresults": "wiki", "core.courses.notenroled": "completion", "core.courses.notenrollable": "local_moodlemobileapp", + "core.courses.otherenrolments": "local_moodlemobileapp", "core.courses.password": "local_moodlemobileapp", "core.courses.paymentrequired": "moodle", - "core.courses.paypalaccepted": "enrol_paypal", + "core.courses.refreshcourses": "local_moodlemobileapp", "core.courses.reload": "moodle", "core.courses.removefromfavourites": "block_myoverview", "core.courses.search": "moodle", "core.courses.searchcourses": "moodle", "core.courses.searchcoursesadvice": "local_moodlemobileapp", "core.courses.selfenrolment": "local_moodlemobileapp", - "core.courses.sendpaymentbutton": "enrol_paypal", "core.courses.show": "block_myoverview", + "core.courses.showonlyenrolled": "local_moodlemobileapp", "core.courses.therearecourses": "moodle", "core.courses.totalcoursesearchresults": "local_moodlemobileapp", "core.currentdevice": "local_moodlemobileapp", + "core.custom": "form", "core.datastoredoffline": "local_moodlemobileapp", "core.date": "moodle", + "core.datecreated": "repository", "core.day": "moodle", "core.days": "moodle", "core.decsep": "langconfig", @@ -1567,10 +1660,12 @@ "core.dftimedate": "local_moodlemobileapp", "core.digitalminor": "moodle", "core.digitalminor_desc": "moodle", + "core.disablefullscreen": "h5p", "core.discard": "local_moodlemobileapp", "core.dismiss": "local_moodlemobileapp", "core.displayoptions": "atto_media", "core.done": "survey", + "core.dontshowagain": "local_moodlemobileapp", "core.download": "moodle", "core.downloaded": "local_moodlemobileapp", "core.downloadfile": "moodle", @@ -1592,6 +1687,7 @@ "core.editor.underline": "atto_underline/pluginname", "core.editor.unorderedlist": "atto_unorderedlist/pluginname", "core.emptysplit": "local_moodlemobileapp", + "core.endonesteptour": "tool_usertours", "core.error": "moodle", "core.errorchangecompletion": "local_moodlemobileapp", "core.errordeletefile": "local_moodlemobileapp", @@ -1650,6 +1746,8 @@ "core.forcepasswordchangenotice": "moodle", "core.fulllistofcourses": "moodle", "core.fullnameandsitename": "local_moodlemobileapp", + "core.fullscreen": "h5p", + "core.goto": "local_moodlemobileapp", "core.grades.aggregatemean": "grades", "core.grades.aggregatesum": "grades", "core.grades.average": "grades", @@ -1657,8 +1755,10 @@ "core.grades.calculatedgrade": "grades", "core.grades.category": "grades", "core.grades.contributiontocoursetotal": "grades", + "core.grades.fail": "grades", "core.grades.feedback": "grades", "core.grades.grade": "grades", + "core.grades.gradebook": "grades", "core.grades.gradeitem": "grades", "core.grades.gradepass": "grades", "core.grades.grades": "grades", @@ -1667,6 +1767,7 @@ "core.grades.nogradesreturned": "grades", "core.grades.nooutcome": "grades", "core.grades.outcome": "grades", + "core.grades.pass": "grades", "core.grades.percentage": "grades", "core.grades.range": "grades", "core.grades.rank": "grades", @@ -1734,6 +1835,7 @@ "core.h5p.licensee": "h5p", "core.h5p.licenseextras": "h5p", "core.h5p.licenseversion": "h5p", + "core.h5p.missingdependency": "h5p", "core.h5p.nocopyright": "h5p", "core.h5p.offlineDialogBody": "h5p", "core.h5p.offlineDialogHeader": "h5p", @@ -1789,6 +1891,8 @@ "core.loading": "moodle", "core.loadmore": "local_moodlemobileapp", "core.location": "moodle", + "core.login.accounts": "admin", + "core.login.add": "moodle", "core.login.auth_email": "auth_email/pluginname", "core.login.authenticating": "local_moodlemobileapp", "core.login.cancel": "moodle", @@ -1846,7 +1950,6 @@ "core.login.invalidurl": "scorm", "core.login.invalidvaluemax": "local_moodlemobileapp", "core.login.invalidvaluemin": "local_moodlemobileapp", - "core.login.localmobileunexpectedresponse": "local_moodlemobileapp", "core.login.loggedoutssodescription": "local_moodlemobileapp", "core.login.login": "moodle", "core.login.loginbutton": "local_moodlemobileapp", @@ -1875,6 +1978,7 @@ "core.login.passwordforgotteninstructions2": "moodle", "core.login.passwordrequired": "local_moodlemobileapp", "core.login.policyaccept": "moodle", + "core.login.policyacceptmandatory": "local_moodlemobileapp", "core.login.policyagree": "moodle", "core.login.policyagreement": "moodle", "core.login.policyagreementclick": "moodle", @@ -1884,8 +1988,8 @@ "core.login.recaptchaexpired": "local_moodlemobileapp", "core.login.recaptchaincorrect": "local_moodlemobileapp", "core.login.reconnect": "local_moodlemobileapp", - "core.login.reconnectdescription": "local_moodlemobileapp", "core.login.reconnectssodescription": "local_moodlemobileapp", + "core.login.removeaccount": "local_moodlemobileapp", "core.login.resendemail": "moodle", "core.login.searchby": "local_moodlemobileapp", "core.login.security_question": "auth", @@ -1898,12 +2002,14 @@ "core.login.sitebadgedescription": "local_moodlemobileapp", "core.login.sitehasredirect": "local_moodlemobileapp", "core.login.siteinmaintenance": "local_moodlemobileapp", + "core.login.sitenotallowed": "local_moodlemobileapp", "core.login.sitepolicynotagreederror": "local_moodlemobileapp", "core.login.siteurl": "local_moodlemobileapp", "core.login.siteurlrequired": "local_moodlemobileapp", "core.login.startsignup": "moodle", "core.login.stillcantconnect": "local_moodlemobileapp", "core.login.supplyinfo": "moodle", + "core.login.toggleremove": "local_moodlemobileapp", "core.login.username": "moodle", "core.login.usernameoremail": "moodle", "core.login.usernamerequired": "local_moodlemobileapp", @@ -1913,23 +2019,23 @@ "core.login.youcanstillconnectwithcredentials": "local_moodlemobileapp", "core.login.yourenteredsite": "local_moodlemobileapp", "core.lostconnection": "local_moodlemobileapp", - "core.mainmenu.changesite": "local_moodlemobileapp", - "core.mainmenu.help": "moodle", "core.mainmenu.home": "moodle", "core.mainmenu.logout": "moodle", - "core.mainmenu.website": "local_moodlemobileapp", + "core.mainmenu.switchaccount": "local_moodlemobileapp", + "core.mainmenu.usermenutourdescription": "local_moodlemobileapp", + "core.mainmenu.usermenutourtitle": "local_moodlemobileapp", "core.maxfilesize": "moodle", "core.maxsizeandattachments": "moodle", "core.min": "moodle", "core.mins": "moodle", + "core.minute": "moodle", + "core.minutes": "moodle", "core.misc": "admin", "core.mod_assign": "assign/pluginname", - "core.mod_assignment": "assignment/pluginname", "core.mod_book": "book/pluginname", "core.mod_chat": "chat/pluginname", "core.mod_choice": "choice/pluginname", "core.mod_data": "data/pluginname", - "core.mod_database": "data/pluginname", "core.mod_external-tool": "lti/pluginname", "core.mod_feedback": "feedback/pluginname", "core.mod_file": "moodle/file", @@ -1937,7 +2043,6 @@ "core.mod_forum": "forum/pluginname", "core.mod_glossary": "glossary/pluginname", "core.mod_h5pactivity": "h5pactivity/pluginname", - "core.mod_ims": "imscp/pluginname", "core.mod_imscp": "imscp/pluginname", "core.mod_label": "label/pluginname", "core.mod_lesson": "lesson/pluginname", @@ -1951,7 +2056,7 @@ "core.mod_wiki": "wiki/pluginname", "core.mod_workshop": "workshop/pluginname", "core.moduleintro": "moodle", - "core.more": "moodle", + "core.more": "moodle/moremenu", "core.mygroups": "group", "core.name": "moodle", "core.needhelp": "local_moodlemobileapp", @@ -1991,7 +2096,6 @@ "core.othergroups": "group", "core.pagea": "moodle", "core.parentlanguage": "langconfig", - "core.paymentinstant": "moodle", "core.percentagenumber": "local_moodlemobileapp", "core.phone": "moodle", "core.pictureof": "moodle", @@ -2039,6 +2143,7 @@ "core.resources": "moodle", "core.restore": "moodle", "core.restricted": "moodle", + "core.resume": "local_moodlemobileapp", "core.retry": "local_moodlemobileapp", "core.save": "moodle", "core.savechanges": "assign", @@ -2058,11 +2163,14 @@ "core.sending": "chat", "core.serverconnection": "error", "core.settings.about": "local_moodlemobileapp", + "core.settings.accessstatement": "access", "core.settings.appsettings": "local_moodlemobileapp", "core.settings.appversion": "local_moodlemobileapp", "core.settings.cannotsyncloggedout": "local_moodlemobileapp", "core.settings.cannotsyncoffline": "local_moodlemobileapp", "core.settings.cannotsyncwithoutwifi": "local_moodlemobileapp", + "core.settings.changelanguage": "local_moodlemobileapp", + "core.settings.changelanguagealert": "local_moodlemobileapp", "core.settings.colorscheme": "local_moodlemobileapp", "core.settings.colorscheme-dark": "local_moodlemobileapp", "core.settings.colorscheme-light": "local_moodlemobileapp", @@ -2078,12 +2186,12 @@ "core.settings.currentlanguage": "moodle", "core.settings.debugdisplay": "admin", "core.settings.debugdisplaydescription": "local_moodlemobileapp", - "core.settings.deletesitefiles": "local_moodlemobileapp", - "core.settings.deletesitefilestitle": "local_moodlemobileapp", + "core.settings.developeroptions": "local_moodlemobileapp", "core.settings.deviceinfo": "local_moodlemobileapp", "core.settings.deviceos": "local_moodlemobileapp", "core.settings.disableall": "message", "core.settings.disabled": "lesson", + "core.settings.disallowed": "message", "core.settings.displayformat": "local_moodlemobileapp", "core.settings.enabledownloadsection": "local_moodlemobileapp", "core.settings.enablefirebaseanalytics": "local_moodlemobileapp", @@ -2092,12 +2200,12 @@ "core.settings.enablerichtexteditordescription": "local_moodlemobileapp", "core.settings.enablesyncwifi": "local_moodlemobileapp", "core.settings.entriesincache": "local_moodlemobileapp", - "core.settings.errordeletesitefiles": "local_moodlemobileapp", "core.settings.errorsyncsite": "local_moodlemobileapp", "core.settings.estimatedfreespace": "local_moodlemobileapp", "core.settings.filesystemroot": "local_moodlemobileapp", "core.settings.fontsize": "local_moodlemobileapp", "core.settings.fontsizecharacter": "block_accessibility/char", + "core.settings.forced": "message", "core.settings.forcedsetting": "local_moodlemobileapp", "core.settings.general": "moodle", "core.settings.helpusimprove": "local_moodlemobileapp", @@ -2107,7 +2215,6 @@ "core.settings.license": "moodle", "core.settings.localnotifavailable": "local_moodlemobileapp", "core.settings.locationhref": "local_moodlemobileapp", - "core.settings.locked": "admin", "core.settings.loggedin": "message", "core.settings.loggedoff": "message", "core.settings.navigatorlanguage": "local_moodlemobileapp", @@ -2125,13 +2232,13 @@ "core.settings.siteinfo": "local_moodlemobileapp", "core.settings.sites": "moodle", "core.settings.spaceusage": "local_moodlemobileapp", - "core.settings.spaceusagehelp": "local_moodlemobileapp", "core.settings.synchronization": "local_moodlemobileapp", "core.settings.synchronizenow": "local_moodlemobileapp", "core.settings.synchronizenowhelp": "local_moodlemobileapp", "core.settings.syncsettings": "local_moodlemobileapp", "core.settings.total": "moodle", "core.settings.wificonnection": "local_moodlemobileapp", + "core.settings.youradev": "local_moodlemobileapp", "core.sharedfiles.chooseaccountstorefile": "local_moodlemobileapp", "core.sharedfiles.chooseactionrepeatedfile": "local_moodlemobileapp", "core.sharedfiles.errorreceivefilenosites": "local_moodlemobileapp", @@ -2149,6 +2256,7 @@ "core.sitehome.sitehome": "moodle", "core.sitehome.sitenews": "moodle", "core.sitemaintenance": "admin", + "core.size": "moodle", "core.sizeb": "moodle", "core.sizegb": "moodle", "core.sizekb": "moodle", @@ -2158,7 +2266,7 @@ "core.sorry": "local_moodlemobileapp", "core.sort": "moodle", "core.sortby": "moodle", - "core.start": "grouptool", + "core.start": "local_moodlemobileapp", "core.storingfiles": "local_moodlemobileapp", "core.strftimedate": "langconfig", "core.strftimedatefullshort": "langconfig", @@ -2177,6 +2285,8 @@ "core.strftimetime24": "langconfig", "core.submit": "moodle", "core.success": "moodle", + "core.summary": "moodle", + "core.swipenavigationtourdescription": "local_moodlemobileapp", "core.tablet": "local_moodlemobileapp", "core.tag.defautltagcoll": "tag", "core.tag.errorareanotsupported": "local_moodlemobileapp", @@ -2203,6 +2313,7 @@ "core.toggledelete": "local_moodlemobileapp", "core.tryagain": "local_moodlemobileapp", "core.twoparagraphs": "local_moodlemobileapp", + "core.type": "repository", "core.uhoh": "local_moodlemobileapp", "core.unexpectederror": "local_moodlemobileapp", "core.unicodenotsupported": "local_moodlemobileapp", @@ -2234,26 +2345,32 @@ "core.user.participants": "moodle", "core.user.phone1": "moodle", "core.user.phone2": "moodle", + "core.user.profile": "moodle", "core.user.roles": "moodle", "core.user.sendemail": "local_moodlemobileapp", "core.user.student": "moodle/defaultcoursestudent", "core.user.teacher": "moodle/noneditingteacher", + "core.user.useraccount": "moodle", "core.user.userwithid": "local_moodlemobileapp", "core.user.webpage": "moodle", "core.userdeleted": "moodle", "core.userdetails": "moodle", + "core.usernologin": "local_moodlemobileapp", "core.usernotfullysetup": "error", "core.users": "moodle", + "core.usersuspended": "tool_reportbuilder", "core.view": "moodle", "core.viewcode": "local_moodlemobileapp", "core.vieweditor": "local_moodlemobileapp", "core.viewembeddedcontent": "local_moodlemobileapp", "core.viewprofile": "moodle", "core.warningofflinedatadeleted": "local_moodlemobileapp", + "core.warnopeninbrowser": "local_moodlemobileapp", + "core.week": "moodle", + "core.weeks": "moodle", "core.whatisyourage": "moodle", "core.wheredoyoulive": "moodle", "core.whoissiteadmin": "local_moodlemobileapp", - "core.whoops": "local_moodlemobileapp", "core.whyisthishappening": "local_moodlemobileapp", "core.whyisthisrequired": "moodle", "core.wsfunctionnotavailable": "local_moodlemobileapp", @@ -2261,5 +2378,7 @@ "core.years": "moodle", "core.yes": "moodle", "core.youreoffline": "local_moodlemobileapp", - "core.youreonline": "local_moodlemobileapp" + "core.youreonline": "local_moodlemobileapp", + "core.zoomin": "local_moodlemobileapp", + "core.zoomout": "local_moodlemobileapp" } diff --git a/scripts/print-performance-measures.js b/scripts/print-performance-measures.js new file mode 100755 index 000000000..24019b117 --- /dev/null +++ b/scripts/print-performance-measures.js @@ -0,0 +1,87 @@ +#!/usr/bin/env node + +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +const { readdirSync, readFileSync } = require('fs'); + +if (process.argv.length < 3) { + console.error('Missing measure timings storage path argument'); + process.exit(1); +} + +const performanceMeasuresStoragePath = process.argv[2].trimRight('/') + '/'; +const files = readdirSync(performanceMeasuresStoragePath); +const performanceMeasures = {}; + +if (files.length === 0) { + console.log('No logs found!'); + process.exit(0); +} + +// Aggregate data +for (const file of files) { + const performanceMeasure = JSON.parse(readFileSync(performanceMeasuresStoragePath + file)); + + performanceMeasures[performanceMeasure.name] = performanceMeasures[performanceMeasure.name] ?? { + duration: [], + scripting: [], + styling: [], + blocking: [], + longTasks: [], + database: [], + networking: [], + }; + performanceMeasures[performanceMeasure.name].duration.push(performanceMeasure.duration); + performanceMeasures[performanceMeasure.name].scripting.push(performanceMeasure.scripting); + performanceMeasures[performanceMeasure.name].styling.push(performanceMeasure.styling); + performanceMeasures[performanceMeasure.name].blocking.push(performanceMeasure.blocking); + performanceMeasures[performanceMeasure.name].longTasks.push(performanceMeasure.longTasks); + performanceMeasures[performanceMeasure.name].database.push(performanceMeasure.database); + performanceMeasures[performanceMeasure.name].networking.push(performanceMeasure.networking); +} + +// Calculate averages +for (const [name, { duration, scripting, styling, blocking, longTasks, database, networking }] of Object.entries(performanceMeasures)) { + const totalRuns = duration.length; + const averageDuration = Math.round(duration.reduce((total, duration) => total + duration) / totalRuns); + const averageScripting = Math.round(scripting.reduce((total, scripting) => total + scripting) / totalRuns); + const averageStyling = Math.round(styling.reduce((total, styling) => total + styling) / totalRuns); + const averageBlocking = Math.round(blocking.reduce((total, blocking) => total + blocking) / totalRuns); + const averageLongTasks = Math.round(longTasks.reduce((total, longTasks) => total + longTasks) / totalRuns); + const averageDatabase = Math.round(database.reduce((total, database) => total + database) / totalRuns); + const averageNetworking = Math.round(networking.reduce((total, networking) => total + networking) / totalRuns); + + performanceMeasures[name] = { + 'Total duration': `${averageDuration}ms`, + 'Scripting': `${averageScripting}ms`, + 'Styling': `${averageStyling}ms`, + 'Blocking': `${averageBlocking}ms`, + '# Network requests': averageNetworking, + '# DB Queries': averageDatabase, + '# Long Tasks': averageLongTasks, + '# runs': totalRuns, + }; +} + +// Sort tests +const tests = Object.keys(performanceMeasures).sort(); +const sortedPerformanceMeasures = {}; + +for (const test of tests) { + sortedPerformanceMeasures[test] = performanceMeasures[test]; +} + +// Display data +console.table(sortedPerformanceMeasures); diff --git a/scripts/serve.sh b/scripts/serve.sh new file mode 100755 index 000000000..393ebc86f --- /dev/null +++ b/scripts/serve.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# This script is necessary because @ionic/cli is passing one argument to the ionic:serve hook +# that is unsupported by angular cli: https://github.com/ionic-team/ionic-cli/issues/4743 +# +# Once the issue is fixed, this script can be replaced adding the following npm script: +# +# "ionic:serve": "gulp watch & NODE_OPTIONS=--max-old-space-size=4096 ng serve" +# + +# Run gulp watch. +echo "> gulp watch &" +gulp watch & + +# Remove unknown arguments and prepare angular target. +args=("$@") +angulartarget="serve" +total=${#args[@]} +for ((i=0; i NODE_OPTIONS=--max-old-space-size=4096 ng run app:$angulartarget ${args[@]}" +NODE_OPTIONS=--max-old-space-size=4096 ng run "app:$angulartarget" ${args[@]} diff --git a/scripts/templates/behat-plugin/classes/privacy/provider.php b/scripts/templates/behat-plugin/classes/privacy/provider.php new file mode 100644 index 000000000..297b4b455 --- /dev/null +++ b/scripts/templates/behat-plugin/classes/privacy/provider.php @@ -0,0 +1,32 @@ +. + +namespace local_moodleappbehat\privacy; + +use core_privacy\local\metadata\null_provider; + +defined('MOODLE_INTERNAL') || die(); + +class provider implements null_provider { + + /** + * @inheritdoc + */ + public static function get_reason() : string { + return 'privacy_metadata'; + } + +} diff --git a/scripts/templates/behat-plugin/lang/en/local_moodleappbehat.php b/scripts/templates/behat-plugin/lang/en/local_moodleappbehat.php index ba8d678e0..8a54fd660 100644 --- a/scripts/templates/behat-plugin/lang/en/local_moodleappbehat.php +++ b/scripts/templates/behat-plugin/lang/en/local_moodleappbehat.php @@ -1,3 +1,4 @@ () => { + useValue: () => { CoreContentLinksDelegate.registerHandler(AddonBadgesMyBadgesLinkHandler.instance); CoreContentLinksDelegate.registerHandler(AddonBadgesBadgeLinkHandler.instance); CoreUserDelegate.registerHandler(AddonBadgesUserHandler.instance); diff --git a/src/addons/badges/classes/user-badges-source.ts b/src/addons/badges/classes/user-badges-source.ts new file mode 100644 index 000000000..e7aac1ed7 --- /dev/null +++ b/src/addons/badges/classes/user-badges-source.ts @@ -0,0 +1,60 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Params } from '@angular/router'; +import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source'; +import { AddonBadges, AddonBadgesUserBadge } from '../services/badges'; + +/** + * Provides a collection of user badges. + */ +export class AddonBadgesUserBadgesSource extends CoreRoutedItemsManagerSource { + + readonly COURSE_ID: number; + readonly USER_ID: number; + + constructor(courseId: number, userId: number) { + super(); + + this.COURSE_ID = courseId; + this.USER_ID = userId; + } + + /** + * @inheritdoc + */ + getItemPath(badge: AddonBadgesUserBadge): string { + return badge.uniquehash; + } + + /** + * @inheritdoc + */ + getItemQueryParams(): Params { + return { + courseId: this.COURSE_ID, + userId: this.USER_ID, + }; + } + + /** + * @inheritdoc + */ + protected async loadPageItems(): Promise<{ items: AddonBadgesUserBadge[] }> { + const badges = await AddonBadges.getUserBadges(this.COURSE_ID, this.USER_ID); + + return { items: badges }; + } + +} diff --git a/src/addons/badges/lang.json b/src/addons/badges/lang.json index 6c8a2b856..26c4f835c 100644 --- a/src/addons/badges/lang.json +++ b/src/addons/badges/lang.json @@ -20,10 +20,10 @@ "issuerurl": "Issuer URL", "language": "Language", "noalignment": "This badge does not have any external skills or standards specified.", - "nobadges": "There are no badges available.", + "nobadges": "There are currently no badges available for users to earn.", "norelated": "This badge does not have any related badges.", "recipientdetails": "Recipient details", "relatedbages": "Related badges", "version": "Version", "warnexpired": "(This badge has expired!)" -} \ No newline at end of file +} diff --git a/src/addons/badges/pages/issued-badge/issued-badge.html b/src/addons/badges/pages/issued-badge/issued-badge.html index cb131d0e3..5f233087f 100644 --- a/src/addons/badges/pages/issued-badge/issued-badge.html +++ b/src/addons/badges/pages/issued-badge/issued-badge.html @@ -3,11 +3,13 @@ -

{{ badge.name }}

-

{{ 'addon.badges.badges' | translate }}

+ +

{{ badge.name }}

+

{{ 'addon.badges.badges' | translate }}

+
- + @@ -53,7 +55,9 @@

{{ 'addon.badges.contact' | translate}}

-

{{ badge.issuercontact }}

+

+ {{ badge.issuercontact }} +

@@ -97,7 +101,9 @@

{{ 'addon.badges.imageauthoremail' | translate}}

-

{{ badge.imageauthoremail }}

+

+ {{ badge.imageauthoremail }} +

@@ -153,7 +159,9 @@ -

{{ 'addon.badges.bendorsement' | translate}}

+ +

{{ 'addon.badges.bendorsement' | translate}}

+
@@ -165,7 +173,7 @@

{{ 'addon.badges.issueremail' | translate}}

- + {{ badge.endorsement.issueremail }}

@@ -200,27 +208,39 @@ -

{{ 'addon.badges.relatedbages' | translate}}

+ +

{{ 'addon.badges.relatedbages' | translate}}

+
-

{{ relatedBadge.name }}

+ +

{{ relatedBadge.name }}

+
-

{{ 'addon.badges.norelated' | translate}}

+ +

{{ 'addon.badges.norelated' | translate}}

+
-

{{ 'addon.badges.alignment' | translate}}

+ +

{{ 'addon.badges.alignment' | translate}}

+
-

{{ alignment.targetname }}

+ +

{{ alignment.targetname }}

+
-

{{ 'addon.badges.noalignment' | translate}}

+ +

{{ 'addon.badges.noalignment' | translate}}

+
diff --git a/src/addons/badges/pages/issued-badge/issued-badge.page.ts b/src/addons/badges/pages/issued-badge/issued-badge.page.ts index 038dcc365..675957abd 100644 --- a/src/addons/badges/pages/issued-badge/issued-badge.page.ts +++ b/src/addons/badges/pages/issued-badge/issued-badge.page.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { IonRefresher } from '@ionic/angular'; import { CoreTimeUtils } from '@services/utils/time'; import { CoreDomUtils } from '@services/utils/dom'; @@ -23,6 +23,9 @@ import { CoreUtils } from '@services/utils/utils'; import { CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreNavigator } from '@services/navigator'; import { ActivatedRoute } from '@angular/router'; +import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager'; +import { AddonBadgesUserBadgesSource } from '@addons/badges/classes/user-badges-source'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; /** * Page that displays the list of calendar events. @@ -31,7 +34,7 @@ import { ActivatedRoute } from '@angular/router'; selector: 'page-addon-badges-issued-badge', templateUrl: 'issued-badge.html', }) -export class AddonBadgesIssuedBadgePage implements OnInit { +export class AddonBadgesIssuedBadgePage implements OnInit, OnDestroy { protected badgeHash = ''; protected userId!: number; @@ -40,24 +43,39 @@ export class AddonBadgesIssuedBadgePage implements OnInit { user?: CoreUserProfile; course?: CoreEnrolledCourseData; badge?: AddonBadgesUserBadge; + badges: CoreSwipeNavigationItemsManager; badgeLoaded = false; currentTime = 0; - constructor( - protected route: ActivatedRoute, - ) { } + constructor(protected route: ActivatedRoute) { + this.courseId = CoreNavigator.getRouteNumberParam('courseId') || this.courseId; // Use 0 for site badges. + this.userId = CoreNavigator.getRouteNumberParam('userId') || CoreSites.getRequiredCurrentSite().getUserId(); + this.badgeHash = CoreNavigator.getRouteParam('badgeHash') || ''; + + const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonBadgesUserBadgesSource, + [this.courseId, this.userId], + ); + + this.badges = new CoreSwipeNavigationItemsManager(source); + } /** * View loaded. */ ngOnInit(): void { - this.courseId = CoreNavigator.getRouteNumberParam('courseId') || this.courseId; // Use 0 for site badges. - this.userId = CoreNavigator.getRouteNumberParam('userId') || CoreSites.getCurrentSite()!.getUserId(); - this.badgeHash = CoreNavigator.getRouteParam('badgeHash') || ''; - this.fetchIssuedBadge().finally(() => { this.badgeLoaded = true; }); + + this.badges.start(); + } + + /** + * @inheritdoc + */ + ngOnDestroy(): void { + this.badges.destroy(); } /** diff --git a/src/addons/badges/pages/user-badges/user-badges.html b/src/addons/badges/pages/user-badges/user-badges.html index a04a3e761..8b872cbea 100644 --- a/src/addons/badges/pages/user-badges/user-badges.html +++ b/src/addons/badges/pages/user-badges/user-badges.html @@ -3,7 +3,9 @@ -

{{ 'addon.badges.badges' | translate }}

+ +

{{ 'addon.badges.badges' | translate }}

+
@@ -12,8 +14,7 @@ - + diff --git a/src/addons/badges/pages/user-badges/user-badges.page.ts b/src/addons/badges/pages/user-badges/user-badges.page.ts index 1dabb74fe..31ba89d84 100644 --- a/src/addons/badges/pages/user-badges/user-badges.page.ts +++ b/src/addons/badges/pages/user-badges/user-badges.page.ts @@ -19,10 +19,11 @@ import { CoreTimeUtils } from '@services/utils/time'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreSites } from '@services/sites'; import { CoreUtils } from '@services/utils/utils'; -import { CorePageItemsListManager } from '@classes/page-items-list-manager'; -import { Params } from '@angular/router'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { CoreNavigator } from '@services/navigator'; +import { CoreListItemsManager } from '@classes/items-management/list-items-manager'; +import { AddonBadgesUserBadgesSource } from '@addons/badges/classes/user-badges-source'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; /** * Page that displays the list of calendar events. @@ -34,15 +35,23 @@ import { CoreNavigator } from '@services/navigator'; export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy { currentTime = 0; - badges: AddonBadgesUserBadgesManager; + badges: CoreListItemsManager; @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; constructor() { - const courseId = CoreNavigator.getRouteNumberParam('courseId') ?? 0; // Use 0 for site badges. + let courseId = CoreNavigator.getRouteNumberParam('courseId') ?? 0; // Use 0 for site badges. const userId = CoreNavigator.getRouteNumberParam('userId') ?? CoreSites.getCurrentSiteUserId(); - this.badges = new AddonBadgesUserBadgesManager(AddonBadgesUserBadgesPage, courseId, userId); + if (courseId === CoreSites.getCurrentSiteHomeId()) { + // Use courseId 0 for site home, otherwise the site doesn't return site badges. + courseId = 0; + } + + this.badges = new CoreListItemsManager( + CoreRoutedItemsManagerSourcesTracker.getOrCreateSource(AddonBadgesUserBadgesSource, [courseId, userId]), + AddonBadgesUserBadgesPage, + ); } /** @@ -67,8 +76,13 @@ export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy { * @param refresher Refresher. */ async refreshBadges(refresher?: IonRefresher): Promise { - await CoreUtils.ignoreErrors(AddonBadges.invalidateUserBadges(this.badges.courseId, this.badges.userId)); - await CoreUtils.ignoreErrors(this.fetchBadges()); + await CoreUtils.ignoreErrors( + AddonBadges.invalidateUserBadges( + this.badges.getSource().COURSE_ID, + this.badges.getSource().USER_ID, + ), + ); + await CoreUtils.ignoreErrors(this.badges.reload()); refresher?.complete(); } @@ -80,55 +94,12 @@ export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy { this.currentTime = CoreTimeUtils.timestamp(); try { - await this.fetchBadges(); + await this.badges.reload(); } catch (message) { CoreDomUtils.showErrorModalDefault(message, 'Error loading badges'); - this.badges.setItems([]); + this.badges.reset(); } } - /** - * Update the list of badges. - */ - private async fetchBadges(): Promise { - const badges = await AddonBadges.getUserBadges(this.badges.courseId, this.badges.userId); - - this.badges.setItems(badges); - } - -} - -/** - * Helper class to manage badges. - */ -class AddonBadgesUserBadgesManager extends CorePageItemsListManager { - - courseId: number; - userId: number; - - constructor(pageComponent: unknown, courseId: number, userId: number) { - super(pageComponent); - - this.courseId = courseId; - this.userId = userId; - } - - /** - * @inheritdoc - */ - protected getItemPath(badge: AddonBadgesUserBadge): string { - return badge.uniquehash; - } - - /** - * @inheritdoc - */ - protected getItemQueryParams(): Params { - return { - courseId: this.courseId, - userId: this.userId, - }; - } - } diff --git a/src/addons/badges/services/badges.ts b/src/addons/badges/services/badges.ts index a807534a7..df39a9595 100644 --- a/src/addons/badges/services/badges.ts +++ b/src/addons/badges/services/badges.ts @@ -39,7 +39,7 @@ export class AddonBadgesProvider { async isPluginEnabled(siteId?: string): Promise { const site = await CoreSites.getSite(siteId); - return site.canUseAdvancedFeature('enablebadges') && site.wsAvailable('core_course_get_user_navigation_options'); + return site.canUseAdvancedFeature('enablebadges'); } /** @@ -83,7 +83,7 @@ export class AddonBadgesProvider { badge.alignment = badge.alignment || badge.competencies; // Check that the alignment is valid, they were broken in 3.7. - if (badge.alignment && badge.alignment[0] && typeof badge.alignment[0].targetname == 'undefined') { + if (badge.alignment && badge.alignment[0] && badge.alignment[0].targetname === undefined) { // If any badge lacks targetname it means they are affected by the Moodle bug, don't display them. delete badge.alignment; } @@ -194,7 +194,7 @@ export type AddonBadgesUserBadge = { targetframework?: string; // Target framework. targetcode?: string; // Target code. }[]; - competencies?: { // @deprecated from 3.7. @since 3.6. In 3.7 it was renamed to alignment. + competencies?: { // @deprecatedonmoodle from 3.7. @since 3.6. In 3.7 it was renamed to alignment. id?: number; // Alignment id. badgeid?: number; // Badge id. targetname?: string; // Target name. diff --git a/src/addons/badges/services/handlers/user.ts b/src/addons/badges/services/handlers/user.ts index 52e44fb69..f9f357ce2 100644 --- a/src/addons/badges/services/handlers/user.ts +++ b/src/addons/badges/services/handlers/user.ts @@ -14,8 +14,14 @@ import { Injectable } from '@angular/core'; import { CoreCourseUserAdminOrNavOptionIndexed } from '@features/courses/services/courses'; -import { CoreUserDelegateService, CoreUserProfileHandler, CoreUserProfileHandlerData } from '@features/user/services/user-delegate'; +import { + CoreUserDelegateContext, + CoreUserDelegateService, + CoreUserProfileHandler, + CoreUserProfileHandlerData, +} from '@features/user/services/user-delegate'; import { CoreNavigator } from '@services/navigator'; +import { CoreSites } from '@services/sites'; import { makeSingleton } from '@singletons'; import { AddonBadges } from '../badges'; @@ -25,52 +31,58 @@ import { AddonBadges } from '../badges'; @Injectable({ providedIn: 'root' }) export class AddonBadgesUserHandlerService implements CoreUserProfileHandler { - name = 'AddonBadges'; - priority = 50; + name = 'AddonBadges:fakename'; // This name doesn't match any disabled feature, they'll be checked in isEnabledForContext. + priority = 300; type = CoreUserDelegateService.TYPE_NEW_PAGE; /** - * Check if handler is enabled. - * - * @return Always enabled. + * @inheritdoc */ isEnabled(): Promise { return AddonBadges.isPluginEnabled(); } /** - * Check if handler is enabled for this user in this context. - * - * @param courseId Course ID. - * @param navOptions Course navigation options for current user. See CoreCoursesProvider.getUserNavigationOptions. - * @return True if enabled, false otherwise. + * @inheritdoc */ - async isEnabledForCourse( + async isEnabledForContext( + context: CoreUserDelegateContext, courseId: number, navOptions?: CoreCourseUserAdminOrNavOptionIndexed, ): Promise { - if (navOptions && typeof navOptions.badges != 'undefined') { + // Check if feature is disabled. + const currentSite = CoreSites.getCurrentSite(); + if (!currentSite) { + return false; + } + + if (context === CoreUserDelegateContext.USER_MENU) { + if (currentSite.isFeatureDisabled('CoreUserDelegate_AddonBadges:account')) { + return false; + } + } else if (currentSite.isFeatureDisabled('CoreUserDelegate_AddonBadges')) { + return false; + } + + if (navOptions && navOptions.badges !== undefined) { return navOptions.badges; } - // If we reach here, it means we are opening the user site profile. return true; } /** - * Returns the data needed to render the handler. - * - * @return Data needed to render the handler. + * @inheritdoc */ getDisplayData(): CoreUserProfileHandlerData { return { icon: 'fas-trophy', title: 'addon.badges.badges', - action: (event, user, courseId): void => { + action: (event, user, context, contextId): void => { event.preventDefault(); event.stopPropagation(); CoreNavigator.navigateToSitePath('/badges', { - params: { courseId, userId: user.id }, + params: { courseId: contextId, userId: user.id }, }); }, }; diff --git a/src/addons/block/activitymodules/components/activitymodules/activitymodules.scss b/src/addons/block/activitymodules/components/activitymodules/activitymodules.scss new file mode 100644 index 000000000..21ce02313 --- /dev/null +++ b/src/addons/block/activitymodules/components/activitymodules/activitymodules.scss @@ -0,0 +1,13 @@ +:host { + --mod-icon-filter: brightness(0); + + core-mod-icon { + background: transparent; + margin: 0; + --filter: var(--mod-icon-filter); + } +} + +:host-context(body.dark) { + --mod-icon-filter: brightness(0) invert(1); +} diff --git a/src/addons/block/activitymodules/components/activitymodules/activitymodules.ts b/src/addons/block/activitymodules/components/activitymodules/activitymodules.ts index c377040b5..9b9a2f2bb 100644 --- a/src/addons/block/activitymodules/components/activitymodules/activitymodules.ts +++ b/src/addons/block/activitymodules/components/activitymodules/activitymodules.ts @@ -21,6 +21,7 @@ import { ContextLevel, CoreConstants } from '@/core/constants'; import { Translate } from '@singletons'; import { CoreUtils } from '@services/utils/utils'; import { CoreNavigator } from '@services/navigator'; +import { CoreCourseHelper } from '@features/course/services/course-helper'; /** * Component to render an "activity modules" block. @@ -28,6 +29,7 @@ import { CoreNavigator } from '@services/navigator'; @Component({ selector: 'addon-block-activitymodules', templateUrl: 'addon-block-activitymodules.html', + styleUrls: ['activitymodules.scss'], }) export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent implements OnInit { @@ -66,14 +68,14 @@ export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent i } section.modules.forEach((mod) => { - if (mod.uservisible === false || !CoreCourse.moduleHasView(mod) || - typeof modFullNames[mod.modname] != 'undefined') { + if (!CoreCourseHelper.canUserViewModule(mod, section) || !CoreCourse.moduleHasView(mod) || + modFullNames[mod.modname] !== undefined) { // Ignore this module. return; } // Get the archetype of the module type. - if (typeof archetypes[mod.modname] == 'undefined') { + if (archetypes[mod.modname] === undefined) { archetypes[mod.modname] = CoreCourseModuleDelegate.supportsFeature( mod.modname, CoreConstants.FEATURE_MOD_ARCHETYPE, @@ -96,16 +98,13 @@ export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent i // Sort the modnames alphabetically. modFullNames = CoreUtils.sortValues(modFullNames); for (const modName in modFullNames) { - let icon: string; + const iconModName = modName === 'resources' ? 'page' : modName; - if (modName === 'resources') { - icon = CoreCourse.getModuleIconSrc('page', modIcons['page']); - } else { - icon = CoreCourseModuleDelegate.getModuleIconSrc(modName, modIcons[modName]) || ''; - } + const icon = await CoreCourseModuleDelegate.getModuleIconSrc(iconModName, modIcons[iconModName]); this.entries.push({ - icon: icon, + icon, + iconModName, name: modFullNames[modName], modName, }); @@ -145,4 +144,5 @@ type AddonBlockActivityModuleEntry = { icon: string; name: string; modName: string; + iconModName: string; }; diff --git a/src/addons/block/activitymodules/components/activitymodules/addon-block-activitymodules.html b/src/addons/block/activitymodules/components/activitymodules/addon-block-activitymodules.html index 1f39261b4..b4f800003 100644 --- a/src/addons/block/activitymodules/components/activitymodules/addon-block-activitymodules.html +++ b/src/addons/block/activitymodules/components/activitymodules/addon-block-activitymodules.html @@ -1,12 +1,12 @@ -

{{ 'addon.block_activitymodules.pluginname' | translate }}

+

{{ 'addon.block_activitymodules.pluginname' | translate }}

- - - + + + + {{ entry.name }} diff --git a/src/addons/block/activityresults/components/activityresults/activityresults.scss b/src/addons/block/activityresults/components/activityresults/activityresults.scss index 40e29efef..b1442e17c 100644 --- a/src/addons/block/activityresults/components/activityresults/activityresults.scss +++ b/src/addons/block/activityresults/components/activityresults/activityresults.scss @@ -21,7 +21,7 @@ text-align: start; padding-top: .75rem; padding-bottom: .75rem; - color: var(--gray-darker); + color: var(--medium); font-weight: bold; font-size: 18px; } diff --git a/src/addons/block/badges/components/badges/badges.scss b/src/addons/block/badges/components/badges/badges.scss index 5ca9725d5..539340b70 100644 --- a/src/addons/block/badges/components/badges/badges.scss +++ b/src/addons/block/badges/components/badges/badges.scss @@ -1,21 +1,42 @@ -:host .core-block-content ::ng-deep { - ul.badges { - list-style: none; - margin-left: 0; - margin-right: 0; - -webkit-padding-start: 0; +:host { + --badge-size: 100px; + --badge-container-size: 150px; - li { - position: relative; - display: inline-block; - padding-top: 1em; - text-align: center; - vertical-align: top; - width: 150px; + .core-block-content ::ng-deep { - .badge-name { - display: block; - padding: 5px; + ul.badges { + list-style: none; + margin: 0; + + li { + position: relative; + display: inline-block; + text-align: center; + margin-top: 1em; + vertical-align: top; + width: var(--badge-container-size); + + .badge-name { + display: block; + padding: 5px; + } + .badge-image { + width: var(--badge-size); + } + + .expireimage { + content: 'expired'; + background-image: url('/assets/img/expired.svg'); + background-repeat: no-repeat; + background-size: var(--badge-size) var(--badge-size); + width: var(--badge-size); + height: var(--badge-size); + left: calc((var(--badge-container-size) - var(--badge-size)) /2); + top: 0; + position: absolute; + z-index: 2; + opacity: .85; + } } } } diff --git a/src/addons/block/block.module.ts b/src/addons/block/block.module.ts index fb0db615c..98738faf6 100644 --- a/src/addons/block/block.module.ts +++ b/src/addons/block/block.module.ts @@ -24,6 +24,7 @@ import { AddonBlockCalendarMonthModule } from './calendarmonth/calendarmonth.mod import { AddonBlockCalendarUpcomingModule } from './calendarupcoming/calendarupcoming.module'; import { AddonBlockCommentsModule } from './comments/comments.module'; import { AddonBlockCompletionStatusModule } from './completionstatus/completionstatus.module'; +import { AddonBlockCourseListModule } from './courselist/courselist.module'; import { AddonBlockGlossaryRandomModule } from './glossaryrandom/glossaryrandom.module'; import { AddonBlockHtmlModule } from './html/html.module'; import { AddonBlockLearningPlansModule } from './learningplans/learningplans.module'; @@ -53,6 +54,7 @@ import { AddonBlockTimelineModule } from './timeline/timeline.module'; AddonBlockCalendarUpcomingModule, AddonBlockCommentsModule, AddonBlockCompletionStatusModule, + AddonBlockCourseListModule, AddonBlockGlossaryRandomModule, AddonBlockHtmlModule, AddonBlockLearningPlansModule, diff --git a/src/addons/block/blogtags/components/blogtags/blogtags.scss b/src/addons/block/blogtags/components/blogtags/blogtags.scss index 75f3917dd..9554c90a9 100644 --- a/src/addons/block/blogtags/components/blogtags/blogtags.scss +++ b/src/addons/block/blogtags/components/blogtags/blogtags.scss @@ -1,9 +1,7 @@ :host .core-block-content ::ng-deep { ul.inline-list { - font-size: 80%; list-style: none; - margin-left: 0; - margin-right: 0; + margin: 0; -webkit-padding-start: 0; li { @@ -11,8 +9,8 @@ display: inline-block; a { - background: var(--ion-color-primary); - color: var(--ion-color-primary-contrast); + background: var(--primary); + color: var(--primary-contrast); padding: 3px 8px; -webkit-font-smoothing: antialiased; display: inline-block; @@ -24,7 +22,7 @@ contain: content; vertical-align: baseline; text-decoration: none; - border-radius: 4px; + border-radius: var(--small-radius); } .s20 { font-size: 1.5em; diff --git a/src/addons/block/calendarmonth/services/block-handler.ts b/src/addons/block/calendarmonth/services/block-handler.ts index bf557dbdc..a29e04ba9 100644 --- a/src/addons/block/calendarmonth/services/block-handler.ts +++ b/src/addons/block/calendarmonth/services/block-handler.ts @@ -16,10 +16,10 @@ import { Injectable } from '@angular/core'; import { CoreBlockHandlerData } from '@features/block/services/block-delegate'; import { CoreBlockOnlyTitleComponent } from '@features/block/components/only-title-block/only-title-block'; import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler'; -import { AddonCalendar } from '@/addons/calendar/services/calendar'; import { CoreCourseBlock } from '@features/course/services/course'; import { Params } from '@angular/router'; import { makeSingleton } from '@singletons'; +import { AddonCalendarMainMenuHandlerService } from '@addons/calendar/services/handlers/mainmenu'; /** * Block handler. @@ -45,7 +45,7 @@ export class AddonBlockCalendarMonthHandlerService extends CoreBlockBaseHandler title: 'addon.block_calendarmonth.pluginname', class: 'addon-block-calendar-month', component: CoreBlockOnlyTitleComponent, - link: AddonCalendar.getMainCalendarPagePath(), + link: AddonCalendarMainMenuHandlerService.PAGE_NAME, linkParams: linkParams, navOptions: { preferCurrentTab: false, diff --git a/src/addons/block/calendarupcoming/services/block-handler.ts b/src/addons/block/calendarupcoming/services/block-handler.ts index 4820df1f0..ee59a8ed0 100644 --- a/src/addons/block/calendarupcoming/services/block-handler.ts +++ b/src/addons/block/calendarupcoming/services/block-handler.ts @@ -16,10 +16,11 @@ import { Injectable } from '@angular/core'; import { CoreBlockHandlerData } from '@features/block/services/block-delegate'; import { CoreBlockOnlyTitleComponent } from '@features/block/components/only-title-block/only-title-block'; import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler'; -import { AddonCalendar } from '@/addons/calendar/services/calendar'; import { CoreCourseBlock } from '@features/course/services/course'; import { Params } from '@angular/router'; import { makeSingleton } from '@singletons'; +import { AddonCalendarMainMenuHandlerService } from '@addons/calendar/services/handlers/mainmenu'; +import { CoreSites } from '@services/sites'; /** * Block handler. @@ -39,18 +40,18 @@ export class AddonBlockCalendarUpcomingHandlerService extends CoreBlockBaseHandl * @return Data or promise resolved with the data. */ getDisplayData(block: CoreCourseBlock, contextLevel: string, instanceId: number): CoreBlockHandlerData { - const linkParams: Params = contextLevel == 'course' ? { courseId: instanceId } : {}; - linkParams.upcoming = true; + const linkParams: Params = { upcoming: true }; + + if (contextLevel == 'course' && instanceId !== CoreSites.getCurrentSiteHomeId()) { + linkParams.courseId = instanceId; + } return { title: 'addon.block_calendarupcoming.pluginname', class: 'addon-block-calendar-upcoming', component: CoreBlockOnlyTitleComponent, - link: AddonCalendar.getMainCalendarPagePath(), + link: AddonCalendarMainMenuHandlerService.PAGE_NAME, linkParams: linkParams, - navOptions: { - preferCurrentTab: false, - }, }; } diff --git a/src/addons/block/courselist/courselist.module.ts b/src/addons/block/courselist/courselist.module.ts new file mode 100644 index 000000000..e8ae2b06e --- /dev/null +++ b/src/addons/block/courselist/courselist.module.ts @@ -0,0 +1,36 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { APP_INITIALIZER, NgModule } from '@angular/core'; +import { IonicModule } from '@ionic/angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreBlockDelegate } from '@features/block/services/block-delegate'; +import { AddonBlockCourseListHandler } from './services/block-handler'; + +@NgModule({ + imports: [ + IonicModule, + TranslateModule.forChild(), + ], + providers: [ + { + provide: APP_INITIALIZER, + multi: true, + useValue: () => { + CoreBlockDelegate.registerHandler(AddonBlockCourseListHandler.instance); + }, + }, + ], +}) +export class AddonBlockCourseListModule {} diff --git a/src/addons/block/courselist/services/block-handler.ts b/src/addons/block/courselist/services/block-handler.ts new file mode 100644 index 000000000..fc4841f8f --- /dev/null +++ b/src/addons/block/courselist/services/block-handler.ts @@ -0,0 +1,49 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { CoreBlockHandlerData } from '@features/block/services/block-delegate'; +import { CoreBlockOnlyTitleComponent } from '@features/block/components/only-title-block/only-title-block'; +import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler'; +import { makeSingleton } from '@singletons'; + +/** + * Block handler. + */ +@Injectable({ providedIn: 'root' }) +export class AddonBlockCourseListHandlerService extends CoreBlockBaseHandler { + + name = 'AddonBlockCourseList'; + blockName = 'course_list'; + + /** + * @inheritdoc + */ + getDisplayData(): CoreBlockHandlerData { + + return { + title: 'core.courses.mycourses', + class: 'addon-block-course-list', + component: CoreBlockOnlyTitleComponent, + link: 'courses/list', + linkParams: { mode: 'my' }, + navOptions: { + preferCurrentTab: false, + }, + }; + } + +} + +export const AddonBlockCourseListHandler = makeSingleton(AddonBlockCourseListHandlerService); diff --git a/src/addons/block/learningplans/services/block-handler.ts b/src/addons/block/learningplans/services/block-handler.ts index 2ab12f1a1..ca4caa9e3 100644 --- a/src/addons/block/learningplans/services/block-handler.ts +++ b/src/addons/block/learningplans/services/block-handler.ts @@ -17,7 +17,7 @@ import { CoreBlockHandlerData } from '@features/block/services/block-delegate'; import { CoreBlockOnlyTitleComponent } from '@features/block/components/only-title-block/only-title-block'; import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler'; import { makeSingleton } from '@singletons'; -import { AddonCompetencyMainMenuHandlerService } from '@addons/competency/services/handlers/mainmenu'; +import { ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/competency.module'; /** * Block handler. @@ -38,7 +38,7 @@ export class AddonBlockLearningPlansHandlerService extends CoreBlockBaseHandler title: 'addon.block_learningplans.pluginname', class: 'addon-block-learning-plans', component: CoreBlockOnlyTitleComponent, - link: AddonCompetencyMainMenuHandlerService.PAGE_NAME, + link: ADDON_COMPETENCY_LEARNING_PLANS_PAGE, navOptions: { preferCurrentTab: false, }, diff --git a/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html b/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html index b6e750c9f..233d107de 100644 --- a/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html +++ b/src/addons/block/myoverview/components/myoverview/addon-block-myoverview.html @@ -4,97 +4,132 @@
-
- -
- -
- - - - {{ 'addon.block_myoverview.allincludinghidden' | translate }} - - - {{ 'addon.block_myoverview.all' | translate }} - - - {{ 'addon.block_myoverview.inprogress' | translate }} - - - {{ 'addon.block_myoverview.future' | translate }} - - - {{ 'addon.block_myoverview.past' | translate }} - - - - {{ customOption.name }} + + + + + + + + + + + + + + {{ 'addon.block_myoverview.allincludinghidden' | translate }} + + + {{ 'addon.block_myoverview.all' | translate }} + + + {{ 'addon.block_myoverview.inprogress' | translate }} + + + {{ 'addon.block_myoverview.future' | translate }} + + + {{ 'addon.block_myoverview.past' | translate }} + + + + + {{ customOption.name }} + - - - {{ 'addon.block_myoverview.favourites' | translate }} - - - {{ 'addon.block_myoverview.hiddencourses' | translate }} - - -
+ + {{ 'addon.block_myoverview.favourites' | translate }} + + + {{ 'addon.block_myoverview.hiddencourses' | translate }} + + + + + + + + + + + + {{'addon.block_myoverview.title' | translate}} + + + {{'addon.block_myoverview.shortname' | translate}} + + + {{'addon.block_myoverview.lastaccessed' | translate}} + + + + + + + + + + + + - - - - - + +

+ {{'addon.block_myoverview.noresult' | translate}} +

+

+ {{'addon.block_myoverview.nocoursesenrolled' | translate}} +

+ +

+ {{'addon.block_myoverview.noresultdescription' | translate}} +

+

+ {{'addon.block_myoverview.nocoursesenrolleddescription' | translate}} +

+ + + {{'addon.block_myoverview.browseallcourses' | translate}} + +
-
- +
+ - - - + + + diff --git a/src/addons/block/myoverview/components/myoverview/myoverview.scss b/src/addons/block/myoverview/components/myoverview/myoverview.scss new file mode 100644 index 000000000..37df6ca93 --- /dev/null +++ b/src/addons/block/myoverview/components/myoverview/myoverview.scss @@ -0,0 +1,48 @@ +:host { + ion-row.addon-block-myoverview-filter { + margin: 8px; + padding: 0; + + ion-col { + padding: 0; + margin-right: 2px; + margin-left: 2px; + } + + ion-button, + core-combobox ::ng-deep ion-button { + --border-width: 0; + --a11y-min-target-size: 40px; + margin: 0; + + .select-icon { + display: none; + } + ion-icon { + font-size: 20px; + } + } + + core-combobox ::ng-deep ion-select { + margin: 0; + --a11y-min-target-size: 40px; + } + + ion-searchbar { + padding: 0; + --height: 40px; + } + } + + core-empty-box { + .item-heading { + font-weight: bold; + margin-bottom: 0; + font-size: 16px; + } + + .subdued { + color: var(--subdued-text-color); + } + } +} diff --git a/src/addons/block/myoverview/components/myoverview/myoverview.ts b/src/addons/block/myoverview/components/myoverview/myoverview.ts index d6a41958a..8ca110b87 100644 --- a/src/addons/block/myoverview/components/myoverview/myoverview.ts +++ b/src/addons/block/myoverview/components/myoverview/myoverview.ts @@ -12,12 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, Input, OnDestroy, ViewChild, OnChanges, SimpleChange } from '@angular/core'; -import { IonSearchbar } from '@ionic/angular'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreTimeUtils } from '@services/utils/time'; -import { CoreSites } from '@services/sites'; -import { CoreCoursesProvider, CoreCourses } from '@features/courses/services/courses'; +import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; +import { CoreCoursesProvider, CoreCourses, CoreCoursesMyCoursesUpdatedEventData } from '@features/courses/services/courses'; import { CoreCoursesHelper, CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper'; import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; @@ -26,9 +25,12 @@ import { CoreSite } from '@classes/site'; import { CoreUtils } from '@services/utils/utils'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreTextUtils } from '@services/utils/text'; -import { AddonCourseCompletion } from '@/addons/coursecompletion/services/coursecompletion'; +import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; +import { IonSearchbar } from '@ionic/angular'; +import { CoreNavigator } from '@services/navigator'; -const FILTER_PRIORITY = ['all', 'allincludinghidden', 'inprogress', 'future', 'past', 'favourite', 'hidden', 'custom']; +const FILTER_PRIORITY: AddonBlockMyOverviewTimeFilters[] = + ['all', 'inprogress', 'future', 'past', 'favourite', 'allincludinghidden', 'hidden']; /** * Component to render a my overview block. @@ -36,154 +38,120 @@ const FILTER_PRIORITY = ['all', 'allincludinghidden', 'inprogress', 'future', 'p @Component({ selector: 'addon-block-myoverview', templateUrl: 'addon-block-myoverview.html', + styleUrls: ['myoverview.scss'], }) -export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implements OnInit, OnChanges, OnDestroy { +export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implements OnInit, OnDestroy { - @ViewChild('searchbar') searchbar?: IonSearchbar; - @Input() downloadEnabled = false; - - courses = { - filter: '', - all: [], - allincludinghidden: [], - past: [], - inprogress: [], - future: [], - favourite: [], - hidden: [], - custom: [], // Leave it empty to avoid download all those courses. - }; - - customFilter: { - name: string; - value: string; - }[] = []; - - selectedFilter = 'inprogress'; - sort = 'fullname'; - currentSite?: CoreSite; filteredCourses: CoreEnrolledCourseDataWithOptions[] = []; - prefetchCoursesData = { - all: { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }, - allincludinghidden: { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }, - inprogress: { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }, - past: { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }, - future: { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }, - favourite: { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }, - hidden: { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }, - custom: { - icon: '', - statusTranslatable: '', - status: '', - loading: false, - }, // Leave it empty to avoid download all those courses. + + prefetchCoursesData: CorePrefetchStatusInfo = { + icon: '', + statusTranslatable: 'core.loading', + status: '', + loading: true, }; - showFilters = { // Options are show, disabled, hidden. - all: 'show', - allincludinghidden: 'show', - past: 'show', - inprogress: 'show', - future: 'show', - favourite: 'show', - hidden: 'show', - custom: 'hidden', - }; - - showFilter = false; - showSelectorFilter = false; - showSortFilter = false; downloadCourseEnabled = false; downloadCoursesEnabled = false; - showSortByShortName = false; + filters: AddonBlockMyOverviewFilterOptions = { + enabled: false, + show: { // Options are visible, disabled, hidden. + allincludinghidden: true, + all: true, + past: true, + inprogress: true, + future: true, + favourite: true, + hidden: true, + custom: false, + }, + timeFilterSelected: 'inprogress', + customFilters: [], + }; + + isLayoutSwitcherAvailable = false; + layout: AddonBlockMyOverviewLayouts = 'list'; + + sort: AddonBlockMyOverviewSortOptions = { + shortnameEnabled: false, + selected: 'fullname', + enabled: false, + }; + + textFilter = ''; + hasCourses = false; + searchEnabled = false; + + protected currentSite!: CoreSite; + protected allCourses: CoreEnrolledCourseDataWithOptions[] = []; protected prefetchIconsInitialized = false; protected isDestroyed = false; protected coursesObserver?: CoreEventObserver; protected updateSiteObserver?: CoreEventObserver; - protected courseIds: number[] = []; protected fetchContentDefaultError = 'Error getting my overview data.'; + protected gradePeriodAfter = 0; + protected gradePeriodBefore = 0; + protected today = 0; constructor() { super('AddonBlockMyOverviewComponent'); } /** - * Component being initialized. + * @inheritdoc */ async ngOnInit(): Promise { // Refresh the enabled flags if enabled. this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); this.downloadCoursesEnabled = !CoreCourses.isDownloadCoursesDisabledInSite(); + this.searchEnabled = !CoreCourses.isSearchCoursesDisabledInSite(); // Refresh the enabled flags if site is updated. this.updateSiteObserver = CoreEvents.on(CoreEvents.SITE_UPDATED, () => { this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); this.downloadCoursesEnabled = !CoreCourses.isDownloadCoursesDisabledInSite(); - + this.searchEnabled = !CoreCourses.isSearchCoursesDisabledInSite(); }, CoreSites.getCurrentSiteId()); this.coursesObserver = CoreEvents.on( CoreCoursesProvider.EVENT_MY_COURSES_UPDATED, (data) => { - - if (data.action == CoreCoursesProvider.ACTION_ENROL || data.action == CoreCoursesProvider.ACTION_STATE_CHANGED) { - this.refreshCourseList(); - } + this.refreshCourseList(data); }, CoreSites.getCurrentSiteId(), ); - this.currentSite = CoreSites.getCurrentSite(); + this.currentSite = CoreSites.getRequiredCurrentSite(); const promises: Promise[] = []; - if (this.currentSite) { - promises.push(this.currentSite.getLocalSiteConfig('AddonBlockMyOverviewSort', this.sort).then((value) => { - this.sort = value; - return; - })); - promises.push(this.currentSite.getLocalSiteConfig('AddonBlockMyOverviewFilter', this.selectedFilter).then((value) => { - this.selectedFilter = value; + promises.push(this.currentSite.getLocalSiteConfig( + 'AddonBlockMyOverviewSort', + this.sort.selected, + ).then((value) => { + this.sort.selected = value; - return; - })); - } + return; + })); + + promises.push(this.currentSite.getLocalSiteConfig( + 'AddonBlockMyOverviewLayout', + this.layout, + ).then((value) => { + this.layout = value; + + return; + })); + + promises.push(this.currentSite.getLocalSiteConfig( + 'AddonBlockMyOverviewFilter', + this.filters.timeFilterSelected, + ).then((value) => { + this.filters.timeFilterSelected = value; + + return; + })); Promise.all(promises).finally(() => { super.ngOnInit(); @@ -191,31 +159,44 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem } /** - * Detect changes on input properties. + * @inheritdoc */ - ngOnChanges(changes: {[name: string]: SimpleChange}): void { - if (changes.downloadEnabled && !changes.downloadEnabled.previousValue && this.downloadEnabled && this.loaded) { - // Download all courses is enabled now, initialize it. - this.initPrefetchCoursesIcons(); - } + protected async invalidateContent(): Promise { + const courseIds = this.allCourses.map((course) => course.id); + + await this.invalidateCourses(courseIds); } /** - * Perform the invalidate content function. + * Invalidate list of courses. * - * @return Resolved when done. + * @return Promise resolved when done. */ - protected async invalidateContent(): Promise { + protected invalidateCourseList(): Promise { + return CoreCourses.invalidateUserCourses(); + } + + /** + * Helper function to invalidate only selected courses. + * + * @param courseIds Course Id array. + * @return Promise resolved when done. + */ + protected async invalidateCourses(courseIds: number[]): Promise { const promises: Promise[] = []; // Invalidate course completion data. - promises.push(CoreCourses.invalidateUserCourses().finally(() => - CoreUtils.allPromises(this.courseIds.map((courseId) => + promises.push(this.invalidateCourseList().finally(() => + CoreUtils.allPromises(courseIds.map((courseId) => AddonCourseCompletion.invalidateCourseCompletion(courseId))))); - promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions()); - if (this.courseIds.length > 0) { - promises.push(CoreCourses.invalidateCoursesByField('ids', this.courseIds.join(','))); + if (courseIds.length == 1) { + promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions(courseIds[0])); + } else { + promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions()); + } + if (courseIds.length > 0) { + promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(','))); } await CoreUtils.allPromises(promises).finally(() => { @@ -224,156 +205,199 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem } /** - * Fetch the courses for my overview. - * - * @return Promise resolved when done. + * @inheritdoc */ - protected async fetchContent(): Promise { - const config = this.block.configsRecord || {}; + protected async fetchContent(refresh?: boolean): Promise { + const config = this.block.configsRecord; const showCategories = config?.displaycategories?.value == '1'; - const courses = await CoreCoursesHelper.getUserCoursesWithOptions(this.sort, undefined, undefined, showCategories); + this.allCourses = await CoreCoursesHelper.getUserCoursesWithOptions( + this.sort.selected, + undefined, + undefined, + showCategories, + { + readingStrategy: refresh ? CoreSitesReadingStrategy.PREFER_NETWORK : undefined, + }, + ); + + this.hasCourses = this.allCourses.length > 0; + + try { + this.gradePeriodAfter = parseInt(await this.currentSite.getConfig('coursegraceperiodafter', refresh), 10); + this.gradePeriodBefore = parseInt(await this.currentSite.getConfig('coursegraceperiodbefore', refresh), 10); + } catch { + this.gradePeriodAfter = 0; + this.gradePeriodBefore = 0; + } + + this.loadSort(); + this.loadLayouts(config?.layouts?.value.split(',')); + this.loadFilters(config); + } + + /** + * Load sort. + */ + protected loadSort(): void { + const sampleCourse = this.allCourses[0]; // Check to show sort by short name only if the text is visible. - if (courses.length > 0) { - const sampleCourse = courses[0]; - this.showSortByShortName = !!sampleCourse.displayname && !!sampleCourse.shortname && - sampleCourse.fullname != sampleCourse.displayname; - } + this.sort.shortnameEnabled = !!sampleCourse?.displayname && !!sampleCourse?.shortname && + sampleCourse?.fullname != sampleCourse?.displayname; // Rollback to sort by full name if user is sorting by short name then Moodle web change the config. - if (!this.showSortByShortName && this.sort === 'shortname') { - this.switchSort('fullname'); + if (!this.sort.shortnameEnabled && this.sort.selected === 'shortname') { + this.saveSort('fullname'); } - this.courseIds = courses.map((course) => course.id); - - this.showSortFilter = courses.length > 0 && typeof courses[0].lastaccess != 'undefined'; - - this.initCourseFilters(courses); - - this.courses.filter = ''; - this.showFilter = false; - - this.showFilters.all = this.getShowFilterValue( - !config || config.displaygroupingall?.value == '1', - this.courses.all.length === 0, - ); - // Do not show allincludinghiddenif config it's not present (before 3.8). - this.showFilters.allincludinghidden = - this.getShowFilterValue( - config?.displaygroupingallincludinghidden?.value == '1', - this.courses.allincludinghidden.length === 0, - ); - - this.showFilters.inprogress = this.getShowFilterValue( - !config || config.displaygroupinginprogress?.value == '1', - this.courses.inprogress.length === 0, - ); - this.showFilters.past = this.getShowFilterValue( - !config || config.displaygroupingpast?.value == '1', - this.courses.past.length === 0, - ); - this.showFilters.future = this.getShowFilterValue( - !config || config.displaygroupingfuture?.value == '1', - this.courses.future.length === 0, - ); - - this.showSelectorFilter = courses.length > 0 && (this.courses.past.length > 0 || this.courses.future.length > 0 || - typeof courses[0].enddate != 'undefined'); - - this.showFilters.hidden = this.getShowFilterValue( - this.showSelectorFilter && typeof courses[0].hidden != 'undefined' && - (!config || config.displaygroupinghidden?.value == '1'), - this.courses.hidden.length === 0, - ); - - this.showFilters.favourite = this.getShowFilterValue( - this.showSelectorFilter && typeof courses[0].isfavourite != 'undefined' && - (!config || config.displaygroupingstarred?.value == '1' || config.displaygroupingfavourites?.value == '1'), - this.courses.favourite.length === 0, - ); - - this.showFilters.custom = this.getShowFilterValue( - this.showSelectorFilter && config?.displaygroupingcustomfield?.value == '1' && !!config?.customfieldsexport?.value, - false, - ); - if (this.showFilters.custom == 'show') { - this.customFilter = CoreTextUtils.parseJSON(config?.customfieldsexport?.value, []); - } else { - this.customFilter = []; - } - - if (this.showSelectorFilter) { - // Check if any selector is shown and not disabled. - this.showSelectorFilter = Object.keys(this.showFilters).some((key) => this.showFilters[key] == 'show'); - - if (!this.showSelectorFilter) { - // All filters disabled, display all the courses. - this.showFilters.all = 'show'; - } - } - - if (!this.showSelectorFilter) { - // No selector, display all the courses. - this.selectedFilter = 'all'; - } - this.setCourseFilter(this.selectedFilter); - - this.initPrefetchCoursesIcons(); + this.sort.enabled = sampleCourse?.lastaccess !== undefined; } /** - * Helper function to help with filter values. + * Load filters. * - * @param showCondition If true, filter will be shown. - * @param disabledCondition If true, and showCondition is also met, it will be shown as disabled. - * @return show / disabled / hidden value. + * @param config Block configuration. */ - protected getShowFilterValue(showCondition: boolean, disabledCondition: boolean): string { - return showCondition ? (disabledCondition ? 'disabled' : 'show') : 'hidden'; + protected loadFilters( + config?: Record, + ): void { + if (!this.hasCourses) { + return; + } + + this.textFilter = ''; + + const sampleCourse = this.allCourses[0]; + + // Do not show hidden if config it's not present (before 3.8) but if hidden is enabled. + this.filters.show.hidden = + config?.displaygroupingallincludinghidden?.value == '1' || + sampleCourse.hidden !== undefined && (!config || config.displaygroupinghidden?.value == '1'); + + this.filters.show.allincludinghidden = !config || config.displaygroupingallincludinghidden?.value == '1'; + this.filters.show.all = !config || config.displaygroupingall?.value == '1'; + this.filters.show.inprogress = !config || config.displaygroupinginprogress?.value == '1'; + this.filters.show.past = !config || config.displaygroupingpast?.value == '1'; + this.filters.show.future = !config || config.displaygroupingfuture?.value == '1'; + + this.filters.show.favourite = sampleCourse.isfavourite !== undefined && + (!config || config.displaygroupingstarred?.value == '1' || config.displaygroupingfavourites?.value == '1'); + + this.filters.show.custom = config?.displaygroupingcustomfield?.value == '1' && !!config?.customfieldsexport?.value; + + this.filters.customFilters = this.filters.show.custom + ? CoreTextUtils.parseJSON(config?.customfieldsexport?.value || '[]', []) + : []; + + // Check if any selector is shown and not disabled. + this.filters.enabled = Object.keys(this.filters.show).some((key) => this.filters.show[key]); + + if (!this.filters.enabled) { + // All filters disabled, display all the courses. + this.filters.show.all = true; + this.saveFilters('all'); + } + + this.filterCourses(); } /** - * The filter has changed. + * Load block layouts. * - * @param Received Event. + * @param layouts Config available layouts. */ - filterChanged(event: Event): void { - const target = event?.target || null; + protected loadLayouts(layouts?: string[]): void { + const layoutsOptions: AddonBlockMyOverviewLayouts[] = []; - const newValue = target?.value.trim().toLowerCase(); - if (!newValue || this.courses.allincludinghidden.length <= 0) { - this.filteredCourses = this.courses.allincludinghidden; - } else { - // Use displayname if available, or fullname if not. - if (this.courses.allincludinghidden.length > 0 && - typeof this.courses.allincludinghidden[0].displayname != 'undefined') { - this.filteredCourses = this.courses.allincludinghidden.filter((course) => - course.displayname && course.displayname.toLowerCase().indexOf(newValue) > -1); - } else { - this.filteredCourses = this.courses.allincludinghidden.filter((course) => - course.fullname.toLowerCase().indexOf(newValue) > -1); + if (layouts === undefined) { + this.isLayoutSwitcherAvailable = true; + + return; + } + + layouts.forEach((layout) => { + if (layout == '') { + return; } + + const validLayout: AddonBlockMyOverviewLayouts = layout == 'summary' ? 'list' : layout as AddonBlockMyOverviewLayouts; + if (!layoutsOptions.includes(validLayout)) { + layoutsOptions.push(validLayout); + } + }); + + // If no layout is available use list. + if (layoutsOptions.length == 0) { + layoutsOptions.push('list'); + } + + if (!layoutsOptions.includes(this.layout)) { + this.layout = layoutsOptions[0]; + } + + this.isLayoutSwitcherAvailable = layoutsOptions.length > 1; + } + + /** + * Refresh course list based on a EVENT_MY_COURSES_UPDATED event. + * + * @param data Event data. + * @return Promise resolved when done. + */ + protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise { + if (data.action == CoreCoursesProvider.ACTION_ENROL) { + // Always update if user enrolled in a course. + return await this.refreshContent(); + } + + const course = this.allCourses.find((course) => course.id == data.courseId); + if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED) { + if (!course) { + // Not found, use WS update. + return await this.refreshContent(); + } + + if (data.state == CoreCoursesProvider.STATE_FAVOURITE) { + course.isfavourite = !!data.value; + } + + if (data.state == CoreCoursesProvider.STATE_HIDDEN) { + course.hidden = !!data.value; + } + + await this.invalidateCourseList(); + await this.filterCourses(); + } + + if (data.action == CoreCoursesProvider.ACTION_VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) { + if (!course) { + // Not found, use WS update. + return await this.refreshContent(); + } + + course.lastaccess = CoreTimeUtils.timestamp(); + + await this.invalidateCourseList(); + await this.filterCourses(); } } /** * Initialize the prefetch icon for selected courses. + * + * @return Promise resolved when done. */ - protected initPrefetchCoursesIcons(): void { - if (this.prefetchIconsInitialized || !this.downloadEnabled) { + async initPrefetchCoursesIcons(): Promise { + if (this.prefetchIconsInitialized) { // Already initialized. return; } this.prefetchIconsInitialized = true; - Object.keys(this.prefetchCoursesData).forEach(async (filter) => { - this.prefetchCoursesData[filter] = - await CoreCourseHelper.initPrefetchCoursesIcons(this.courses[filter], this.prefetchCoursesData[filter]); - }); + this.prefetchCoursesData = await CoreCourseHelper.initPrefetchCoursesIcons(this.filteredCourses, this.prefetchCoursesData); } /** @@ -382,201 +406,208 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem * @return Promise resolved when done. */ async prefetchCourses(): Promise { - const selected = this.selectedFilter; - const initialIcon = this.prefetchCoursesData[selected].icon; + const initialIcon = this.prefetchCoursesData.icon; try { - await CoreCourseHelper.prefetchCourses(this.courses[selected], this.prefetchCoursesData[selected]); + await CoreCourseHelper.prefetchCourses(this.filteredCourses, this.prefetchCoursesData); } catch (error) { if (!this.isDestroyed) { CoreDomUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true); - this.prefetchCoursesData[selected].icon = initialIcon; + this.prefetchCoursesData.icon = initialIcon; } } } /** - * Refresh the list of courses. + * Text filter changed. * - * @return Promise resolved when done. + * @param target Searchbar element. */ - protected async refreshCourseList(): Promise { - CoreEvents.trigger(CoreCoursesProvider.EVENT_MY_COURSES_REFRESHED); + filterTextChanged(target: IonSearchbar): void { + this.textFilter = target.value || ''; - try { - await CoreCourses.invalidateUserCourses(); - } catch (error) { - // Ignore errors. - } - - await this.loadContent(true); - } - - /** - * The selected courses filter have changed. - * - * @param filter New filter - */ - selectedChanged(filter: string): void { - this.selectedFilter = filter; - this.setCourseFilter(this.selectedFilter); + this.filterCourses(); } /** * Set selected courses filter. - * - * @param filter Filter name to set. */ - protected async setCourseFilter(filter: string): Promise { - this.selectedFilter = filter; + protected async filterCourses(): Promise { + let timeFilter = this.filters.timeFilterSelected; - if (this.showFilters.custom == 'show' && filter.startsWith('custom-') && - typeof this.customFilter[filter.substr(7)] != 'undefined') { + this.filteredCourses = this.allCourses; - const filterName = this.block.configsRecord!.customfiltergrouping.value; - const filterValue = this.customFilter[filter.substr(7)].value; + if (this.filters.show.custom && timeFilter.startsWith('custom-')) { + // Custom filter. + const customFilterName = this.block.configsRecord?.customfiltergrouping.value; + const customFilterValue = this.filters.customFilters[timeFilter.substring(7)]?.value; - this.loaded = false; - try { - const courses = await CoreCourses.getEnrolledCoursesByCustomField(filterName, filterValue); + if (customFilterName !== undefined && customFilterValue !== undefined) { + this.loaded = false; + try { + const courses = await CoreCourses.getEnrolledCoursesByCustomField(customFilterName, customFilterValue); - // Get the courses information from allincludinghidden to get the max info about the course. - const courseIds = courses.map((course) => course.id); + // Get the courses information from allincludinghidden to get the max info about the course. + const courseIds = courses.map((course) => course.id); - this.filteredCourses = this.courses.allincludinghidden.filter((allCourse) => - courseIds.indexOf(allCourse.id) !== -1); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, this.fetchContentDefaultError); - } finally { - this.loaded = true; + this.filteredCourses = this.filteredCourses.filter((course) => courseIds.includes(course.id)); + } catch (error) { + CoreDomUtils.showErrorModalDefault(error, this.fetchContentDefaultError); + } finally { + this.loaded = true; + } } + } else { + // Filter is not active, take the first active or all. Custom is never saved. + if (!this.filters.show[timeFilter]) { + timeFilter = FILTER_PRIORITY.find((name) => this.filters.show[name]) || 'all'; + } + this.saveFilters(timeFilter); + // Update today date. + this.today = Date.now(); + + // Apply filters. + switch(timeFilter) { + case 'allincludinghidden': + // No nothing, it's all courses. + break; + case 'all': + this.filteredCourses = this.filteredCourses.filter((course) => !course.hidden); + break; + case 'inprogress': + this.filteredCourses = this.filteredCourses.filter((course) => + !course.hidden && + !CoreCoursesHelper.isPastCourse(course, this.gradePeriodAfter) && + !CoreCoursesHelper.isFutureCourse(course, this.gradePeriodAfter, this.gradePeriodBefore)); + break; + case 'future': + this.filteredCourses = this.filteredCourses.filter((course) => + !course.hidden && + CoreCoursesHelper.isFutureCourse(course, this.gradePeriodAfter, this.gradePeriodBefore)); + break; + case 'past': + this.filteredCourses = this.filteredCourses.filter((course) => + !course.hidden && + CoreCoursesHelper.isPastCourse(course, this.gradePeriodAfter)); + break; + case 'favourite': + this.filteredCourses = this.filteredCourses.filter((course) => !course.hidden && course.isfavourite); + break; + case 'hidden': + this.filteredCourses = this.filteredCourses.filter((course) => course.hidden); + break; + } + } + + // Text filter. + const value = this.textFilter.trim().toLowerCase(); + if (value != '' && this.filteredCourses.length > 0) { + // Use displayname if available, or fullname if not. + if (this.filteredCourses[0].displayname !== undefined) { + this.filteredCourses = this.filteredCourses.filter((course) => + course.displayname && course.displayname.toLowerCase().indexOf(value) > -1); + } else { + this.filteredCourses = this.filteredCourses.filter((course) => + course.fullname.toLowerCase().indexOf(value) > -1); + } + } + + this.sortCourses(this.sort.selected); + + // Refresh prefetch data (if enabled). + this.prefetchIconsInitialized = false; + this.initPrefetchCoursesIcons(); + } + + /** + * Sort courses + * + * @param sort Sort by value. + */ + sortCourses(sort: string): void { + if (!this.sort.enabled) { return; } - // Only save the filter if not a custom one. - this.currentSite?.setLocalSiteConfig('AddonBlockMyOverviewFilter', filter); - - if (this.showFilters[filter] == 'show') { - this.filteredCourses = this.courses[filter]; - } else { - const activeFilter = FILTER_PRIORITY.find((name) => this.showFilters[name] == 'show'); - - if (activeFilter) { - this.setCourseFilter(activeFilter); - } - } - } - - /** - * Init courses filters. - * - * @param courses Courses to filter. - */ - initCourseFilters(courses: CoreEnrolledCourseDataWithOptions[]): void { - this.courses.allincludinghidden = courses; - - if (this.showSortFilter) { - if (this.sort == 'lastaccess') { - courses.sort((a, b) => (b.lastaccess || 0) - (a.lastaccess || 0)); - } else if (this.sort == 'fullname') { - courses.sort((a, b) => { - const compareA = a.fullname.toLowerCase(); - const compareB = b.fullname.toLowerCase(); - - return compareA.localeCompare(compareB); - }); - } else if (this.sort == 'shortname') { - courses.sort((a, b) => { - const compareA = a.shortname.toLowerCase(); - const compareB = b.shortname.toLowerCase(); - - return compareA.localeCompare(compareB); - }); - } + if (this.sort.selected != sort) { + this.saveSort(sort); } - this.courses.all = []; - this.courses.past = []; - this.courses.inprogress = []; - this.courses.future = []; - this.courses.favourite = []; - this.courses.hidden = []; + if (this.sort.selected == 'lastaccess') { + this.filteredCourses.sort((a, b) => (b.lastaccess || 0) - (a.lastaccess || 0)); + } else if (this.sort.selected == 'fullname') { + this.filteredCourses.sort((a, b) => { + const compareA = a.fullname.toLowerCase(); + const compareB = b.fullname.toLowerCase(); - const today = CoreTimeUtils.timestamp(); - courses.forEach((course) => { - if (course.hidden) { - this.courses.hidden.push(course); - } else { - this.courses.all.push(course); + return compareA.localeCompare(compareB); + }); + } else if (this.sort.selected == 'shortname') { + this.filteredCourses.sort((a, b) => { + const compareA = a.shortname.toLowerCase(); + const compareB = b.shortname.toLowerCase(); - if ((course.enddate && course.enddate < today) || course.completed) { - // Courses that have already ended. - this.courses.past.push(course); - } else if (course.startdate && course.startdate > today) { - // Courses that have not started yet. - this.courses.future.push(course); - } else { - // Courses still in progress. - this.courses.inprogress.push(course); - } - - if (course.isfavourite) { - this.courses.favourite.push(course); - } - } - }); - - this.setCourseFilter(this.selectedFilter); - } - - /** - * The selected courses sort filter have changed. - * - * @param sort New sorting. - */ - switchSort(sort: string): void { - this.sort = sort; - this.currentSite?.setLocalSiteConfig('AddonBlockMyOverviewSort', this.sort); - this.initCourseFilters(this.courses.allincludinghidden); - } - - /** - * Show or hide the filter. - */ - switchFilter(): void { - this.showFilter = !this.showFilter; - this.courses.filter = ''; - - if (this.showFilter) { - this.filteredCourses = this.courses.allincludinghidden; - } else { - this.setCourseFilter(this.selectedFilter); - } - } - - /** - * Popover closed after clicking switch filter. - */ - switchFilterClosed(): void { - if (this.showFilter) { - setTimeout(() => { - this.searchbar?.setFocus(); + return compareA.localeCompare(compareB); }); } } /** - * If switch button that enables the filter input is shown or not. + * Saves filters value. * - * @return If switch button that enables the filter input is shown or not. + * @param timeFilter New time filter. + * @return Promise resolved when done. */ - showFilterSwitchButton(): boolean { - return this.loaded && this.courses.allincludinghidden && this.courses.allincludinghidden.length > 5; + async saveFilters(timeFilter: string): Promise { + this.filters.timeFilterSelected = timeFilter; + await this.currentSite.setLocalSiteConfig('AddonBlockMyOverviewFilter', timeFilter); } /** - * Component being destroyed. + * Toggle layout value. + * + * @param layout New layout. + * @return Promise resolved when done. + */ + async toggleLayout(layout: AddonBlockMyOverviewLayouts): Promise { + this.layout = layout; + + await this.currentSite.setLocalSiteConfig('AddonBlockMyOverviewLayout', this.layout); + } + + /** + * Saves sort courses value. + * + * @param sort New sorting. + * @return Promise resolved when done. + */ + async saveSort(sort: string): Promise { + this.sort.selected = sort; + + await this.currentSite.setLocalSiteConfig('AddonBlockMyOverviewSort', this.sort.selected); + } + + /** + * Option selected save and apply filter. + * + * @param selected Option selected. + * @return Promise resolved when done. + */ + async filterOptionsChanged(selected: AddonBlockMyOverviewTimeFilters): Promise { + this.filters.timeFilterSelected = selected; + this.filterCourses(); + } + + /** + * Go to search courses. + */ + async openSearch(): Promise { + CoreNavigator.navigateToSitePath('courses/list', { params : { mode: 'search' } }); + } + + /** + * @inheritdoc */ ngOnDestroy(): void { this.isDestroyed = true; @@ -585,3 +616,31 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem } } + +type AddonBlockMyOverviewLayouts = 'card'|'list'; +type AddonBlockMyOverviewTimeFilters = 'allincludinghidden'|'all'|'inprogress'|'future'|'past'|'favourite'|'hidden'; + +export type AddonBlockMyOverviewFilterOptions = { + enabled: boolean; + show: { + allincludinghidden: boolean; + all: boolean; + inprogress: boolean; + future: boolean; + past: boolean; + favourite: boolean; + hidden: boolean; + custom: boolean; + }; + timeFilterSelected: string; + customFilters: { + name: string; + value: string; + }[]; +}; + +type AddonBlockMyOverviewSortOptions = { + shortnameEnabled: boolean; + selected: string; + enabled: boolean; +}; diff --git a/src/addons/block/myoverview/lang.json b/src/addons/block/myoverview/lang.json index 7bca82636..c2180cc2c 100644 --- a/src/addons/block/myoverview/lang.json +++ b/src/addons/block/myoverview/lang.json @@ -1,12 +1,18 @@ { - "all": "All (except removed from view)", - "allincludinghidden": "All", + "all": "All", + "allincludinghidden": "All (including archived)", + "browseallcourses": "Browse all courses", + "card": "Card", "favourites": "Starred", "future": "Future", - "hiddencourses": "Removed from view", + "hiddencourses": "Archived", "inprogress": "In progress", "lastaccessed": "Last accessed", - "nocourses": "No courses", + "list": "List", + "nocoursesenrolled": "You're not enrolled in any courses yet.", + "nocoursesenrolleddescription": "Browse all available courses below and start learning.", + "noresult": "Your search didn't match any courses.", + "noresultdescription": "Try adjusting your filters or browse all courses below.", "past": "Past", "pluginname": "Course overview", "shortname": "Short name", diff --git a/src/addons/block/onlineusers/components/onlineusers/onlineusers.scss b/src/addons/block/onlineusers/components/onlineusers/onlineusers.scss index c3d4b4c40..9c3d9a059 100644 --- a/src/addons/block/onlineusers/components/onlineusers/onlineusers.scss +++ b/src/addons/block/onlineusers/components/onlineusers/onlineusers.scss @@ -1,3 +1,5 @@ +@import "~theme/globals"; + :host .core-block-content ::ng-deep { max-height: 200px; overflow-y: auto; @@ -17,23 +19,22 @@ list-style-type: none; .user { - float: left; + @include float(start); position: relative; padding-bottom: 16px; .core-adapted-img-container { display: inline; - margin-left: 0; - margin-right: 8px; + @include margin-horizontal(0px, 8px); } .userpicture { - vertical-align: text-bottom; + border-radius: 50%; } } .message { - float: right; + @include float(end); margin-top: 3px; } @@ -48,20 +49,3 @@ } } - -:host-context([dir=rtl]) .core-block-content ::ng-deep { - .list li.listentry { - .user { - float: right; - - .core-adapted-img-container { - margin-left: 8px; - margin-right: 0; - } - } - - .message { - float: left; - } - } -} diff --git a/src/addons/block/privatefiles/services/block-handler.ts b/src/addons/block/privatefiles/services/block-handler.ts index 73c160eaf..bf4c9aaf7 100644 --- a/src/addons/block/privatefiles/services/block-handler.ts +++ b/src/addons/block/privatefiles/services/block-handler.ts @@ -16,7 +16,7 @@ import { Injectable } from '@angular/core'; import { CoreBlockHandlerData } from '@features/block/services/block-delegate'; import { CoreBlockOnlyTitleComponent } from '@features/block/components/only-title-block/only-title-block'; import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler'; -import { AddonPrivateFilesMainMenuHandlerService } from '@/addons/privatefiles/services/handlers/mainmenu'; +import { AddonPrivateFilesUserHandlerService } from '@addons/privatefiles/services/handlers/user'; import { makeSingleton } from '@singletons'; /** @@ -39,7 +39,7 @@ export class AddonBlockPrivateFilesHandlerService extends CoreBlockBaseHandler { title: 'addon.block_privatefiles.pluginname', class: 'addon-block-private-files', component: CoreBlockOnlyTitleComponent, - link: AddonPrivateFilesMainMenuHandlerService.PAGE_NAME, + link: AddonPrivateFilesUserHandlerService.PAGE_NAME, linkParams: { root: 'my' }, navOptions: { preferCurrentTab: false, diff --git a/src/addons/block/recentactivity/components/recentactivity/recentactivity.scss b/src/addons/block/recentactivity/components/recentactivity/recentactivity.scss index a2e9d77a2..a72a303fb 100644 --- a/src/addons/block/recentactivity/components/recentactivity/recentactivity.scss +++ b/src/addons/block/recentactivity/components/recentactivity/recentactivity.scss @@ -1,3 +1,5 @@ +@import "~theme/globals"; + :host .core-block-content ::ng-deep { .activitydate, .activityhead { text-align: center; @@ -12,14 +14,8 @@ margin-bottom: 1em; .head .date { - float: right; + @include float(end); } } } } - -:host-context([dir=rtl]) .core-block-content ::ng-deep { - .unlist li .head .date { - float: left; - } -} diff --git a/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html b/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html index e24897fe1..d4b28ea36 100644 --- a/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html +++ b/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/addon-block-recentlyaccessedcourses.html @@ -1,40 +1,25 @@ -

{{ 'addon.block_recentlyaccessedcourses.pluginname' | translate }}

+

{{ 'addon.block_recentlyaccessedcourses.pluginname' | translate }}

-
- - - - - {{prefetchCoursesData.badge}} - - -
-
- - + -
+
+
- + + +
diff --git a/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/recentlyaccessedcourses.ts b/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/recentlyaccessedcourses.ts index f786edbc2..ef7d67f3b 100644 --- a/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/recentlyaccessedcourses.ts +++ b/src/addons/block/recentlyaccessedcourses/components/recentlyaccessedcourses/recentlyaccessedcourses.ts @@ -12,17 +12,25 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChange } from '@angular/core'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreSites } from '@services/sites'; -import { CoreCoursesProvider, CoreCoursesMyCoursesUpdatedEventData, CoreCourses } from '@features/courses/services/courses'; -import { CoreCoursesHelper, CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper'; -import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; +import { + CoreCoursesProvider, + CoreCoursesMyCoursesUpdatedEventData, + CoreCourses, + CoreCourseSummaryData, +} from '@features/courses/services/courses'; +import { + CoreCourseSearchedDataWithExtraInfoAndOptions, + CoreCoursesHelper, + CoreEnrolledCourseDataWithOptions, +} from '@features/courses/services/courses-helper'; import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; -import { AddonCourseCompletion } from '@/addons/coursecompletion/services/coursecompletion'; +import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; import { CoreUtils } from '@services/utils/utils'; -import { CoreDomUtils } from '@services/utils/dom'; +import { CoreSite } from '@classes/site'; /** * Component to render a recent courses block. @@ -31,36 +39,25 @@ import { CoreDomUtils } from '@services/utils/dom'; selector: 'addon-block-recentlyaccessedcourses', templateUrl: 'addon-block-recentlyaccessedcourses.html', }) -export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseComponent implements OnInit, OnChanges, OnDestroy { +export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseComponent implements OnInit, OnDestroy { - @Input() downloadEnabled = false; + courses: AddonBlockRecentlyAccessedCourse[] = []; - courses: CoreEnrolledCourseDataWithOptions [] = []; - prefetchCoursesData: CorePrefetchStatusInfo = { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - badge: '', - }; - - downloadCourseEnabled = false; - downloadCoursesEnabled = false; scrollElementId!: string; - protected prefetchIconsInitialized = false; + protected site!: CoreSite; protected isDestroyed = false; protected coursesObserver?: CoreEventObserver; - protected updateSiteObserver?: CoreEventObserver; - protected courseIds = []; protected fetchContentDefaultError = 'Error getting recent courses data.'; constructor() { super('AddonBlockRecentlyAccessedCoursesComponent'); + + this.site = CoreSites.getRequiredCurrentSite(); } /** - * Component being initialized. + * @inheritdoc */ async ngOnInit(): Promise { // Generate unique id for scroll element. @@ -68,175 +65,149 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom this.scrollElementId = `addon-block-recentlyaccessedcourses-scroll-${scrollId}`; - // Refresh the enabled flags if enabled. - this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); - this.downloadCoursesEnabled = !CoreCourses.isDownloadCoursesDisabledInSite(); - - // Refresh the enabled flags if site is updated. - this.updateSiteObserver = CoreEvents.on(CoreEvents.SITE_UPDATED, () => { - this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); - this.downloadCoursesEnabled = !CoreCourses.isDownloadCoursesDisabledInSite(); - - }, CoreSites.getCurrentSiteId()); - this.coursesObserver = CoreEvents.on( CoreCoursesProvider.EVENT_MY_COURSES_UPDATED, (data) => { - - if (this.shouldRefreshOnUpdatedEvent(data)) { - this.refreshCourseList(); - } + this.refreshCourseList(data); }, - - CoreSites.getCurrentSiteId(), + this.site.getId(), ); super.ngOnInit(); } /** - * Detect changes on input properties. - */ - ngOnChanges(changes: {[name: string]: SimpleChange}): void { - if (changes.downloadEnabled && !changes.downloadEnabled.previousValue && this.downloadEnabled && this.loaded) { - // Download all courses is enabled now, initialize it. - this.initPrefetchCoursesIcons(); - } - } - - /** - * Perform the invalidate content function. - * - * @return Resolved when done. + * @inheritdoc */ protected async invalidateContent(): Promise { - const promises: Promise[] = []; + const courseIds = this.courses.map((course) => course.id); - promises.push(CoreCourses.invalidateUserCourses().finally(() => - // Invalidate course completion data. - CoreUtils.allPromises(this.courseIds.map((courseId) => - AddonCourseCompletion.invalidateCourseCompletion(courseId))))); - - promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions()); - if (this.courseIds.length > 0) { - promises.push(CoreCourses.invalidateCoursesByField('ids', this.courseIds.join(','))); - } - - await CoreUtils.allPromises(promises).finally(() => { - this.prefetchIconsInitialized = false; - }); + await this.invalidateCourses(courseIds); } /** - * Fetch the courses for recent courses. + * Invalidate list of courses. * * @return Promise resolved when done. */ + protected async invalidateCourseList(): Promise { + return this.site.isVersionGreaterEqualThan('3.8') + ? CoreCourses.invalidateRecentCourses() + : CoreCourses.invalidateUserCourses(); + } + + /** + * Helper function to invalidate only selected courses. + * + * @param courseIds Course Id array. + * @return Promise resolved when done. + */ + protected async invalidateCourses(courseIds: number[]): Promise { + const promises: Promise[] = []; + + // Invalidate course completion data. + promises.push(this.invalidateCourseList().finally(() => + CoreUtils.allPromises(courseIds.map((courseId) => + AddonCourseCompletion.invalidateCourseCompletion(courseId))))); + + if (courseIds.length == 1) { + promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions(courseIds[0])); + } else { + promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions()); + } + if (courseIds.length > 0) { + promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(','))); + } + + await CoreUtils.allPromises(promises); + } + + /** + * @inheritdoc + */ protected async fetchContent(): Promise { const showCategories = this.block.configsRecord && this.block.configsRecord.displaycategories && this.block.configsRecord.displaycategories.value == '1'; - this.courses = await CoreCoursesHelper.getUserCoursesWithOptions('lastaccess', 10, undefined, showCategories); - this.initPrefetchCoursesIcons(); - } - - /** - * Refresh the list of courses. - * - * @return Promise resolved when done. - */ - protected async refreshCourseList(): Promise { - CoreEvents.trigger(CoreCoursesProvider.EVENT_MY_COURSES_REFRESHED); - + let recentCourses: CoreCourseSummaryData[] = []; try { - await CoreCourses.invalidateUserCourses(); - } catch (error) { - // Ignore errors. - } + recentCourses = await CoreCourses.getRecentCourses(); + } catch { + // WS is failing on 3.7 and bellow, use a fallback. + this.courses = await CoreCoursesHelper.getUserCoursesWithOptions('lastaccess', 10, undefined, showCategories); - await this.loadContent(true); - } - - /** - * Initialize the prefetch icon for selected courses. - */ - protected async initPrefetchCoursesIcons(): Promise { - if (this.prefetchIconsInitialized || !this.downloadEnabled) { - // Already initialized. return; } - this.prefetchIconsInitialized = true; + const courseIds = recentCourses.map((course) => course.id); - this.prefetchCoursesData = await CoreCourseHelper.initPrefetchCoursesIcons(this.courses, this.prefetchCoursesData); + // Get the courses using getCoursesByField to get more info about each course. + const courses = await CoreCourses.getCoursesByField('ids', courseIds.join(',')); + + this.courses = recentCourses.map((recentCourse) => { + const course = courses.find((course) => recentCourse.id == course.id); + + return Object.assign(recentCourse, course); + }); + + // Get course options and extra info. + const options = await CoreCourses.getCoursesAdminAndNavOptions(courseIds); + this.courses.forEach((course) => { + course.navOptions = options.navOptions[course.id]; + course.admOptions = options.admOptions[course.id]; + + if (!showCategories) { + course.categoryname = ''; + } + }); } /** - * Whether list should be refreshed based on a EVENT_MY_COURSES_UPDATED event. + * Refresh course list based on a EVENT_MY_COURSES_UPDATED event. * * @param data Event data. - * @return Whether to refresh. - */ - protected shouldRefreshOnUpdatedEvent(data: CoreCoursesMyCoursesUpdatedEventData): boolean { - if (data.action == CoreCoursesProvider.ACTION_ENROL) { - // Always update if user enrolled in a course. - return true; - } - - if (data.action == CoreCoursesProvider.ACTION_VIEW && data.courseId != CoreSites.getCurrentSiteHomeId() && - this.courses[0] && data.courseId != this.courses[0].id) { - // Update list if user viewed a course that isn't the most recent one and isn't site home. - return true; - } - - if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED && data.state == CoreCoursesProvider.STATE_FAVOURITE && - data.courseId && this.hasCourse(data.courseId)) { - // Update list if a visible course is now favourite or unfavourite. - return true; - } - - return false; - } - - /** - * Check if a certain course is in the list of courses. - * - * @param courseId Course ID to search. - * @return Whether it's in the list. - */ - protected hasCourse(courseId: number): boolean { - if (!this.courses) { - return false; - } - - return !!this.courses.find((course) => course.id == courseId); - } - - /** - * Prefetch all the shown courses. - * * @return Promise resolved when done. */ - async prefetchCourses(): Promise { - const initialIcon = this.prefetchCoursesData.icon; + protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise { + if (data.action == CoreCoursesProvider.ACTION_ENROL) { + // Always update if user enrolled in a course. + return await this.refreshContent(); + } - try { - await CoreCourseHelper.prefetchCourses(this.courses, this.prefetchCoursesData); - } catch (error) { - if (!this.isDestroyed) { - CoreDomUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true); - this.prefetchCoursesData.icon = initialIcon; + const courseIndex = this.courses.findIndex((course) => course.id == data.courseId); + const course = this.courses[courseIndex]; + if (data.action == CoreCoursesProvider.ACTION_VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) { + if (!course) { + // Not found, use WS update. + return await this.refreshContent(); } + + // Place at the begining. + this.courses.splice(courseIndex, 1); + this.courses.unshift(course); + + await this.invalidateCourseList(); + } + + if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED && + data.state == CoreCoursesProvider.STATE_FAVOURITE && course) { + course.isfavourite = !!data.value; + await this.invalidateCourseList(); } } /** - * Component being destroyed. + * @inheritdoc */ ngOnDestroy(): void { this.isDestroyed = true; this.coursesObserver?.off(); - this.updateSiteObserver?.off(); } } + +type AddonBlockRecentlyAccessedCourse = + (Omit & CoreCourseSearchedDataWithExtraInfoAndOptions) | + (CoreEnrolledCourseDataWithOptions & { + categoryname?: string; // Category name, + }); diff --git a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html index 4990142ad..bdab2ad19 100644 --- a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html +++ b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/addon-block-recentlyaccesseditems.html @@ -1,23 +1,23 @@ -

{{ 'addon.block_recentlyaccesseditems.pluginname' | translate }}

+ +

{{ 'addon.block_recentlyaccesseditems.pluginname' | translate }}

+
- -
+ +
-
+
+
- - + + + {{ item.iconTitle }} @@ -33,10 +33,11 @@
+
- diff --git a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.scss b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.scss index 06802f880..77fad00dd 100644 --- a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.scss +++ b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.scss @@ -1,12 +1,23 @@ @import "~theme/globals"; :host { - .core-horizontal-scroll > div > div { + .core-horizontal-scroll div.core-horizontal-scroll-item { @include horizontal_scroll_item(80%, 250px, 300px); + ion-card { + height: auto; + } + + .ion-text-wrap ion-label { + .item-heading, h2, p { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + } } .core-course-module-handler { - --inner-border-width: 0; + --inner-border-width: 0px; } core-loading { --loading-inline-min-height: 102px; diff --git a/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts b/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts index f2b50bc92..eaafaebec 100644 --- a/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts +++ b/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts @@ -49,17 +49,41 @@ export class AddonBlockRecentlyAccessedItemsProvider { cacheKey: this.getRecentItemsCacheKey(), }; - const items: AddonBlockRecentlyAccessedItemsItem[] = + let items: AddonBlockRecentlyAccessedItemsItem[] = await site.read('block_recentlyaccesseditems_get_recent_items', undefined, preSets); - return items.map((item) => { + const cmIds: number[] = []; + + items = await Promise.all(items.map(async (item) => { const modicon = item.icon && CoreDomUtils.getHTMLElementAttribute(item.icon, 'src'); - item.iconUrl = CoreCourse.getModuleIconSrc(item.modname, modicon || undefined); + item.iconUrl = await CoreCourse.getModuleIconSrc(item.modname, modicon || undefined); item.iconTitle = item.icon && CoreDomUtils.getHTMLElementAttribute(item.icon, 'title'); + cmIds.push(item.cmid); return item; + })); + + // Check if the viewed module should be updated for each activity. + const lastViewedMap = await CoreCourse.getCertainModulesViewed(cmIds, site.getId()); + + items.forEach((recentItem) => { + const timeAccess = recentItem.timeaccess * 1000; + const lastViewed = lastViewedMap[recentItem.cmid]; + + if (lastViewed && lastViewed.timeaccess >= timeAccess) { + return; // No need to update. + } + + // Update access. + CoreCourse.storeModuleViewed(recentItem.courseid, recentItem.cmid, { + timeaccess: recentItem.timeaccess * 1000, + sectionId: lastViewed && lastViewed.sectionId, + siteId: site.getId(), + }); }); + + return items; } /** diff --git a/src/addons/block/rssclient/components/rssclient/rssclient.scss b/src/addons/block/rssclient/components/rssclient/rssclient.scss index bd23c6bc0..2d9e3bc3a 100644 --- a/src/addons/block/rssclient/components/rssclient/rssclient.scss +++ b/src/addons/block/rssclient/components/rssclient/rssclient.scss @@ -6,7 +6,7 @@ -webkit-padding-start: 0; li { - border-top: 1px solid var(--gray); + border-top: 1px solid var(--stroke); padding: 5px; padding-bottom: 8px; } diff --git a/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html b/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html index f5e50c8f7..11bc7d2b8 100644 --- a/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html +++ b/src/addons/block/sitemainmenu/components/sitemainmenu/addon-block-sitemainmenu.html @@ -1,18 +1,17 @@ -

{{ 'addon.block_sitemainmenu.pluginname' | translate }}

+

{{ 'addon.block_sitemainmenu.pluginname' | translate }}

- - + + - + - - + + diff --git a/src/addons/block/sitemainmenu/components/sitemainmenu/sitemainmenu.ts b/src/addons/block/sitemainmenu/components/sitemainmenu/sitemainmenu.ts index c0aad05ef..836a5850c 100644 --- a/src/addons/block/sitemainmenu/components/sitemainmenu/sitemainmenu.ts +++ b/src/addons/block/sitemainmenu/components/sitemainmenu/sitemainmenu.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, Input } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { CoreSites } from '@services/sites'; import { CoreCourse } from '@features/course/services/course'; import { CoreCourseHelper, CoreCourseSection } from '@features/course/services/course-helper'; @@ -29,8 +29,6 @@ import { CoreBlockBaseComponent } from '@features/block/classes/base-block-compo }) export class AddonBlockSiteMainMenuComponent extends CoreBlockBaseComponent implements OnInit { - @Input() downloadEnabled = false; - component = 'AddonBlockSiteMainMenu'; mainMenuBlock?: CoreCourseSection; siteHomeId = 1; @@ -91,7 +89,7 @@ export class AddonBlockSiteMainMenuComponent extends CoreBlockBaseComponent impl const items = config.frontpageloggedin.split(','); const hasNewsItem = items.find((item) => parseInt(item, 10) == FrontPageItemNames['NEWS_ITEMS']); - const result = CoreCourseHelper.addHandlerDataForModules( + const result = await CoreCourseHelper.addHandlerDataForModules( [mainMenuBlock], this.siteHomeId, undefined, diff --git a/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html b/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html index 703863301..88e7fdfce 100644 --- a/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html +++ b/src/addons/block/starredcourses/components/starredcourses/addon-block-starredcourses.html @@ -1,41 +1,25 @@ -

{{ 'addon.block_starredcourses.pluginname' | translate }}

+

{{ 'addon.block_starredcourses.pluginname' | translate }}

-
- - - - - {{prefetchCoursesData.badge}} - - -
-
- - + -
+
+
- + + +
diff --git a/src/addons/block/starredcourses/components/starredcourses/starredcourses.ts b/src/addons/block/starredcourses/components/starredcourses/starredcourses.ts index b95d8084d..c82a896dc 100644 --- a/src/addons/block/starredcourses/components/starredcourses/starredcourses.ts +++ b/src/addons/block/starredcourses/components/starredcourses/starredcourses.ts @@ -12,17 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, OnDestroy, Input, OnChanges, SimpleChange } from '@angular/core'; +import { Component, OnInit, OnDestroy } from '@angular/core'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreSites } from '@services/sites'; import { CoreCoursesProvider, CoreCoursesMyCoursesUpdatedEventData, CoreCourses } from '@features/courses/services/courses'; -import { CoreCoursesHelper, CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper'; -import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; +import { + CoreCourseSearchedDataWithExtraInfoAndOptions, + CoreEnrolledCourseDataWithOptions, +} from '@features/courses/services/courses-helper'; import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; -import { AddonCourseCompletion } from '@/addons/coursecompletion/services/coursecompletion'; +import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion'; import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; import { CoreUtils } from '@services/utils/utils'; -import { CoreDomUtils } from '@services/utils/dom'; +import { CoreSite } from '@classes/site'; +import { AddonBlockStarredCourse, AddonBlockStarredCourses } from '../../services/starredcourses'; /** * Component to render a starred courses block. @@ -31,36 +34,25 @@ import { CoreDomUtils } from '@services/utils/dom'; selector: 'addon-block-starredcourses', templateUrl: 'addon-block-starredcourses.html', }) -export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent implements OnInit, OnChanges, OnDestroy { +export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent implements OnInit, OnDestroy { - @Input() downloadEnabled = false; + courses: AddonBlockStarredCoursesCourse[] = []; - courses: CoreEnrolledCourseDataWithOptions [] = []; - prefetchCoursesData: CorePrefetchStatusInfo = { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - badge: '', - }; - - downloadCourseEnabled = false; - downloadCoursesEnabled = false; scrollElementId!: string; - protected prefetchIconsInitialized = false; + protected site: CoreSite; protected isDestroyed = false; protected coursesObserver?: CoreEventObserver; - protected updateSiteObserver?: CoreEventObserver; - protected courseIds: number[] = []; protected fetchContentDefaultError = 'Error getting starred courses data.'; constructor() { super('AddonBlockStarredCoursesComponent'); + + this.site = CoreSites.getRequiredCurrentSite(); } /** - * Component being initialized. + * @inheritdoc */ async ngOnInit(): Promise { // Generate unique id for scroll element. @@ -68,25 +60,10 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im this.scrollElementId = `addon-block-starredcourses-scroll-${scrollId}`; - // Refresh the enabled flags if enabled. - this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); - this.downloadCoursesEnabled = !CoreCourses.isDownloadCoursesDisabledInSite(); - - // Refresh the enabled flags if site is updated. - this.updateSiteObserver = CoreEvents.on(CoreEvents.SITE_UPDATED, () => { - this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); - this.downloadCoursesEnabled = !CoreCourses.isDownloadCoursesDisabledInSite(); - - }, CoreSites.getCurrentSiteId()); - this.coursesObserver = CoreEvents.on( CoreCoursesProvider.EVENT_MY_COURSES_UPDATED, (data) => { - - if (this.shouldRefreshOnUpdatedEvent(data)) { - this.refreshCourseList(); - } - this.refreshContent(); + this.refreshCourseList(data); }, CoreSites.getCurrentSiteId(), @@ -96,128 +73,130 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im } /** - * Detect changes on input properties. - */ - ngOnChanges(changes: {[name: string]: SimpleChange}): void { - if (changes.downloadEnabled && !changes.downloadEnabled.previousValue && this.downloadEnabled && this.loaded) { - // Download all courses is enabled now, initialize it. - this.initPrefetchCoursesIcons(); - } - } - - /** - * Perform the invalidate content function. - * - * @return Resolved when done. + * @inheritdoc */ protected async invalidateContent(): Promise { - const promises: Promise[] = []; + const courseIds = this.courses.map((course) => course.id); - promises.push(CoreCourses.invalidateUserCourses().finally(() => - // Invalidate course completion data. - CoreUtils.allPromises(this.courseIds.map((courseId) => - AddonCourseCompletion.invalidateCourseCompletion(courseId))))); - - promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions()); - if (this.courseIds.length > 0) { - promises.push(CoreCourses.invalidateCoursesByField('ids', this.courseIds.join(','))); - } - - await CoreUtils.allPromises(promises).finally(() => { - this.prefetchIconsInitialized = false; - }); + await this.invalidateCourses(courseIds); } /** - * Fetch the courses. + * Invalidate list of courses. * * @return Promise resolved when done. */ + protected async invalidateCourseList(): Promise { + return AddonBlockStarredCourses.invalidateStarredCourses(); + } + + /** + * Helper function to invalidate only selected courses. + * + * @param courseIds Course Id array. + * @return Promise resolved when done. + */ + protected async invalidateCourses(courseIds: number[]): Promise { + const promises: Promise[] = []; + + // Invalidate course completion data. + promises.push(this.invalidateCourseList().finally(() => + CoreUtils.allPromises(courseIds.map((courseId) => + AddonCourseCompletion.invalidateCourseCompletion(courseId))))); + + if (courseIds.length == 1) { + promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions(courseIds[0])); + } else { + promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions()); + } + if (courseIds.length > 0) { + promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(','))); + } + + await CoreUtils.allPromises(promises); + } + + /** + * @inheritdoc + */ protected async fetchContent(): Promise { const showCategories = this.block.configsRecord && this.block.configsRecord.displaycategories && this.block.configsRecord.displaycategories.value == '1'; - this.courses = await CoreCoursesHelper.getUserCoursesWithOptions('timemodified', 0, 'isfavourite', showCategories); - this.initPrefetchCoursesIcons(); + // Timemodified not present, use the block WS to retrieve the info. + const starredCourses = await AddonBlockStarredCourses.getStarredCourses(); + + const courseIds = starredCourses.map((course) => course.id); + + // Get the courses using getCoursesByField to get more info about each course. + const courses = await CoreCourses.getCoursesByField('ids', courseIds.join(',')); + + this.courses = starredCourses.map((recentCourse) => { + const course = courses.find((course) => recentCourse.id == course.id); + + return Object.assign(recentCourse, course); + }); + + // Get course options and extra info. + const options = await CoreCourses.getCoursesAdminAndNavOptions(courseIds); + this.courses.forEach((course) => { + course.navOptions = options.navOptions[course.id]; + course.admOptions = options.admOptions[course.id]; + + if (!showCategories) { + course.categoryname = ''; + } + }); } /** - * Refresh the list of courses. - * - * @return Promise resolved when done. - */ - protected async refreshCourseList(): Promise { - CoreEvents.trigger(CoreCoursesProvider.EVENT_MY_COURSES_REFRESHED); - - try { - await CoreCourses.invalidateUserCourses(); - } catch (error) { - // Ignore errors. - } - - await this.loadContent(true); - } - - /** - * Whether list should be refreshed based on a EVENT_MY_COURSES_UPDATED event. + * Refresh course list based on a EVENT_MY_COURSES_UPDATED event. * * @param data Event data. - * @return Whether to refresh. + * @return Promise resolved when done. */ - protected shouldRefreshOnUpdatedEvent(data: CoreCoursesMyCoursesUpdatedEventData): boolean { + protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise { if (data.action == CoreCoursesProvider.ACTION_ENROL) { // Always update if user enrolled in a course. // New courses shouldn't be favourite by default, but just in case. - return true; + return await this.refreshContent(); } if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED && data.state == CoreCoursesProvider.STATE_FAVOURITE) { - // Update list when making a course favourite or not. - return true; - } - - return false; - } - - /** - * Initialize the prefetch icon for selected courses. - */ - protected async initPrefetchCoursesIcons(): Promise { - if (this.prefetchIconsInitialized || !this.downloadEnabled) { - // Already initialized. - return; - } - - this.prefetchIconsInitialized = true; - - this.prefetchCoursesData = await CoreCourseHelper.initPrefetchCoursesIcons(this.courses, this.prefetchCoursesData); - } - - /** - * Prefetch all the shown courses. - * - * @return Promise resolved when done. - */ - async prefetchCourses(): Promise { - const initialIcon = this.prefetchCoursesData.icon; - - try { - return CoreCourseHelper.prefetchCourses(this.courses, this.prefetchCoursesData); - } catch (error) { - if (!this.isDestroyed) { - CoreDomUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true); - this.prefetchCoursesData.icon = initialIcon; + const courseIndex = this.courses.findIndex((course) => course.id == data.courseId); + if (courseIndex < 0) { + // Not found, use WS update. Usually new favourite. + return await this.refreshContent(); } + + const course = this.courses[courseIndex]; + if (data.value === false) { + // Unfavourite, just remove. + this.courses.splice(courseIndex, 1); + } else { + // List is not synced, favourite course and place it at the begining. + course.isfavourite = !!data.value; + + this.courses.splice(courseIndex, 1); + this.courses.unshift(course); + } + + await this.invalidateCourseList(); } } /** - * Component being destroyed. + * @inheritdoc */ ngOnDestroy(): void { this.isDestroyed = true; this.coursesObserver?.off(); - this.updateSiteObserver?.off(); } } + +type AddonBlockStarredCoursesCourse = + (AddonBlockStarredCourse & CoreCourseSearchedDataWithExtraInfoAndOptions) | + (CoreEnrolledCourseDataWithOptions & { + categoryname?: string; // Category name, + }); diff --git a/src/addons/block/starredcourses/services/starredcourses.ts b/src/addons/block/starredcourses/services/starredcourses.ts new file mode 100644 index 000000000..839b05dd5 --- /dev/null +++ b/src/addons/block/starredcourses/services/starredcourses.ts @@ -0,0 +1,101 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { CoreSites } from '@services/sites'; +import { CoreSiteWSPreSets } from '@classes/site'; +import { makeSingleton } from '@singletons'; + +const ROOT_CACHE_KEY = 'AddonBlockStarredCourses:'; + +/** + * Service that provides some features regarding starred courses. + */ +@Injectable( { providedIn: 'root' }) +export class AddonBlockStarredCoursesProvider { + + /** + * Get cache key for get starred courrses value WS call. + * + * @return Cache key. + */ + protected getStarredCoursesCacheKey(): string { + return ROOT_CACHE_KEY + ':starredcourses'; + } + + /** + * Get starred courrses. + * + * @param siteId Site ID. If not defined, use current site. + * @return Promise resolved when the info is retrieved. + */ + async getStarredCourses(siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + const preSets: CoreSiteWSPreSets = { + cacheKey: this.getStarredCoursesCacheKey(), + }; + + return await site.read('block_starredcourses_get_starred_courses', undefined, preSets); + } + + /** + * Invalidates get starred courrses WS call. + * + * @param siteId Site ID to invalidate. If not defined, use current site. + * @return Promise resolved when the data is invalidated. + */ + async invalidateStarredCourses(siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + await site.invalidateWsCacheForKey(this.getStarredCoursesCacheKey()); + } + +} +export const AddonBlockStarredCourses = makeSingleton(AddonBlockStarredCoursesProvider); + +/** + * Params of block_starredcourses_get_starred_courses WS. + */ +export type AddonBlockStarredCoursesGetStarredCoursesWSParams = { + limit?: number; // Limit. + offset?: number; // Offset. +}; + +/** + * Data returned by block_starredcourses_get_starred_courses WS. + */ +export type AddonBlockStarredCourse = { + id: number; // Id. + fullname: string; // Fullname. + shortname: string; // Shortname. + idnumber: string; // Idnumber. + summary: string; // Summary. + summaryformat: number; // Summary format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). + startdate: number; // Startdate. + enddate: number; // Enddate. + visible: boolean; // Visible. + showactivitydates: boolean; // Showactivitydates. + showcompletionconditions: boolean; // Showcompletionconditions. + fullnamedisplay: string; // Fullnamedisplay. + viewurl: string; // Viewurl. + courseimage: string; // Courseimage. + progress?: number; // Progress. + hasprogress: boolean; // Hasprogress. + isfavourite: boolean; // Isfavourite. + hidden: boolean; // Hidden. + timeaccess?: number; // Timeaccess. + showshortname: boolean; // Showshortname. + coursecategory: string; // Coursecategory. +}; diff --git a/src/addons/block/tags/components/tags/tags.scss b/src/addons/block/tags/components/tags/tags.scss index b1144d4e0..e6141bf4e 100644 --- a/src/addons/block/tags/components/tags/tags.scss +++ b/src/addons/block/tags/components/tags/tags.scss @@ -1,11 +1,9 @@ :host .core-block-content ::ng-deep { .tag_cloud { - font-size: 80%; text-align: center; ul.inline-list { list-style: none; - margin-left: 0; - margin-right: 0; + margin: 0; -webkit-padding-start: 0; li { @@ -13,8 +11,8 @@ display: inline-block; a { - background: var(--ion-color-primary); - color: var(--ion-color-primary-contrast); + background: var(--primary); + color: var(--primary-contrast); padding: 3px 8px; -webkit-font-smoothing: antialiased; display: inline-block; @@ -26,7 +24,7 @@ contain: content; vertical-align: baseline; text-decoration: none; - border-radius: 4px; + border-radius: var(--small-radius); } .s20 { font-size: 2.7em; diff --git a/src/addons/block/timeline/components/components.module.ts b/src/addons/block/timeline/components/components.module.ts index dfd4a5fc4..00c06106d 100644 --- a/src/addons/block/timeline/components/components.module.ts +++ b/src/addons/block/timeline/components/components.module.ts @@ -15,11 +15,10 @@ import { NgModule } from '@angular/core'; import { CoreSharedModule } from '@/core/shared.module'; -import { CoreCoursesComponentsModule } from '@features/courses/components/components.module'; -import { CoreCourseComponentsModule } from '@features/course/components/components.module'; import { AddonBlockTimelineComponent } from './timeline/timeline'; import { AddonBlockTimelineEventsComponent } from './events/events'; +import { CoreSearchComponentsModule } from '@features/search/components/components.module'; @NgModule({ declarations: [ @@ -28,8 +27,7 @@ import { AddonBlockTimelineEventsComponent } from './events/events'; ], imports: [ CoreSharedModule, - CoreCoursesComponentsModule, - CoreCourseComponentsModule, + CoreSearchComponentsModule, ], exports: [ AddonBlockTimelineComponent, diff --git a/src/addons/block/timeline/components/events/addon-block-timeline-events.html b/src/addons/block/timeline/components/events/addon-block-timeline-events.html index 022dcc211..5244492db 100644 --- a/src/addons/block/timeline/components/events/addon-block-timeline-events.html +++ b/src/addons/block/timeline/components/events/addon-block-timeline-events.html @@ -1,62 +1,83 @@ + + +

+ {{ 'core.courses.aria:coursename' | translate }} + + +

+
+
- -

{{ dayEvents.dayTimestamp * 1000 | coreFormatDate:"strftimedayshort" }}

-
+ + +

{{ dayEvents.dayTimestamp * 1000 | coreFormatDate:"strftimedaydate" }}

+
+
- - + - - {{ event.iconTitle }} -

- - -

-

- - -

- - - {{event.action.name}} - {{event.action.itemcount}} - - + + + + + {{event.timesort * 1000 | coreFormatDate:"strftimetime24" }} + + + + +

+ + + + + {{ 'addon.block_timeline.overdue' | translate }} + +

+

+ + + + + + + + +

+
+
+
+ + + {{event.action.name}} + + {{event.action.itemcount}} + + + +
- -
-
- {{event.timesort * 1000 | coreFormatDate:"strftimetime24" }} -
- - {{event.action.name}} - - {{event.action.itemcount}} - - -
- + {{ 'core.loadmore' | translate }}
- + + +

{{'addon.block_timeline.noevents' | translate}}

+
+
+ diff --git a/src/addons/block/timeline/components/events/events.scss b/src/addons/block/timeline/components/events/events.scss index c863dbb2a..4de0930a9 100644 --- a/src/addons/block/timeline/components/events/events.scss +++ b/src/addons/block/timeline/components/events/events.scss @@ -1,6 +1,81 @@ -.events-info { - display: flex; - flex-direction: column; - text-align: end; - padding: 10px 0; +@import "~theme/globals"; + +h3 { + font-weight: bold; + font-size: 18px; +} + +h4 { + font-size: 15px; +} + +h4.core-bold { + font-weight: bold; +} + +.addon-block-timeline-activity { + ion-badge { + @include margin-horizontal(0.25rem, 0.5rem); + } + + small { + @include margin-horizontal(null, 0.5rem); + } + + core-mod-icon { + padding: 8px; + --margin-end: 0.5rem; + --margin-vertical: 0; + } +} + +.addon-block-timeline-activity-time { + flex-grow: 0; +} + +.addon-block-timeline-activity-action { + display: flex; + justify-content: flex-end; +} + +.addon-block-timeline-activity-name-with-status { + display: flex; + flex-wrap: wrap; + span { + overflow: hidden; + text-overflow: ellipsis; + } +} + +.addon-block-timeline-activity-course-activity { + display: flex; + flex-wrap: wrap; + span { + overflow: hidden; + text-overflow: ellipsis; + } + span::after { + content: "·"; + display: inline; + padding-left: .3rem; + padding-right: .3rem; + } + + span:last-child::after { + display: none; + } +} + +.addon-block-timeline-activity-main, +.addon-block-timeline-activity-name { + flex-grow: 1; + p { + overflow: hidden; + text-overflow: ellipsis; + } +} + +.addon-block-timeline-activity-name { + flex-grow: 1; + overflow: hidden; } diff --git a/src/addons/block/timeline/components/events/events.ts b/src/addons/block/timeline/components/events/events.ts index f4266f50c..bdebff829 100644 --- a/src/addons/block/timeline/components/events/events.ts +++ b/src/addons/block/timeline/components/events/events.ts @@ -17,11 +17,11 @@ import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreTextUtils } from '@services/utils/text'; import { CoreTimeUtils } from '@services/utils/time'; -import { CoreUtils } from '@services/utils/utils'; import { CoreCourse } from '@features/course/services/course'; -import moment from 'moment'; import { CoreContentLinksHelper } from '@features/contentlinks/services/contentlinks-helper'; import { AddonCalendarEvent } from '@addons/calendar/services/calendar'; +import { CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper'; +import { AddonBlockTimeline } from '../../services/timeline'; /** * Directive to render a list of events in course overview. @@ -34,34 +34,33 @@ import { AddonCalendarEvent } from '@addons/calendar/services/calendar'; export class AddonBlockTimelineEventsComponent implements OnChanges { @Input() events: AddonBlockTimelineEvent[] = []; // The events to render. - @Input() showCourse?: boolean | string; // Whether to show the course name. + @Input() course?: CoreEnrolledCourseDataWithOptions; // Whether to show the course name. @Input() from = 0; // Number of days from today to offset the events. @Input() to?: number; // Number of days from today to limit the events to. If not defined, no limit. - @Input() canLoadMore?: boolean; // Whether more events can be loaded. - @Output() loadMore: EventEmitter; // Notify that more events should be loaded. + @Input() overdue = false; // If filtering overdue events or not. + @Input() canLoadMore = false; // Whether more events can be loaded. + @Output() loadMore = new EventEmitter(); // Notify that more events should be loaded. + showCourse = false; // Whether to show the course name. empty = true; loadingMore = false; filteredEvents: AddonBlockTimelineEventFilteredEvent[] = []; - constructor() { - this.loadMore = new EventEmitter(); - } - /** - * Detect changes on input properties. + * @inheritdoc */ - ngOnChanges(changes: {[name: string]: SimpleChange}): void { - this.showCourse = CoreUtils.isTrueOrOne(this.showCourse); + async ngOnChanges(changes: {[name: string]: SimpleChange}): Promise { + this.showCourse = !this.course; if (changes.events || changes.from || changes.to) { - if (this.events && this.events.length > 0) { - const filteredEvents = this.filterEventsByTime(this.from, this.to); + if (this.events) { + const filteredEvents = await this.filterEventsByTime(); this.empty = !filteredEvents || filteredEvents.length <= 0; - const eventsByDay: Record = {}; + const eventsByDay: Record = {}; filteredEvents.forEach((event) => { const dayTimestamp = CoreTimeUtils.getMidnightForTimestamp(event.timesort); + if (eventsByDay[dayTimestamp]) { eventsByDay[dayTimestamp].push(event); } else { @@ -69,16 +68,15 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { } }); - const todaysMidnight = CoreTimeUtils.getMidnightForTimestamp(); - this.filteredEvents = []; - Object.keys(eventsByDay).forEach((key) => { + this.filteredEvents = Object.keys(eventsByDay).map((key) => { const dayTimestamp = parseInt(key); - this.filteredEvents.push({ - color: dayTimestamp < todaysMidnight ? 'danger' : 'light', + + return { dayTimestamp, events: eventsByDay[dayTimestamp], - }); + }; }); + this.loadingMore = false; } else { this.empty = true; } @@ -88,26 +86,41 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { /** * Filter the events by time. * - * @param start Number of days to start getting events from today. E.g. -1 will get events from yesterday. - * @param end Number of days after the start. * @return Filtered events. */ - protected filterEventsByTime(start: number, end?: number): AddonBlockTimelineEvent[] { - start = moment().add(start, 'days').startOf('day').unix(); - end = typeof end != 'undefined' ? moment().add(end, 'days').startOf('day').unix() : end; + protected async filterEventsByTime(): Promise { + const start = AddonBlockTimeline.getDayStart(this.from); + const end = this.to !== undefined + ? AddonBlockTimeline.getDayStart(this.to) + : undefined; - return this.events.filter((event) => { - if (end) { - return start <= event.timesort && event.timesort < end; + const now = CoreTimeUtils.timestamp(); + const midnight = AddonBlockTimeline.getDayStart(); + + return await Promise.all(this.events.filter((event) => { + if (start > event.timesort || (end && event.timesort >= end)) { + return false; } - return start <= event.timesort; - }).map((event) => { - event.iconUrl = CoreCourse.getModuleIconSrc(event.icon.component); - event.iconTitle = event.modulename && CoreCourse.translateModuleName(event.modulename); + // Already calculated on 4.0 onwards but this will be live. + event.overdue = event.timesort < now; + + if (event.eventtype === 'open' || event.eventtype === 'opensubmission') { + const dayTimestamp = CoreTimeUtils.getMidnightForTimestamp(event.timesort); + + return dayTimestamp > midnight; + } + + // When filtering by overdue, we fetch all events due today, in case any have elapsed already and are overdue. + // This means if filtering by overdue, some events fetched might not be required (eg if due later today). + return (!this.overdue || event.overdue); + }).map(async (event) => { + event.iconUrl = await CoreCourse.getModuleIconSrc(event.icon.component); + event.modulename = event.modulename || event.icon.component; + event.iconTitle = CoreCourse.translateModuleName(event.modulename); return event; - }); + })); } /** @@ -121,12 +134,12 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { /** * Action clicked. * - * @param e Click event. + * @param event Click event. * @param url Url of the action. */ - async action(e: Event, url: string): Promise { - e.preventDefault(); - e.stopPropagation(); + async action(event: Event, url: string): Promise { + event.preventDefault(); + event.stopPropagation(); // Fix URL format. url = CoreTextUtils.decodeHTMLEntities(url); @@ -136,7 +149,7 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { try { const treated = await CoreContentLinksHelper.handleLink(url); if (!treated) { - return CoreSites.getCurrentSite()?.openInBrowserWithAutoLoginIfSameSite(url); + return CoreSites.getRequiredCurrentSite().openInBrowserWithAutoLoginIfSameSite(url); } } finally { modal.dismiss(); @@ -145,7 +158,8 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { } -type AddonBlockTimelineEvent = AddonCalendarEvent & { +type AddonBlockTimelineEvent = Omit & { + eventtype: string; iconUrl?: string; iconTitle?: string; }; @@ -153,5 +167,4 @@ type AddonBlockTimelineEvent = AddonCalendarEvent & { type AddonBlockTimelineEventFilteredEvent = { events: AddonBlockTimelineEvent[]; dayTimestamp: number; - color: string; }; diff --git a/src/addons/block/timeline/components/timeline/addon-block-timeline.html b/src/addons/block/timeline/components/timeline/addon-block-timeline.html index f8d82393d..e518b440c 100644 --- a/src/addons/block/timeline/components/timeline/addon-block-timeline.html +++ b/src/addons/block/timeline/components/timeline/addon-block-timeline.html @@ -1,57 +1,73 @@ -

{{ 'addon.block_timeline.pluginname' | translate }}

- - - - - - + +

{{ 'addon.block_timeline.pluginname' | translate }}

+
- -
- - - {{ 'core.all' | translate }} - - - {{ 'addon.block_timeline.overdue' | translate }} - - - {{ 'addon.block_timeline.duedate' | translate }} - - - {{ 'addon.block_timeline.next7days' | translate }} - - - {{ 'addon.block_timeline.next30days' | translate }} - - - {{ 'addon.block_timeline.next3months' | translate }} - - - {{ 'addon.block_timeline.next6months' | translate }} - - -
- - + + + + + + + + + + + + {{ 'core.all' | translate }} + + + {{ 'addon.block_timeline.overdue' | translate }} + + + {{ 'addon.block_timeline.duedate' | translate }} + + + {{ 'addon.block_timeline.next7days' | translate }} + + + {{ 'addon.block_timeline.next30days' | translate }} + + + {{ 'addon.block_timeline.next3months' | translate }} + + + {{ 'addon.block_timeline.next6months' | translate }} + + + + + + + + + + + {{'addon.block_timeline.sortbydates' | translate}} + + + {{'addon.block_timeline.sortbycourses' | translate}} + + + + + + + + - - - - - - - - - - - + + + + + diff --git a/src/addons/block/timeline/components/timeline/timeline.scss b/src/addons/block/timeline/components/timeline/timeline.scss new file mode 100644 index 000000000..aab42b195 --- /dev/null +++ b/src/addons/block/timeline/components/timeline/timeline.scss @@ -0,0 +1,38 @@ +:host { + ion-row.addon-block-timeline-filter { + margin: 8px; + padding: 0; + + ion-col { + padding: 0; + margin-right: 2px; + margin-left: 2px; + } + + ion-button, + core-combobox ::ng-deep ion-button { + --border-width: 0; + --a11y-min-target-size: 40px; + margin: 0; + + .select-icon { + display: none; + } + ion-icon { + font-size: 20px; + } + } + + core-combobox ::ng-deep ion-select { + margin: 0; + --a11y-min-target-size: 40px; + } + + core-search-box { + padding: 0; + margin: 0; + --height: 40px; + } + } + +} diff --git a/src/addons/block/timeline/components/timeline/timeline.ts b/src/addons/block/timeline/components/timeline/timeline.ts index 9c5547050..25daa185a 100644 --- a/src/addons/block/timeline/components/timeline/timeline.ts +++ b/src/addons/block/timeline/components/timeline/timeline.ts @@ -13,7 +13,6 @@ // limitations under the License. import { Component, OnInit } from '@angular/core'; -import { CoreTimeUtils } from '@services/utils/time'; import { CoreSites } from '@services/sites'; import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; import { AddonBlockTimeline } from '../../services/timeline'; @@ -24,6 +23,7 @@ import { CoreCoursesHelper, CoreEnrolledCourseDataWithOptions } from '@features/ import { CoreSite } from '@classes/site'; import { CoreCourses } from '@features/courses/services/courses'; import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; +import { CoreNavigator } from '@services/navigator'; /** * Component to render a timeline block. @@ -31,12 +31,13 @@ import { CoreCourseOptionsDelegate } from '@features/course/services/course-opti @Component({ selector: 'addon-block-timeline', templateUrl: 'addon-block-timeline.html', + styleUrls: ['timeline.scss'], }) export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implements OnInit { sort = 'sortbydates'; filter = 'next30days'; - currentSite?: CoreSite; + currentSite!: CoreSite; timeline: { events: AddonCalendarEvent[]; loaded: boolean; @@ -57,24 +58,40 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen dataFrom?: number; dataTo?: number; + overdue = false; - protected courseIds: number[] = []; + searchEnabled = false; + searchText = ''; + + protected courseIdsToInvalidate: number[] = []; protected fetchContentDefaultError = 'Error getting timeline data.'; + protected gradePeriodAfter = 0; + protected gradePeriodBefore = 0; constructor() { super('AddonBlockTimelineComponent'); } /** - * Component being initialized. + * @inheritdoc */ async ngOnInit(): Promise { - this.currentSite = CoreSites.getCurrentSite(); + try { + this.currentSite = CoreSites.getRequiredCurrentSite(); + } catch (error) { + CoreDomUtils.showErrorModal(error); - this.filter = await this.currentSite!.getLocalSiteConfig('AddonBlockTimelineFilter', this.filter); + CoreNavigator.back(); + + return; + } + + this.filter = await this.currentSite.getLocalSiteConfig('AddonBlockTimelineFilter', this.filter); this.switchFilter(this.filter); - this.sort = await this.currentSite!.getLocalSiteConfig('AddonBlockTimelineSort', this.sort); + this.sort = await this.currentSite.getLocalSiteConfig('AddonBlockTimelineSort', this.sort); + + this.searchEnabled = this.currentSite.isVersionGreaterEqualThan('4.0'); super.ngOnInit(); } @@ -91,8 +108,8 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen promises.push(AddonBlockTimeline.invalidateActionEventsByCourses()); promises.push(CoreCourses.invalidateUserCourses()); promises.push(CoreCourseOptionsDelegate.clearAndInvalidateCoursesOptions()); - if (this.courseIds.length > 0) { - promises.push(CoreCourses.invalidateCoursesByField('ids', this.courseIds.join(','))); + if (this.courseIdsToInvalidate.length > 0) { + promises.push(CoreCourses.invalidateCoursesByField('ids', this.courseIdsToInvalidate.join(','))); } return CoreUtils.allPromises(promises); @@ -117,28 +134,22 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen } } - /** - * Load more events. - */ - async loadMoreTimeline(): Promise { - try { - await this.fetchMyOverviewTimeline(this.timeline.canLoadMore); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, this.fetchContentDefaultError); - } - } - /** * Load more events. * - * @param course Course. + * @param course Course. If defined, it will update the course events, timeline otherwise. * @return Promise resolved when done. */ - async loadMoreCourse(course: AddonBlockTimelineCourse): Promise { + async loadMore(course?: AddonBlockTimelineCourse): Promise { try { - const courseEvents = await AddonBlockTimeline.getActionEventsByCourse(course.id, course.canLoadMore); - course.events = course.events?.concat(courseEvents.events); - course.canLoadMore = courseEvents.canLoadMore; + if (course) { + const courseEvents = + await AddonBlockTimeline.getActionEventsByCourse(course.id, course.canLoadMore, this.searchText); + course.events = course.events?.concat(courseEvents.events); + course.canLoadMore = courseEvents.canLoadMore; + } else { + await this.fetchMyOverviewTimeline(this.timeline.canLoadMore); + } } catch (error) { CoreDomUtils.showErrorModalDefault(error, this.fetchContentDefaultError); } @@ -151,9 +162,9 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen * @return Promise resolved when done. */ protected async fetchMyOverviewTimeline(afterEventId?: number): Promise { - const events = await AddonBlockTimeline.getActionEventsByTimesort(afterEventId); + const events = await AddonBlockTimeline.getActionEventsByTimesort(afterEventId, this.searchText); - this.timeline.events = events.events; + this.timeline.events = afterEventId ? this.timeline.events.concat(events.events) : events.events; this.timeline.canLoadMore = events.canLoadMore; } @@ -163,20 +174,36 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen * @return Promise resolved when done. */ protected async fetchMyOverviewTimelineByCourses(): Promise { - const courses = await CoreCoursesHelper.getUserCoursesWithOptions(); - const today = CoreTimeUtils.timestamp(); + try { + this.gradePeriodAfter = parseInt(await this.currentSite.getConfig('coursegraceperiodafter'), 10); + this.gradePeriodBefore = parseInt(await this.currentSite.getConfig('coursegraceperiodbefore'), 10); + } catch { + this.gradePeriodAfter = 0; + this.gradePeriodBefore = 0; + } - this.timelineCourses.courses = courses.filter((course) => - (course.startdate || 0) <= today && (!course.enddate || course.enddate >= today)); + // Do not filter courses by date because they can contain activities due. + this.timelineCourses.courses = await CoreCoursesHelper.getUserCoursesWithOptions(); + this.courseIdsToInvalidate = this.timelineCourses.courses.map((course) => course.id); + + // Filter only in progress courses. + this.timelineCourses.courses = this.timelineCourses.courses.filter((course) => + !course.hidden && + !CoreCoursesHelper.isPastCourse(course, this.gradePeriodAfter) && + !CoreCoursesHelper.isFutureCourse(course, this.gradePeriodAfter, this.gradePeriodBefore)); if (this.timelineCourses.courses.length > 0) { - this.courseIds = this.timelineCourses.courses.map((course) => course.id); + const courseEvents = await AddonBlockTimeline.getActionEventsByCourses(this.courseIdsToInvalidate, this.searchText); - const courseEvents = await AddonBlockTimeline.getActionEventsByCourses(this.courseIds); + this.timelineCourses.courses = this.timelineCourses.courses.filter((course) => { + if (courseEvents[course.id].events.length == 0) { + return false; + } - this.timelineCourses.courses.forEach((course) => { course.events = courseEvents[course.id].events; course.canLoadMore = courseEvents[course.id].canLoadMore; + + return true; }); } } @@ -188,12 +215,13 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen */ switchFilter(filter: string): void { this.filter = filter; - this.currentSite?.setLocalSiteConfig('AddonBlockTimelineFilter', this.filter); + this.currentSite.setLocalSiteConfig('AddonBlockTimelineFilter', this.filter); + this.overdue = this.filter === 'overdue'; switch (this.filter) { case 'overdue': this.dataFrom = -14; - this.dataTo = 0; + this.dataTo = 1; break; case 'next7days': this.dataFrom = 0; @@ -226,7 +254,7 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen */ switchSort(sort: string): void { this.sort = sort; - this.currentSite?.setLocalSiteConfig('AddonBlockTimelineSort', this.sort); + this.currentSite.setLocalSiteConfig('AddonBlockTimelineSort', this.sort); if (!this.timeline.loaded && this.sort == 'sortbydates') { this.fetchContent(); @@ -235,9 +263,20 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen } } + /** + * Search text changed. + * + * @param searchValue Search value + */ + searchTextChanged(searchValue = ''): void { + this.searchText = searchValue || ''; + + this.fetchContent(); + } + } -type AddonBlockTimelineCourse = CoreEnrolledCourseDataWithOptions & { +export type AddonBlockTimelineCourse = CoreEnrolledCourseDataWithOptions & { events?: AddonCalendarEvent[]; canLoadMore?: number; }; diff --git a/src/addons/block/timeline/lang.json b/src/addons/block/timeline/lang.json index fbd482f47..b4cb56414 100644 --- a/src/addons/block/timeline/lang.json +++ b/src/addons/block/timeline/lang.json @@ -5,9 +5,10 @@ "next6months": "Next 6 months", "next7days": "Next 7 days", "nocoursesinprogress": "No in-progress courses", - "noevents": "No upcoming activities due", + "noevents": "No activities require action", "overdue": "Overdue", "pluginname": "Timeline", + "searchevents": "Search by activity type or name", "sortbycourses": "Sort by courses", "sortbydates": "Sort by dates" -} \ No newline at end of file +} diff --git a/src/addons/block/timeline/services/block-handler.ts b/src/addons/block/timeline/services/block-handler.ts index d05574786..0675654c3 100644 --- a/src/addons/block/timeline/services/block-handler.ts +++ b/src/addons/block/timeline/services/block-handler.ts @@ -19,7 +19,7 @@ import { CoreCourses } from '@features/courses/services/courses'; import { AddonBlockTimelineComponent } from '@addons/block/timeline/components/timeline/timeline'; import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler'; import { makeSingleton } from '@singletons'; -import { AddonBlockTimeline } from './timeline'; +import { CoreCoursesDashboard } from '@features/courses/services/dashboard'; /** * Block handler. @@ -36,7 +36,7 @@ export class AddonBlockTimelineHandlerService extends CoreBlockBaseHandler { * @return Whether or not the handler is enabled on a site level. */ async isEnabled(): Promise { - const enabled = await AddonBlockTimeline.isAvailable(); + const enabled = !CoreCoursesDashboard.isDisabledInSite(); const currentSite = CoreSites.getCurrentSite(); return enabled && ((currentSite && currentSite.isVersionGreaterEqualThan('3.6')) || diff --git a/src/addons/block/timeline/services/timeline.ts b/src/addons/block/timeline/services/timeline.ts index c50c5adef..c37f36591 100644 --- a/src/addons/block/timeline/services/timeline.ts +++ b/src/addons/block/timeline/services/timeline.ts @@ -14,7 +14,6 @@ import { Injectable } from '@angular/core'; import { CoreSites } from '@services/sites'; -import { CoreCoursesDashboard } from '@features/courses/services/dashboard'; import { AddonCalendarEvents, AddonCalendarEventsGroupedByCourse, @@ -26,7 +25,6 @@ import { import moment from 'moment'; import { makeSingleton } from '@singletons'; import { CoreSiteWSPreSets } from '@classes/site'; -import { CoreError } from '@classes/errors/error'; // Cache key was maintained from block myoverview when blocks were splitted. const ROOT_CACHE_KEY = 'myoverview:'; @@ -45,17 +43,19 @@ export class AddonBlockTimelineProvider { * * @param courseId Only events in this course. * @param afterEventId The last seen event id. + * @param searchValue The value a user wishes to search against. * @param siteId Site ID. If not defined, use current site. * @return Promise resolved when the info is retrieved. */ async getActionEventsByCourse( courseId: number, afterEventId?: number, + searchValue = '', siteId?: string, ): Promise<{ events: AddonCalendarEvent[]; canLoadMore?: number }> { const site = await CoreSites.getSite(siteId); - const time = moment().subtract(14, 'days').unix(); // Check two weeks ago. + const time = this.getDayStart(-14); // Check two weeks ago. const data: AddonCalendarGetActionEventsByCourseWSParams = { timesortfrom: time, @@ -70,17 +70,18 @@ export class AddonBlockTimelineProvider { cacheKey: this.getActionEventsByCourseCacheKey(courseId), }; + if (searchValue != '') { + data.searchvalue = searchValue; + preSets.getFromCache = false; + } + const courseEvents = await site.read( 'core_calendar_get_action_events_by_course', data, preSets, ); - if (courseEvents && courseEvents.events) { - return this.treatCourseEvents(courseEvents, time); - } - - throw new CoreError('No events returned on core_calendar_get_action_events_by_course.'); + return this.treatCourseEvents(courseEvents, time); } /** @@ -98,15 +99,17 @@ export class AddonBlockTimelineProvider { * * @param courseIds Course IDs. * @param siteId Site ID. If not defined, use current site. + * @param searchValue The value a user wishes to search against. * @return Promise resolved when the info is retrieved. */ async getActionEventsByCourses( courseIds: number[], + searchValue = '', siteId?: string, ): Promise<{[courseId: string]: { events: AddonCalendarEvent[]; canLoadMore?: number } }> { const site = await CoreSites.getSite(siteId); - const time = moment().subtract(14, 'days').unix(); // Check two weeks ago. + const time = this.getDayStart(-14); // Check two weeks ago. const data: AddonCalendarGetActionEventsByCoursesWSParams = { timesortfrom: time, @@ -117,6 +120,11 @@ export class AddonBlockTimelineProvider { cacheKey: this.getActionEventsByCoursesCacheKey(), }; + if (searchValue != '') { + data.searchvalue = searchValue; + preSets.getFromCache = false; + } + const events = await site.read( 'core_calendar_get_action_events_by_courses', data, @@ -145,16 +153,18 @@ export class AddonBlockTimelineProvider { * Get calendar action events based on the timesort value. * * @param afterEventId The last seen event id. + * @param searchValue The value a user wishes to search against. * @param siteId Site ID. If not defined, use current site. * @return Promise resolved when the info is retrieved. */ async getActionEventsByTimesort( afterEventId?: number, + searchValue = '', siteId?: string, ): Promise<{ events: AddonCalendarEvent[]; canLoadMore?: number }> { const site = await CoreSites.getSite(siteId); - const timesortfrom = moment().subtract(14, 'days').unix(); // Check two weeks ago. + const timesortfrom = this.getDayStart(-14); // Check two weeks ago. const limitnum = AddonBlockTimelineProvider.EVENTS_LIMIT; const data: AddonCalendarGetActionEventsByTimesortWSParams = { @@ -171,25 +181,27 @@ export class AddonBlockTimelineProvider { uniqueCacheKey: true, }; + if (searchValue != '') { + data.searchvalue = searchValue; + preSets.getFromCache = false; + preSets.cacheKey += ':' + searchValue; + } + const result = await site.read( 'core_calendar_get_action_events_by_timesort', data, preSets, ); - if (result && result.events) { - const canLoadMore = result.events.length >= limitnum ? result.lastid : undefined; + const canLoadMore = result.events.length >= limitnum ? result.lastid : undefined; - // Filter events by time in case it uses cache. - const events = result.events.filter((element) => element.timesort >= timesortfrom); + // Filter events by time in case it uses cache. + const events = result.events.filter((element) => element.timesort >= timesortfrom); - return { - events, - canLoadMore, - }; - } - - throw new CoreError('No events returned on core_calendar_get_action_events_by_timesort.'); + return { + events, + canLoadMore, + }; } /** @@ -239,24 +251,6 @@ export class AddonBlockTimelineProvider { await site.invalidateWsCacheForKeyStartingWith(this.getActionEventsByTimesortPrefixCacheKey()); } - /** - * Returns whether or not My Overview is available for a certain site. - * - * @param siteId Site ID. If not defined, current site. - * @return Promise resolved with true if available, resolved with false or rejected otherwise. - */ - async isAvailable(siteId?: string): Promise { - const site = await CoreSites.getSite(siteId); - - // First check if dashboard is disabled. - if (CoreCoursesDashboard.isDisabledInSite(site)) { - return false; - } - - return site.wsAvailable('core_calendar_get_action_events_by_courses') && - site.wsAvailable('core_calendar_get_action_events_by_timesort'); - } - /** * Handles course events, filtering and treating if more can be loaded. * @@ -281,6 +275,16 @@ export class AddonBlockTimelineProvider { }; } + /** + * Returns the timestamp at the start of the day with an optional offset. + * + * @param daysOffset Offset days to add or substract. + * @return timestamp. + */ + getDayStart(daysOffset = 0): number { + return moment().startOf('day').add(daysOffset, 'days').unix(); + } + } export const AddonBlockTimeline = makeSingleton(AddonBlockTimelineProvider); diff --git a/src/addons/blog/blog-lazy.module.ts b/src/addons/blog/blog-lazy.module.ts index 5fab11220..2bd801405 100644 --- a/src/addons/blog/blog-lazy.module.ts +++ b/src/addons/blog/blog-lazy.module.ts @@ -22,6 +22,7 @@ import { CoreCommentsComponentsModule } from '@features/comments/components/comp import { CoreTagComponentsModule } from '@features/tag/components/components.module'; import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; import { AddonBlogMainMenuHandlerService } from './services/handlers/mainmenu'; +import { CoreMainMenuComponentsModule } from '@features/mainmenu/components/components.module'; function buildRoutes(injector: Injector): Routes { return [ @@ -39,6 +40,7 @@ function buildRoutes(injector: Injector): Routes { CoreSharedModule, CoreCommentsComponentsModule, CoreTagComponentsModule, + CoreMainMenuComponentsModule, ], exports: [RouterModule], providers: [ diff --git a/src/addons/blog/blog.module.ts b/src/addons/blog/blog.module.ts index c0fc7aa94..f933599fb 100644 --- a/src/addons/blog/blog.module.ts +++ b/src/addons/blog/blog.module.ts @@ -51,8 +51,7 @@ const routes: Routes = [ { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => async () => { + useValue: () => { CoreContentLinksDelegate.registerHandler(AddonBlogIndexLinkHandler.instance); CoreMainMenuDelegate.registerHandler(AddonBlogMainMenuHandler.instance); CoreUserDelegate.registerHandler(AddonBlogUserHandler.instance); diff --git a/src/addons/blog/pages/entries/entries.html b/src/addons/blog/pages/entries/entries.html index 6dd13b87c..06d703932 100644 --- a/src/addons/blog/pages/entries/entries.html +++ b/src/addons/blog/pages/entries/entries.html @@ -3,21 +3,24 @@ -

{{ title | translate }}

- + +

{{ title | translate }}

+
+ + + - + - {{ 'addon.blog.showonlyyourentries' | translate }} + {{ 'addon.blog.showonlyyourentries' | translate }} - + @@ -25,8 +28,7 @@

- + {{ 'addon.blog.' + entry.publishTranslated! | translate}} @@ -66,8 +68,9 @@

- {{entry.lastmodified | coreTimeAgo}} + {{entry.lastmodified + | + coreTimeAgo}}
diff --git a/src/addons/blog/pages/entries/entries.ts b/src/addons/blog/pages/entries/entries.ts index 1e92dcc30..100eec06b 100644 --- a/src/addons/blog/pages/entries/entries.ts +++ b/src/addons/blog/pages/entries/entries.ts @@ -16,6 +16,7 @@ import { ContextLevel } from '@/core/constants'; import { AddonBlog, AddonBlogFilter, AddonBlogPost, AddonBlogProvider } from '@addons/blog/services/blog'; import { Component, OnInit } from '@angular/core'; import { CoreComments } from '@features/comments/services/comments'; +import { CoreMainMenuDeepLinkManager } from '@features/mainmenu/classes/deep-link-manager'; import { CoreTag } from '@features/tag/services/tag'; import { CoreUser, CoreUserProfile } from '@features/user/services/user'; import { IonRefresher } from '@ionic/angular'; @@ -42,6 +43,7 @@ export class AddonBlogEntriesPage implements OnInit { protected canLoadMoreEntries = false; protected canLoadMoreUserEntries = true; protected siteHomeId: number; + protected fetchSuccess = false; loaded = false; canLoadMore = false; @@ -118,9 +120,10 @@ export class AddonBlogEntriesPage implements OnInit { this.commentsEnabled = !CoreComments.areCommentsDisabledInSite(); this.tagsEnabled = CoreTag.areTagsAvailableInSite(); - await this.fetchEntries(); + const deepLinkManager = new CoreMainMenuDeepLinkManager(); + deepLinkManager.treatLink(); - CoreUtils.ignoreErrors(AddonBlog.logView(this.filter)); + await this.fetchEntries(); } /** @@ -170,15 +173,9 @@ export class AddonBlogEntriesPage implements OnInit { entry.contextInstanceId = entry.userid; } - entry.summary = CoreTextUtils.instance.replacePluginfileUrls(entry.summary, entry.summaryfiles || []); + entry.summary = CoreTextUtils.replacePluginfileUrls(entry.summary, entry.summaryfiles || []); - return CoreUser.getProfile(entry.userid, entry.courseid, true).then((user) => { - entry.user = user; - - return; - }).catch(() => { - // Ignore errors. - }); + entry.user = await CoreUtils.ignoreErrors(CoreUser.getProfile(entry.userid, entry.courseid, true)); }); if (refresh) { @@ -201,6 +198,11 @@ export class AddonBlogEntriesPage implements OnInit { } await Promise.all(promises); + + if (!this.fetchSuccess) { + this.fetchSuccess = true; + CoreUtils.ignoreErrors(AddonBlog.logView(this.filter)); + } } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'addon.blog.errorloadentries', true); this.loadMoreError = true; // Set to prevent infinite calls with infinite-loading. diff --git a/src/addons/blog/services/blog.ts b/src/addons/blog/services/blog.ts index 0b9e77ed8..8e1847d83 100644 --- a/src/addons/blog/services/blog.ts +++ b/src/addons/blog/services/blog.ts @@ -40,11 +40,12 @@ export class AddonBlogProvider { * * @param siteId Site ID. If not defined, current site. * @return Promise resolved with true if enabled, resolved with false or rejected otherwise. + * @since 3.6 */ async isPluginEnabled(siteId?: string): Promise { const site = await CoreSites.getSite(siteId); - return site.wsAvailable('core_blog_get_entries') &&site.canUseAdvancedFeature('enableblogs'); + return site.wsAvailable('core_blog_get_entries') && site.canUseAdvancedFeature('enableblogs'); } /** diff --git a/src/addons/blog/services/handlers/course-option.ts b/src/addons/blog/services/handlers/course-option.ts index c15f4b4de..c935a221d 100644 --- a/src/addons/blog/services/handlers/course-option.ts +++ b/src/addons/blog/services/handlers/course-option.ts @@ -62,7 +62,7 @@ export class AddonBlogCourseOptionHandlerService implements CoreCourseOptionsHan ): Promise { const enabled = await CoreCourseHelper.hasABlockNamed(courseId, 'blog_menu'); - if (enabled && navOptions && typeof navOptions.blogs != 'undefined') { + if (enabled && navOptions && navOptions.blogs !== undefined) { return navOptions.blogs; } diff --git a/src/addons/blog/services/handlers/mainmenu.ts b/src/addons/blog/services/handlers/mainmenu.ts index 6b49a07ec..142a3d679 100644 --- a/src/addons/blog/services/handlers/mainmenu.ts +++ b/src/addons/blog/services/handlers/mainmenu.ts @@ -26,7 +26,7 @@ export class AddonBlogMainMenuHandlerService implements CoreMainMenuHandler { static readonly PAGE_NAME = 'blog'; name = 'AddonBlog'; - priority = 450; + priority = 500; /** * @inheritdoc diff --git a/src/addons/blog/services/handlers/user.ts b/src/addons/blog/services/handlers/user.ts index 5c6d08726..f2b5e75de 100644 --- a/src/addons/blog/services/handlers/user.ts +++ b/src/addons/blog/services/handlers/user.ts @@ -13,8 +13,14 @@ // limitations under the License. import { Injectable } from '@angular/core'; -import { CoreUserProfileHandler, CoreUserProfileHandlerData, CoreUserDelegateService } from '@features/user/services/user-delegate'; +import { + CoreUserProfileHandler, + CoreUserProfileHandlerData, + CoreUserDelegateService, + CoreUserDelegateContext, +} from '@features/user/services/user-delegate'; import { CoreNavigator } from '@services/navigator'; +import { CoreSites } from '@services/sites'; import { makeSingleton } from '@singletons'; import { AddonBlog } from '../blog'; @@ -24,8 +30,8 @@ import { AddonBlog } from '../blog'; @Injectable({ providedIn: 'root' }) export class AddonBlogUserHandlerService implements CoreUserProfileHandler { - name = 'AddonBlog:blogs'; - priority = 300; + name = 'AddonBlog'; // This name doesn't match any disabled feature, they'll be checked in isEnabledForContext. + priority = 200; type = CoreUserDelegateService.TYPE_NEW_PAGE; /** @@ -35,6 +41,27 @@ export class AddonBlogUserHandlerService implements CoreUserProfileHandler { return AddonBlog.isPluginEnabled(); } + /** + * @inheritdoc + */ + async isEnabledForContext(context: CoreUserDelegateContext): Promise { + // Check if feature is disabled. + const currentSite = CoreSites.getCurrentSite(); + if (!currentSite) { + return false; + } + + if (context === CoreUserDelegateContext.USER_MENU) { + if (currentSite.isFeatureDisabled('CoreUserDelegate_AddonBlog:account')) { + return false; + } + } else if (currentSite.isFeatureDisabled('CoreUserDelegate_AddonBlog:blogs')) { + return false; + } + + return true; + } + /** * @inheritdoc */ @@ -43,11 +70,11 @@ export class AddonBlogUserHandlerService implements CoreUserProfileHandler { icon: 'far-newspaper', title: 'addon.blog.blogentries', class: 'addon-blog-handler', - action: (event, user, courseId): void => { + action: (event, user, context, contextId): void => { event.preventDefault(); event.stopPropagation(); CoreNavigator.navigateToSitePath('/blog', { - params: { courseId, userId: user.id }, + params: { courseId: contextId, userId: user.id }, }); }, }; diff --git a/src/addons/calendar/calendar-common.scss b/src/addons/calendar/calendar-common.scss index 771f1987e..3746e7872 100644 --- a/src/addons/calendar/calendar-common.scss +++ b/src/addons/calendar/calendar-common.scss @@ -1,28 +1,27 @@ +@import "~theme/globals"; + :host { - --addon-calendar-blank-day-background-color: var(--gray-lighter); + --addon-calendar-blank-day-background-color: var(--light); .item.addon-calendar-event { > ion-icon { color: white; border-radius: 50%; - padding: 6px; + padding: 0.7rem; + --margin-vertical: 12px; + --margin-end: 12px; + margin-top: var(--margin-vertical); + margin-bottom: var(--margin-vertical); + @include margin-horizontal(null, var(--margin-end)); + } - &.addon-calendar-eventtype-category > ion-icon { - background-color: var(--addon-calendar-event-category-color); - } - &.addon-calendar-eventtype-course > ion-icon { - background-color: var(--addon-calendar-event-course-color); - } - &.addon-calendar-eventtype-group > ion-icon { - background-color: var(--addon-calendar-event-group-color); - } - &.addon-calendar-eventtype-user > ion-icon { - background-color: var(--addon-calendar-event-user-color); - } - &.addon-calendar-eventtype-site > ion-icon { - background-color: var(--addon-calendar-event-site-color); + @each $category, $value in $calendar-event-category-colors { + &.addon-calendar-eventtype-#{$category} > ion-icon { + background-color: $value; + } } } + } diff --git a/src/addons/calendar/calendar-lazy.module.ts b/src/addons/calendar/calendar-lazy.module.ts index 7c6e1658b..c01e053cc 100644 --- a/src/addons/calendar/calendar-lazy.module.ts +++ b/src/addons/calendar/calendar-lazy.module.ts @@ -13,22 +13,11 @@ // limitations under the License. import { Injector, NgModule } from '@angular/core'; -import { Route, RouterModule, ROUTES, Routes } from '@angular/router'; +import { RouterModule, ROUTES, Routes } from '@angular/router'; import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; import { AddonCalendarMainMenuHandlerService } from './services/handlers/mainmenu'; -export const AddonCalendarEditRoute: Route = { - path: 'edit/:eventId', - loadChildren: () => - import('@/addons/calendar/pages/edit-event/edit-event.module').then(m => m.AddonCalendarEditEventPageModule), -}; - -export const AddonCalendarEventRoute: Route ={ - path: 'event/:id', - loadChildren: () => import('@/addons/calendar/pages/event/event.module').then(m => m.AddonCalendarEventPageModule), -}; - function buildRoutes(injector: Injector): Routes { return [ { @@ -36,27 +25,27 @@ function buildRoutes(injector: Injector): Routes { data: { mainMenuTabRoot: AddonCalendarMainMenuHandlerService.PAGE_NAME, }, - loadChildren: () => import('@/addons/calendar/pages/index/index.module').then(m => m.AddonCalendarIndexPageModule), + loadChildren: () => import('@addons/calendar/pages/index/index.module').then(m => m.AddonCalendarIndexPageModule), }, { - path: 'list', - data: { - mainMenuTabRoot: AddonCalendarMainMenuHandlerService.PAGE_NAME, - }, - loadChildren: () => import('@/addons/calendar/pages/list/list.module').then(m => m.AddonCalendarListPageModule), - }, - { - path: 'settings', + path: 'calendar-settings', loadChildren: () => - import('@/addons/calendar/pages/settings/settings.module').then(m => m.AddonCalendarSettingsPageModule), + import('@addons/calendar/pages/settings/settings.module').then(m => m.AddonCalendarSettingsPageModule), }, { path: 'day', loadChildren: () => - import('@/addons/calendar/pages/day/day.module').then(m => m.AddonCalendarDayPageModule), + import('@addons/calendar/pages/day/day.module').then(m => m.AddonCalendarDayPageModule), + }, + { + path: 'event/:id', + loadChildren: () => import('@addons/calendar/pages/event/event.module').then(m => m.AddonCalendarEventPageModule), + }, + { + path: 'edit/:eventId', + loadChildren: () => + import('@addons/calendar/pages/edit-event/edit-event.module').then(m => m.AddonCalendarEditEventPageModule), }, - AddonCalendarEventRoute, - AddonCalendarEditRoute, ...buildTabMainRoutes(injector, { redirectTo: 'index', pathMatch: 'full', diff --git a/src/addons/calendar/calendar.module.ts b/src/addons/calendar/calendar.module.ts index 0017176f0..3f4020e31 100644 --- a/src/addons/calendar/calendar.module.ts +++ b/src/addons/calendar/calendar.module.ts @@ -63,8 +63,7 @@ const mainMenuChildrenRoutes: Routes = [ { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => async () => { + useValue: async () => { CoreContentLinksDelegate.registerHandler(AddonCalendarViewLinkHandler.instance); CoreMainMenuDelegate.registerHandler(AddonCalendarMainMenuHandler.instance); CoreCronDelegate.register(AddonCalendarSyncCronHandler.instance); diff --git a/src/addons/calendar/components/calendar/addon-calendar-calendar.html b/src/addons/calendar/components/calendar/addon-calendar-calendar.html index 93d477d00..21d0bc83d 100644 --- a/src/addons/calendar/components/calendar/addon-calendar-calendar.html +++ b/src/addons/calendar/components/calendar/addon-calendar-calendar.html @@ -1,112 +1,110 @@ - - + + - - - - - - - - - - -

{{ periodName }}

-
- - - - - -
-
- - - -
- - - - {{ day.fullname | translate }} - - + +
+ + + + + + + + + +

+ {{ periodName }} + + +

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

- - {{ day.periodName | translate }} -

- - -

- - -
- -
- - - - - {{ event.timestart * 1000 | coreFormatDate: timeFormat }} - - - - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - - {{event.name}} -
-
-

- {{ 'core.nummore' | translate:{$a: day.filteredEvents.length - 3} }} -

+ + + + +
+ + + + {{ day.fullname | translate }} + + + +
- - - - -
- +
+ + + + + + +

+ + {{ day.periodName | translate }} +

+ + +

+ + +
+ +
+ + + + + {{ event.timestart * 1000 | coreFormatDate: timeFormat }} + + + + {{ 'addon.calendar.type' + event.formattedType | translate }} + + {{ event.iconTitle }} + + + {{event.name}} +
+
+

+ {{ 'core.nummore' | translate:{$a: day.filteredEvents.length - 3} }} +

+
+
+ + + +
+
+ + + +
diff --git a/src/addons/calendar/components/calendar/calendar.scss b/src/addons/calendar/components/calendar/calendar.scss index 4d9303f3b..1fe5598cc 100644 --- a/src/addons/calendar/components/calendar/calendar.scss +++ b/src/addons/calendar/components/calendar/calendar.scss @@ -1,5 +1,12 @@ +@import "~theme/globals"; + :host { - --addon-calendar-blank-day-background-color: var(--gray-lighter); + --addon-calendar-blank-day-background-color: var(--light); + + .core-swipe-slides-container ion-grid { + flex: none; + width: 100%; + } .addon-calendar-navigation { padding-top: 5px; @@ -10,22 +17,22 @@ .addon-calendar-months { background-color: var(--contrast-background); padding: 0; - font-size: 14px; + font-size: var(--text-size); } .addon-calendar-day { border-bottom: 1px solid var(--addon-calendar-border-color); - border-right: 1px solid var(--addon-calendar-border-color); + @include border-end(1px, solid var(--addon-calendar-border-color)); overflow: hidden; min-height: 60px; cursor: pointer; &:first-child { - padding-left: 10px; + @include padding-horizontal(10px, null); } &:last-child { - border-right: 0; - padding-left: 8px; + @include border-end(0); + @include padding-horizontal(8px, null); } &.addon-calendar-event-past-day > .addon-calendar-dot-types, @@ -48,7 +55,7 @@ } } - @media (min-width: 768px) { + @include media-breakpoint-up(md) { .addon-calendar-day-number { text-align: start; } @@ -56,7 +63,7 @@ &.today .addon-calendar-day-number span { border: 2px solid var(--addon-calendar-today-border-color); - line-height: 20px;; + line-height: 20px; border-radius: 50%; } &.dayblank { @@ -82,9 +89,7 @@ } .addon-calendar-day-more { - margin-top: 0.6em; - margin-bottom: 0.6em; - margin-right: 4px; + @include margin(0.6em, null, 0.6em, 4px); } .addon-calendar-dot-types { @@ -98,6 +103,10 @@ margin-top: 10px; font-size: 1.2rem; } + + .addon-calendar-loading-month { + height: 20px; + } } .addon-calendar-weekday { @@ -106,10 +115,10 @@ } .addon-calendar-day-events { - text-align: left; + text-align: start; ion-icon { - margin-right: 2px; + @include margin-horizontal(null, 2px); font-size: 1em; } } @@ -127,66 +136,22 @@ margin-right: 1px; margin-left: 1px; - &.calendar_event_category { - background-color: var(--addon-calendar-event-category-color); - } - &.calendar_event_course { - background-color: var(--addon-calendar-event-course-color); - } - &.calendar_event_group { - background-color: var(--addon-calendar-event-group-color); - } - &.calendar_event_user { - background-color: var(--addon-calendar-event-user-color); - } - &.calendar_event_site { - background-color: var(--addon-calendar-event-site-color); + @each $category, $value in $calendar-event-category-colors { + &.calendar_event_#{$category} { + background-color: $value; + } } } - .core-module-icon { - margin-right: 1px; - margin-left: 1px; - --size: 16px; - display: inline-block; - vertical-align: bottom; - } - .core-module-icon[slot="start"] { - padding: 6px; - } -} - -:host-context([dir=rtl]) { - .addon-calendar-day-events { - text-align: right; - - ion-icon { - margin-right: unset; - margin-left: 2px; - } - } - - .addon-calendar-day { - border-left: 1px solid var(--addon-calendar-border-color); - border-right: unset; - - &:first-child { - padding-right: 10px; - padding-left: unset; - } - &:last-child { - border-left: 0; - border-right: unset; - padding-right: 8px; - padding-left: unset; - } - .addon-calendar-day-more { - margin-left: 4px; - margin-right: unset; - } + ion-slide { + display: block; + font-size: inherit; + justify-content: start; + align-items: start; + text-align: start; } } :host-context(body.dark) { - --addon-calendar-blank-day-background-color: var(--black); + --addon-calendar-blank-day-background-color: var(--gray-900); } diff --git a/src/addons/calendar/components/calendar/calendar.ts b/src/addons/calendar/components/calendar/calendar.ts index c6e97072a..f60aff1ce 100644 --- a/src/addons/calendar/components/calendar/calendar.ts +++ b/src/addons/calendar/components/calendar/calendar.ts @@ -22,6 +22,8 @@ import { EventEmitter, KeyValueDiffers, KeyValueDiffer, + ViewChild, + HostBinding, } from '@angular/core'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreSites } from '@services/sites'; @@ -40,7 +42,13 @@ import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calenda import { AddonCalendarOffline } from '../../services/calendar-offline'; import { CoreCategoryData, CoreCourses } from '@features/courses/services/courses'; import { CoreApp } from '@services/app'; -import { CoreLocalNotifications } from '@services/local-notifications'; +import { CoreSwipeSlidesComponent } from '@components/swipe-slides/swipe-slides'; +import { + CoreSwipeSlidesDynamicItem, + CoreSwipeSlidesDynamicItemsManagerSource, +} from '@classes/items-management/swipe-slides-dynamic-items-manager-source'; +import { CoreSwipeSlidesDynamicItemsManager } from '@classes/items-management/swipe-slides-dynamic-items-manager'; +import moment from 'moment'; /** * Component that displays a calendar. @@ -52,54 +60,31 @@ import { CoreLocalNotifications } from '@services/local-notifications'; }) export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestroy { + @ViewChild(CoreSwipeSlidesComponent) slides?: CoreSwipeSlidesComponent; + @Input() initialYear?: number; // Initial year to load. @Input() initialMonth?: number; // Initial month to load. @Input() filter?: AddonCalendarFilter; // Filter to apply. + @Input() hidden?: boolean; // Whether the component is hidden. @Input() canNavigate?: string | boolean; // Whether to include arrows to change the month. Defaults to true. @Input() displayNavButtons?: string | boolean; // Whether to display nav buttons created by this component. Defaults to true. @Output() onEventClicked = new EventEmitter(); @Output() onDayClicked = new EventEmitter<{day: number; month: number; year: number}>(); periodName?: string; - weekDays: AddonCalendarWeekDaysTranslationKeys[] = []; - weeks: AddonCalendarWeek[] = []; + manager?: CoreSwipeSlidesDynamicItemsManager; loaded = false; - timeFormat?: string; - isCurrentMonth = false; - isPastMonth = false; - protected year?: number; - protected month?: number; - protected categoriesRetrieved = false; - protected categories: { [id: number]: CoreCategoryData } = {}; protected currentSiteId: string; - protected offlineEvents: { [monthId: string]: { [day: number]: AddonCalendarEventToDisplay[] } } = - {}; // Offline events classified in month & day. - - protected offlineEditedEventsIds: number[] = []; // IDs of events edited in offline. - protected deletedEvents: number[] = []; // Events deleted in offline. - protected currentTime?: number; - protected differ: KeyValueDiffer; // To detect changes in the data input. - // Observers. + protected hiddenDiffer?: boolean; // To detect changes in the hidden input. + protected filterDiffer: KeyValueDiffer; // To detect changes in the filters input. + // Observers and listeners. protected undeleteEventObserver: CoreEventObserver; - protected obsDefaultTimeChange?: CoreEventObserver; + protected managerUnsubscribe?: () => void; - constructor( - differs: KeyValueDiffers, - ) { + constructor(differs: KeyValueDiffers) { this.currentSiteId = CoreSites.getCurrentSiteId(); - if (CoreLocalNotifications.isAvailable()) { - // Re-schedule events if default time changes. - this.obsDefaultTimeChange = CoreEvents.on(AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_CHANGED, () => { - this.weeks.forEach((week) => { - week.days.forEach((day) => { - AddonCalendar.scheduleEventsNotifications(day.eventsFormated!); - }); - }); - }, this.currentSiteId); - } - // Listen for events "undeleted" (offline). this.undeleteEventObserver = CoreEvents.on( AddonCalendarProvider.UNDELETED_EVENT_EVENT, @@ -112,27 +97,40 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro this.undeleteEvent(data.eventId); // Remove it from the list of deleted events if it's there. - const index = this.deletedEvents.indexOf(data.eventId); + const index = this.manager?.getSource().deletedEvents.indexOf(data.eventId) ?? -1; if (index != -1) { - this.deletedEvents.splice(index, 1); + this.manager?.getSource().deletedEvents.splice(index, 1); } }, this.currentSiteId, ); - this.differ = differs.find([]).create(); + this.hiddenDiffer = this.hidden; + this.filterDiffer = differs.find(this.filter ?? {}).create(); + } + + @HostBinding('attr.hidden') get hiddenAttribute(): string | null { + return this.hidden ? 'hidden' : null; } /** * Component loaded. */ ngOnInit(): void { - const now = new Date(); + this.canNavigate = typeof this.canNavigate == 'undefined' ? true : CoreUtils.isTrueOrOne(this.canNavigate); + this.displayNavButtons = typeof this.displayNavButtons == 'undefined' ? true : + CoreUtils.isTrueOrOne(this.displayNavButtons); - this.year = this.initialYear ? this.initialYear : now.getFullYear(); - this.month = this.initialMonth ? this.initialMonth : now.getMonth() + 1; - - this.calculateIsCurrentMonth(); + const source = new AddonCalendarMonthSlidesItemsManagerSource(this, moment({ + year: this.initialYear, + month: this.initialMonth ? this.initialMonth - 1 : undefined, + })); + this.manager = new CoreSwipeSlidesDynamicItemsManager(source); + this.managerUnsubscribe = this.manager.addListener({ + onSelectedItemUpdated: (item) => { + this.onMonthViewed(item); + }, + }); this.fetchData(); } @@ -141,17 +139,31 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro * Detect and act upon changes that Angular can’t or won’t detect on its own (objects and arrays). */ ngDoCheck(): void { - this.canNavigate = typeof this.canNavigate == 'undefined' ? true : CoreUtils.isTrueOrOne(this.canNavigate); - this.displayNavButtons = typeof this.displayNavButtons == 'undefined' ? true : - CoreUtils.isTrueOrOne(this.displayNavButtons); + const items = this.manager?.getSource().getItems(); - if (this.weeks) { + if (items?.length) { // Check if there's any change in the filter object. - const changes = this.differ.diff(this.filter!); + const changes = this.filterDiffer.diff(this.filter ?? {}); if (changes) { - this.filterEvents(); + items.forEach((month) => { + if (month.loaded && month.weeks) { + this.manager?.getSource().filterEvents(month.weeks, this.filter); + } + }); } } + + if (this.hiddenDiffer !== this.hidden) { + this.hiddenDiffer = this.hidden; + + if (!this.hidden) { + this.slides?.slides?.getSwiper().then(swipper => swipper.update()); + } + } + } + + get timeFormat(): string { + return this.manager?.getSource().timeFormat || 'core.strftimetime'; } /** @@ -160,41 +172,10 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro * @return Promise resolved when done. */ async fetchData(): Promise { - const promises: Promise[] = []; - - promises.push(this.loadCategories()); - - // Get offline events. - promises.push(AddonCalendarOffline.getAllEditedEvents().then((events) => { - // Classify them by month. - this.offlineEvents = AddonCalendarHelper.classifyIntoMonths(events); - - // Get the IDs of events edited in offline. - const filtered = events.filter((event) => event.id! > 0); - this.offlineEditedEventsIds = filtered.map((event) => event.id!); - - return; - })); - - // Get events deleted in offline. - promises.push(AddonCalendarOffline.getAllDeletedEventsIds().then((ids) => { - this.deletedEvents = ids; - - return; - })); - - // Get time format to use. - promises.push(AddonCalendar.getCalendarTimeFormat().then((value) => { - this.timeFormat = value; - - return; - })); - try { - await Promise.all(promises); - - await this.fetchEvents(); + await this.manager?.getSource().fetchData(); + await this.manager?.getSource().load(this.manager?.getSelectedItem()); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); } @@ -203,113 +184,16 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro } /** - * Fetch the events for current month. + * Update data related to month being viewed. * - * @return Promise resolved when done. + * @param month Month being viewed. */ - async fetchEvents(): Promise { - // Don't pass courseId and categoryId, we'll filter them locally. - let result: { daynames: Partial[]; weeks: Partial[] }; - try { - result = await AddonCalendar.getMonthlyEvents(this.year!, this.month!); - } catch (error) { - if (!CoreApp.isOnline()) { - // Allow navigating to non-cached months in offline (behave as if using emergency cache). - result = await AddonCalendarHelper.getOfflineMonthWeeks(this.year!, this.month!); - } else { - throw error; - } - } - + onMonthViewed(month: MonthBasicData): void { // Calculate the period name. We don't use the one in result because it's in server's language. this.periodName = CoreTimeUtils.userDate( - new Date(this.year!, this.month! - 1).getTime(), + month.moment.unix() * 1000, 'core.strftimemonthyear', ); - this.weekDays = AddonCalendar.getWeekDays(result.daynames[0].dayno); - this.weeks = result.weeks as AddonCalendarWeek[]; - this.calculateIsCurrentMonth(); - - this.weeks.forEach((week) => { - week.days.forEach((day) => { - day.periodName = CoreTimeUtils.userDate( - new Date(this.year!, this.month! - 1, day.mday).getTime(), - 'core.strftimedaydate', - ); - day.eventsFormated = day.eventsFormated || []; - day.filteredEvents = day.filteredEvents || []; - day.events.forEach((event) => { - /// Format online events. - day.eventsFormated!.push(AddonCalendarHelper.formatEventData(event)); - }); - }); - }); - - if (this.isCurrentMonth) { - const currentDay = new Date().getDate(); - let isPast = true; - - this.weeks.forEach((week) => { - week.days.forEach((day) => { - day.istoday = day.mday == currentDay; - day.ispast = isPast && !day.istoday; - isPast = day.ispast; - - if (day.istoday) { - day.eventsFormated!.forEach((event) => { - event.ispast = this.isEventPast(event); - }); - } - }); - }); - } - // Merge the online events with offline data. - this.mergeEvents(); - // Filter events by course. - this.filterEvents(); - } - - /** - * Load categories to be able to filter events. - * - * @return Promise resolved when done. - */ - protected async loadCategories(): Promise { - if (this.categoriesRetrieved) { - // Already retrieved, stop. - return; - } - - try { - const cats = await CoreCourses.getCategories(0, true); - this.categoriesRetrieved = true; - this.categories = {}; - - // Index categories by ID. - cats.forEach((category) => { - this.categories[category.id] = category; - }); - } catch { - // Ignore errors. - } - } - - /** - * Filter events based on the filter popover. - */ - filterEvents(): void { - this.weeks.forEach((week) => { - week.days.forEach((day) => { - day.filteredEvents = AddonCalendarHelper.getFilteredEvents( - day.eventsFormated!, - this.filter!, - this.categories, - ); - - // Re-calculate some properties. - AddonCalendarHelper.calculateDayData(day, day.filteredEvents); - }); - }); } /** @@ -318,55 +202,30 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro * @param afterChange Whether the refresh is done after an event has changed or has been synced. * @return Promise resolved when done. */ - async refreshData(afterChange?: boolean): Promise { - const promises: Promise[] = []; + async refreshData(afterChange = false): Promise { + const selectedMonth = this.manager?.getSelectedItem() || null; - // Don't invalidate monthly events after a change, it has already been handled. - if (!afterChange) { - promises.push(AddonCalendar.invalidateMonthlyEvents(this.year!, this.month!)); + if (afterChange) { + this.manager?.getSource().markAllItemsDirty(); } - promises.push(CoreCourses.invalidateCategories(0, true)); - promises.push(AddonCalendar.invalidateTimeFormat()); - this.categoriesRetrieved = false; // Get categories again. + await this.manager?.getSource().invalidateContent(selectedMonth); - await Promise.all(promises); - - this.fetchData(); + await this.fetchData(); } /** * Load next month. */ - async loadNext(): Promise { - this.increaseMonth(); - - this.loaded = false; - - try { - await this.fetchEvents(); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - this.decreaseMonth(); - } - this.loaded = true; + loadNext(): void { + this.slides?.slideNext(); } /** * Load previous month. */ - async loadPrevious(): Promise { - this.decreaseMonth(); - - this.loaded = false; - - try { - await this.fetchEvents(); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - this.increaseMonth(); - } - this.loaded = true; + loadPrevious(): void { + this.slides?.slidePrev(); } /** @@ -386,106 +245,53 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro * @param day Day. */ dayClicked(day: number): void { - this.onDayClicked.emit({ day: day, month: this.month!, year: this.year! }); - } + const selectedMonth = this.manager?.getSelectedItem(); + if (!selectedMonth) { + return; + } - /** - * Check if user is viewing the current month. - */ - calculateIsCurrentMonth(): void { - const now = new Date(); - - this.currentTime = CoreTimeUtils.timestamp(); - - this.isCurrentMonth = this.year == now.getFullYear() && this.month == now.getMonth() + 1; - this.isPastMonth = this.year! < now.getFullYear() || (this.year == now.getFullYear() && this.month! < now.getMonth() + 1); + this.onDayClicked.emit({ day: day, month: selectedMonth.moment.month() + 1, year: selectedMonth.moment.year() }); } /** * Go to current month. */ async goToCurrentMonth(): Promise { - const now = new Date(); - const initialMonth = this.month; - const initialYear = this.year; - - this.month = now.getMonth() + 1; - this.year = now.getFullYear(); + const manager = this.manager; + const slides = this.slides; + if (!manager || !slides) { + return; + } + const currentMonth = { + moment: moment(), + }; this.loaded = false; try { - await this.fetchEvents(); - this.isCurrentMonth = true; + // Make sure the day is loaded. + await manager.getSource().loadItem(currentMonth); + + slides.slideToItem(currentMonth); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - this.year = initialYear; - this.month = initialMonth; - } - - this.loaded = true; - } - - /** - * Decrease the current month. - */ - protected decreaseMonth(): void { - if (this.month === 1) { - this.month = 12; - this.year!--; - } else { - this.month!--; + } finally { + this.loaded = true; } } /** - * Increase the current month. + * Check whether selected month is loaded. */ - protected increaseMonth(): void { - if (this.month === 12) { - this.month = 1; - this.year!++; - } else { - this.month!++; - } + selectedMonthLoaded(): boolean { + return !!this.manager?.getSelectedItem()?.loaded; } /** - * Merge online events with the offline events of that period. + * Check whether selected month is current month. */ - protected mergeEvents(): void { - const monthOfflineEvents: { [day: number]: AddonCalendarEventToDisplay[] } = - this.offlineEvents[AddonCalendarHelper.getMonthId(this.year!, this.month!)]; - - this.weeks.forEach((week) => { - week.days.forEach((day) => { - - // Schedule notifications for the events retrieved (only future events will be scheduled). - AddonCalendar.scheduleEventsNotifications(day.eventsFormated!); - - if (monthOfflineEvents || this.deletedEvents.length) { - // There is offline data, merge it. - - if (this.deletedEvents.length) { - // Mark as deleted the events that were deleted in offline. - day.eventsFormated!.forEach((event) => { - event.deleted = this.deletedEvents.indexOf(event.id) != -1; - }); - } - - if (this.offlineEditedEventsIds.length) { - // Remove the online events that were modified in offline. - day.events = day.events.filter((event) => this.offlineEditedEventsIds.indexOf(event.id) == -1); - } - - if (monthOfflineEvents && monthOfflineEvents[day.mday]) { - // Add the offline events (either new or edited). - day.eventsFormated = - AddonCalendarHelper.sortEvents(day.eventsFormated!.concat(monthOfflineEvents[day.mday])); - } - } - }); - }); + selectedMonthIsCurrent(): boolean { + return !!this.manager?.getSelectedItem()?.isCurrentMonth; } /** @@ -493,17 +299,293 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro * * @param eventId Event ID. */ - protected undeleteEvent(eventId: number): void { - if (!this.weeks) { - return; - } + protected async undeleteEvent(eventId: number): Promise { + this.manager?.getSource().getItems()?.some((month) => { + if (!month.loaded) { + return false; + } - this.weeks.forEach((week) => { - week.days.forEach((day) => { - const event = day.eventsFormated!.find((event) => event.id == eventId); + return month.weeks?.some((week) => week.days.some((day) => { + const event = day.eventsFormated?.find((event) => event.id == eventId); if (event) { event.deleted = false; + + return true; + } + + return false; + })); + }); + } + + /** + * Component destroyed. + */ + ngOnDestroy(): void { + this.undeleteEventObserver?.off(); + this.manager?.destroy(); + this.managerUnsubscribe && this.managerUnsubscribe(); + } + +} + +/** + * Basic data to identify a month. + */ +type MonthBasicData = { + moment: moment.Moment; +}; + +/** + * Preloaded month. + */ +type PreloadedMonth = MonthBasicData & CoreSwipeSlidesDynamicItem & { + weekDays?: AddonCalendarWeekDaysTranslationKeys[]; + weeks?: AddonCalendarWeek[]; + isCurrentMonth?: boolean; + isPastMonth?: boolean; +}; + +/** + * Helper to manage swiping within months. + */ +class AddonCalendarMonthSlidesItemsManagerSource extends CoreSwipeSlidesDynamicItemsManagerSource { + + categories?: { [id: number]: CoreCategoryData }; + // Offline events classified in month & day. + offlineEvents: { [monthId: string]: { [day: number]: AddonCalendarEventToDisplay[] } } = {}; + offlineEditedEventsIds: number[] = []; // IDs of events edited in offline. + deletedEvents: number[] = []; // Events deleted in offline. + timeFormat?: string; + + protected calendarComponent: AddonCalendarCalendarComponent; + + constructor(component: AddonCalendarCalendarComponent, initialMoment: moment.Moment) { + super({ moment: initialMoment }); + + this.calendarComponent = component; + } + + /** + * Fetch data. + * + * @return Promise resolved when done. + */ + async fetchData(): Promise { + await Promise.all([ + this.loadCategories(), + this.loadOfflineEvents(), + this.loadOfflineDeletedEvents(), + this.loadTimeFormat(), + ]); + } + + /** + * Filter events based on the filter popover. + * + * @param weeks Weeks with the events to filter. + * @param filter Filter to apply. + */ + filterEvents(weeks: AddonCalendarWeek[], filter?: AddonCalendarFilter): void { + weeks.forEach((week) => { + week.days.forEach((day) => { + day.filteredEvents = AddonCalendarHelper.getFilteredEvents( + day.eventsFormated || [], + filter, + this.categories || {}, + ); + + // Re-calculate some properties. + AddonCalendarHelper.calculateDayData(day, day.filteredEvents); + }); + }); + } + + /** + * Load categories to be able to filter events. + * + * @return Promise resolved when done. + */ + async loadCategories(): Promise { + if (this.categories) { + // Already retrieved, stop. + return; + } + + try { + const categories = await CoreCourses.getCategories(0, true); + + // Index categories by ID. + this.categories = CoreUtils.arrayToObject(categories, 'id'); + } catch { + // Ignore errors. + } + } + + /** + * Load events created or edited in offline. + * + * @return Promise resolved when done. + */ + async loadOfflineEvents(): Promise { + // Get offline events. + const events = await AddonCalendarOffline.getAllEditedEvents(); + + // Classify them by month. + this.offlineEvents = AddonCalendarHelper.classifyIntoMonths(events); + + // Get the IDs of events edited in offline. + this.offlineEditedEventsIds = events.filter((event) => event.id > 0).map((event) => event.id); + } + + /** + * Load events deleted in offline. + * + * @return Promise resolved when done. + */ + async loadOfflineDeletedEvents(): Promise { + this.deletedEvents = await AddonCalendarOffline.getAllDeletedEventsIds(); + } + + /** + * Load time format. + * + * @return Promise resolved when done. + */ + async loadTimeFormat(): Promise { + this.timeFormat = await AddonCalendar.getCalendarTimeFormat(); + } + + /** + * @inheritdoc + */ + getItemId(item: MonthBasicData): string | number { + return AddonCalendarHelper.getMonthId(item.moment); + } + + /** + * @inheritdoc + */ + getPreviousItem(item: MonthBasicData): MonthBasicData | null { + return { + moment: item.moment.clone().subtract(1, 'month'), + }; + } + + /** + * @inheritdoc + */ + getNextItem(item: MonthBasicData): MonthBasicData | null { + return { + moment: item.moment.clone().add(1, 'month'), + }; + } + + /** + * @inheritdoc + */ + async loadItemData(month: MonthBasicData, preload = false): Promise { + // Load or preload the weeks. + let result: { daynames: Partial[]; weeks: Partial[] }; + const year = month.moment.year(); + const monthNumber = month.moment.month() + 1; + + if (preload) { + result = await AddonCalendarHelper.getOfflineMonthWeeks(year, monthNumber); + } else { + try { + // Don't pass courseId and categoryId, we'll filter them locally. + result = await AddonCalendar.getMonthlyEvents(year, monthNumber); + } catch (error) { + if (!CoreApp.isOnline()) { + // Allow navigating to non-cached months in offline (behave as if using emergency cache). + result = await AddonCalendarHelper.getOfflineMonthWeeks(year, monthNumber); + } else { + throw error; + } + } + } + + const weekDays = AddonCalendar.getWeekDays(result.daynames[0].dayno); + const weeks = result.weeks as AddonCalendarWeek[]; + const currentDay = new Date().getDate(); + const currentTime = CoreTimeUtils.timestamp(); + + const preloadedMonth: PreloadedMonth = { + ...month, + weeks, + weekDays, + isCurrentMonth: month.moment.isSame(moment(), 'month'), + isPastMonth: month.moment.isBefore(moment(), 'month'), + }; + + await Promise.all(weeks.map(async (week) => { + await Promise.all(week.days.map(async (day) => { + day.periodName = CoreTimeUtils.userDate( + month.moment.unix() * 1000, + 'core.strftimedaydate', + ); + day.eventsFormated = day.eventsFormated || []; + day.filteredEvents = day.filteredEvents || []; + // Format online events. + const onlineEventsFormatted = await Promise.all( + day.events.map(async (event) => AddonCalendarHelper.formatEventData(event)), + ); + + day.eventsFormated = day.eventsFormated.concat(onlineEventsFormatted); + + if (preloadedMonth.isCurrentMonth) { + day.istoday = day.mday == currentDay; + day.ispast = preloadedMonth.isPastMonth || day.mday < currentDay; + + if (day.istoday) { + day.eventsFormated?.forEach((event) => { + event.ispast = this.isEventPast(event, currentTime); + }); + } + } + })); + })); + + if (!preload) { + // Merge the online events with offline data. + this.mergeEvents(month, weeks); + // Filter events by course. + this.filterEvents(weeks, this.calendarComponent.filter); + } + + return preloadedMonth; + } + + /** + * Merge online events with the offline events of that period. + * + * @param month Month. + * @param weeks Weeks with the events to filter. + */ + mergeEvents(month: MonthBasicData, weeks: AddonCalendarWeek[]): void { + const monthOfflineEvents: { [day: number]: AddonCalendarEventToDisplay[] } = + this.offlineEvents[AddonCalendarHelper.getMonthId(month.moment)]; + + weeks.forEach((week) => { + week.days.forEach((day) => { + if (this.deletedEvents.length) { + // Mark as deleted the events that were deleted in offline. + day.eventsFormated?.forEach((event) => { + event.deleted = this.deletedEvents.indexOf(event.id) != -1; + }); + } + + if (this.offlineEditedEventsIds.length) { + // Remove the online events that were modified in offline. + day.events = day.events.filter((event) => this.offlineEditedEventsIds.indexOf(event.id) == -1); + } + + if (monthOfflineEvents && monthOfflineEvents[day.mday] && day.eventsFormated) { + // Add the offline events (either new or edited). + day.eventsFormated = + AddonCalendarHelper.sortEvents(day.eventsFormated.concat(monthOfflineEvents[day.mday])); } }); }); @@ -513,18 +595,35 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro * Returns if the event is in the past or not. * * @param event Event object. + * @param currentTime Current time. * @return True if it's in the past. */ - protected isEventPast(event: { timestart: number; timeduration: number}): boolean { - return (event.timestart + event.timeduration) < this.currentTime!; + isEventPast(event: { timestart: number; timeduration: number}, currentTime: number): boolean { + return (event.timestart + event.timeduration) < currentTime; } /** - * Component destroyed. + * Invalidate content. + * + * @param selectedMonth The current selected month. + * @return Promise resolved when done. */ - ngOnDestroy(): void { - this.undeleteEventObserver?.off(); - this.obsDefaultTimeChange?.off(); + async invalidateContent(selectedMonth: PreloadedMonth | null): Promise { + const promises: Promise[] = []; + + if (selectedMonth) { + promises.push(AddonCalendar.invalidateMonthlyEvents(selectedMonth.moment.year(), selectedMonth.moment.month() + 1)); + } + promises.push(CoreCourses.invalidateCategories(0, true)); + promises.push(AddonCalendar.invalidateTimeFormat()); + + this.categories = undefined; // Get categories again. + + if (selectedMonth) { + selectedMonth.dirty = true; + } + + await Promise.all(promises); } } diff --git a/src/addons/calendar/components/components.module.ts b/src/addons/calendar/components/components.module.ts index 22b2b7100..68b2bdee2 100644 --- a/src/addons/calendar/components/components.module.ts +++ b/src/addons/calendar/components/components.module.ts @@ -18,13 +18,15 @@ import { CoreSharedModule } from '@/core/shared.module'; import { AddonCalendarCalendarComponent } from './calendar/calendar'; import { AddonCalendarUpcomingEventsComponent } from './upcoming-events/upcoming-events'; -import { AddonCalendarFilterPopoverComponent } from './filter/filter'; +import { AddonCalendarFilterComponent } from './filter/filter'; +import { AddonCalendarReminderTimeModalComponent } from './reminder-time-modal/reminder-time-modal'; @NgModule({ declarations: [ AddonCalendarCalendarComponent, AddonCalendarUpcomingEventsComponent, - AddonCalendarFilterPopoverComponent, + AddonCalendarFilterComponent, + AddonCalendarReminderTimeModalComponent, ], imports: [ CoreSharedModule, @@ -34,7 +36,8 @@ import { AddonCalendarFilterPopoverComponent } from './filter/filter'; exports: [ AddonCalendarCalendarComponent, AddonCalendarUpcomingEventsComponent, - AddonCalendarFilterPopoverComponent, + AddonCalendarFilterComponent, + AddonCalendarReminderTimeModalComponent, ], }) export class AddonCalendarComponentsModule {} diff --git a/src/addons/calendar/components/filter/addon-calendar-filter-popover.html b/src/addons/calendar/components/filter/addon-calendar-filter-popover.html deleted file mode 100644 index 590a32b27..000000000 --- a/src/addons/calendar/components/filter/addon-calendar-filter-popover.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - {{ 'addon.calendar.' + type + 'events' | translate}} - - - - - - - - - - - - diff --git a/src/addons/calendar/components/filter/filter-popover.scss b/src/addons/calendar/components/filter/filter-popover.scss deleted file mode 100644 index 904ccbfab..000000000 --- a/src/addons/calendar/components/filter/filter-popover.scss +++ /dev/null @@ -1,21 +0,0 @@ -:host { - ion-item { - ion-icon, ion-radio { - margin-right: 8px; - } - - > ion-icon { - padding: 4px; - font-size: 20px; - } - } -} - -:host-context([dir=rtl]) { - ion-item { - ion-icon, ion-radio { - margin-left: 8px; - margin-right: unset; - } - } -} diff --git a/src/addons/calendar/components/filter/filter.html b/src/addons/calendar/components/filter/filter.html new file mode 100644 index 000000000..c49826ce1 --- /dev/null +++ b/src/addons/calendar/components/filter/filter.html @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + {{ 'addon.calendar.' + type + 'events' | translate}} + + + + + + + + + + + + + + + diff --git a/src/addons/calendar/components/filter/filter.scss b/src/addons/calendar/components/filter/filter.scss new file mode 100644 index 000000000..29e652dd0 --- /dev/null +++ b/src/addons/calendar/components/filter/filter.scss @@ -0,0 +1,14 @@ +@import "~theme/globals"; + +:host { + ion-item { + ion-icon, ion-radio { + @include margin-horizontal(null, 8px); + } + + > ion-icon { + padding: 4px; + font-size: 20px; + } + } +} diff --git a/src/addons/calendar/components/filter/filter.ts b/src/addons/calendar/components/filter/filter.ts index 8827846c5..9d25721b2 100644 --- a/src/addons/calendar/components/filter/filter.ts +++ b/src/addons/calendar/components/filter/filter.ts @@ -15,6 +15,7 @@ import { Component, Input, OnInit } from '@angular/core'; import { CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreUtils } from '@services/utils/utils'; +import { ModalController } from '@singletons'; import { CoreEvents } from '@singletons/events'; import { AddonCalendarEventType, AddonCalendarProvider } from '../../services/calendar'; import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/calendar-helper'; @@ -23,11 +24,11 @@ import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/cal * Component to display the events filter that includes events types and a list of courses. */ @Component({ - selector: 'addon-calendar-filter-popover', - templateUrl: 'addon-calendar-filter-popover.html', - styleUrls: ['../../calendar-common.scss', 'filter-popover.scss'], + selector: 'addon-calendar-filter', + templateUrl: 'filter.html', + styleUrls: ['../../calendar-common.scss', 'filter.scss'], }) -export class AddonCalendarFilterPopoverComponent implements OnInit { +export class AddonCalendarFilterComponent implements OnInit { @Input() filter: AddonCalendarFilter = { filtered: false, @@ -56,7 +57,7 @@ export class AddonCalendarFilterPopoverComponent implements OnInit { } /** - * Init the component. + * @inheritdoc */ ngOnInit(): void { this.courseId = this.filter.courseId || -1; @@ -80,4 +81,11 @@ export class AddonCalendarFilterPopoverComponent implements OnInit { CoreEvents.trigger(AddonCalendarProvider.FILTER_CHANGED_EVENT, this.filter); } + /** + * Close modal. + */ + closeModal(): void { + ModalController.dismiss(); + } + } diff --git a/src/addons/calendar/components/reminder-time-modal/reminder-time-modal.html b/src/addons/calendar/components/reminder-time-modal/reminder-time-modal.html new file mode 100644 index 000000000..1071b92d9 --- /dev/null +++ b/src/addons/calendar/components/reminder-time-modal/reminder-time-modal.html @@ -0,0 +1,62 @@ + + + +

{{ 'addon.calendar.reminders' | translate }}

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

{{ 'core.settings.disabled' | translate }}

+
+ +
+ + +

{{ option.label }}

+
+ +
+ + + + +

{{ 'core.custom' | translate }}

+
+ +
+ + + +
+ + + + + + + + + {{ option.label | translate }} + + +
+
+
+ + + {{ 'core.done' | translate }} + +
+
diff --git a/src/addons/calendar/components/reminder-time-modal/reminder-time-modal.ts b/src/addons/calendar/components/reminder-time-modal/reminder-time-modal.ts new file mode 100644 index 000000000..1a10a9c27 --- /dev/null +++ b/src/addons/calendar/components/reminder-time-modal/reminder-time-modal.ts @@ -0,0 +1,174 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { AddonCalendar, AddonCalendarReminderUnits, AddonCalendarValueAndUnit } from '@addons/calendar/services/calendar'; +import { Component, Input, OnInit } from '@angular/core'; +import { CoreDomUtils } from '@services/utils/dom'; +import { ModalController } from '@singletons'; + +/** + * Modal to choose a reminder time. + */ +@Component({ + selector: 'addon-calendar-new-reminder-modal', + templateUrl: 'reminder-time-modal.html', +}) +export class AddonCalendarReminderTimeModalComponent implements OnInit { + + @Input() initialValue?: AddonCalendarValueAndUnit; + @Input() allowDisable?: boolean; + + radioValue = '5m'; + customValue = '10'; + customUnits = AddonCalendarReminderUnits.MINUTE; + + presetOptions = [ + { + radioValue: '5m', + value: 5, + unit: AddonCalendarReminderUnits.MINUTE, + label: '', + }, + { + radioValue: '10m', + value: 10, + unit: AddonCalendarReminderUnits.MINUTE, + label: '', + }, + { + radioValue: '30m', + value: 30, + unit: AddonCalendarReminderUnits.MINUTE, + label: '', + }, + { + radioValue: '1h', + value: 1, + unit: AddonCalendarReminderUnits.HOUR, + label: '', + }, + { + radioValue: '12h', + value: 12, + unit: AddonCalendarReminderUnits.HOUR, + label: '', + }, + { + radioValue: '1d', + value: 1, + unit: AddonCalendarReminderUnits.DAY, + label: '', + }, + ]; + + customUnitsOptions = [ + { + value: AddonCalendarReminderUnits.MINUTE, + label: 'core.minutes', + }, + { + value: AddonCalendarReminderUnits.HOUR, + label: 'core.hours', + }, + { + value: AddonCalendarReminderUnits.DAY, + label: 'core.days', + }, + { + value: AddonCalendarReminderUnits.WEEK, + label: 'core.weeks', + }, + ]; + + /** + * @inheritdoc + */ + async ngOnInit(): Promise { + this.presetOptions.forEach((option) => { + option.label = AddonCalendar.getUnitValueLabel(option.value, option.unit); + }); + + if (!this.initialValue) { + return; + } + + if (this.initialValue.value === 0) { + this.radioValue = 'disabled'; + } else { + // Search if it's one of the preset options. + const option = this.presetOptions.find(option => + option.value === this.initialValue?.value && option.unit === this.initialValue.unit); + + if (option) { + this.radioValue = option.radioValue; + } else { + // It's a custom value. + this.radioValue = 'custom'; + this.customValue = String(this.initialValue.value); + this.customUnits = this.initialValue.unit; + } + } + } + + /** + * Close the modal. + */ + closeModal(): void { + ModalController.dismiss(); + } + + /** + * Save the reminder. + */ + saveReminder(): void { + if (this.radioValue === 'disabled') { + ModalController.dismiss(0); + } else if (this.radioValue === 'custom') { + const value = parseInt(this.customValue, 10); + if (!value) { + CoreDomUtils.showErrorModal('core.errorinvalidform', true); + + return; + } + + ModalController.dismiss(Math.abs(value) * this.customUnits); + } else { + const option = this.presetOptions.find(option => option.radioValue === this.radioValue); + if (!option) { + return; + } + + ModalController.dismiss(option.unit * option.value); + } + } + + /** + * Custom value input clicked. + * + * @param ev Click event. + */ + async customInputClicked(ev: Event): Promise { + if (this.radioValue === 'custom') { + return; + } + + this.radioValue = 'custom'; + + const target = ev.target; + if (target) { + CoreDomUtils.focusElement(target); + } + } + +} diff --git a/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html b/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html index 315e8e624..ef63f7816 100644 --- a/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html +++ b/src/addons/calendar/components/upcoming-events/addon-calendar-upcoming-events.html @@ -2,35 +2,37 @@ - + - - - - - - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - -

- -

-

-
- - - {{ 'core.notsent' | translate }} - - - - {{ 'core.deletedoffline' | translate }} - -
+ + + + + + + + {{ 'addon.calendar.type' + event.formattedType | translate }} + {{ event.iconTitle }} + +

+ +

+

+
+ + + {{ 'core.notsent' | translate }} + + + + {{ 'core.deletedoffline' | translate }} + +
+
diff --git a/src/addons/calendar/components/upcoming-events/upcoming-events.ts b/src/addons/calendar/components/upcoming-events/upcoming-events.ts index ae0448d60..8740e28fa 100644 --- a/src/addons/calendar/components/upcoming-events/upcoming-events.ts +++ b/src/addons/calendar/components/upcoming-events/upcoming-events.ts @@ -25,7 +25,6 @@ import { AddonCalendarHelper, AddonCalendarFilter } from '../../services/calenda import { AddonCalendarOffline } from '../../services/calendar-offline'; import { CoreCategoryData, CoreCourses } from '@features/courses/services/courses'; import { CoreConstants } from '@/core/constants'; -import { CoreLocalNotifications } from '@services/local-notifications'; /** * Component that displays upcoming events. @@ -58,19 +57,12 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On // Observers. protected undeleteEventObserver: CoreEventObserver; - protected obsDefaultTimeChange?: CoreEventObserver; constructor( differs: KeyValueDiffers, ) { this.currentSiteId = CoreSites.getCurrentSiteId(); - if (CoreLocalNotifications.isAvailable()) { // Re-schedule events if default time changes. - this.obsDefaultTimeChange = CoreEvents.on(AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_CHANGED, () => { - AddonCalendar.scheduleEventsNotifications(this.onlineEvents); - }, this.currentSiteId); - } - // Listen for events "undeleted" (offline). this.undeleteEventObserver = CoreEvents.on( AddonCalendarProvider.UNDELETED_EVENT_EVENT, @@ -106,7 +98,7 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On */ ngDoCheck(): void { // Check if there's any change in the filter object. - const changes = this.differ.diff(this.filter!); + const changes = this.differ.diff(this.filter || {}); if (changes) { this.filterEvents(); } @@ -173,9 +165,7 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On async fetchEvents(): Promise { // Don't pass courseId and categoryId, we'll filter them locally. const result = await AddonCalendar.getUpcomingEvents(); - this.onlineEvents = result.events.map((event) => AddonCalendarHelper.formatEventData(event)); - // Schedule notifications for the events retrieved. - AddonCalendar.scheduleEventsNotifications(this.onlineEvents); + this.onlineEvents = await Promise.all(result.events.map((event) => AddonCalendarHelper.formatEventData(event))); // Merge the online events with offline data. this.events = this.mergeEvents(); // Filter events by course. @@ -183,7 +173,7 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On // Re-calculate the formatted time so it uses the device date. const promises = this.events.map((event) => - AddonCalendar.formatEventTime(event, this.timeFormat!).then((time) => { + AddonCalendar.formatEventTime(event, this.timeFormat).then((time) => { event.formattedtime = time; return; @@ -221,22 +211,18 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On * Filter events based on the filter popover. */ protected filterEvents(): void { - this.filteredEvents = AddonCalendarHelper.getFilteredEvents(this.events, this.filter!, this.categories); + this.filteredEvents = AddonCalendarHelper.getFilteredEvents(this.events, this.filter, this.categories); } /** * Refresh events. * - * @param afterChange Whether the refresh is done after an event has changed or has been synced. * @return Promise resolved when done. */ - async refreshData(afterChange?: boolean): Promise { + async refreshData(): Promise { const promises: Promise[] = []; - // Don't invalidate upcoming events after a change, it has already been handled. - if (!afterChange) { - promises.push(AddonCalendar.invalidateAllUpcomingEvents()); - } + promises.push(AddonCalendar.invalidateAllUpcomingEvents()); promises.push(CoreCourses.invalidateCategories(0, true)); promises.push(AddonCalendar.invalidateLookAhead()); promises.push(AddonCalendar.invalidateTimeFormat()); @@ -317,7 +303,6 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On */ ngOnDestroy(): void { this.undeleteEventObserver?.off(); - this.obsDefaultTimeChange?.off(); } } diff --git a/src/addons/calendar/lang.json b/src/addons/calendar/lang.json index 8b1748f6b..a71e8921b 100644 --- a/src/addons/calendar/lang.json +++ b/src/addons/calendar/lang.json @@ -41,6 +41,7 @@ "noevents": "There are no events", "nopermissiontoupdatecalendar": "Sorry, but you do not have permission to update the calendar event.", "reminders": "Reminders", + "units": "Units", "repeatedevents": "Repeated events", "repeateditall": "Also apply changes to the other {{$a}} events in this repeat series", "repeateditthis": "Apply changes to this event only", @@ -54,6 +55,7 @@ "sunday": "Sunday", "thu": "Thu", "thursday": "Thursday", + "timebefore": "{{value}} {{units}} before", "today": "Today", "tomorrow": "Tomorrow", "tue": "Tue", @@ -73,4 +75,4 @@ "wednesday": "Wednesday", "when": "When", "yesterday": "Yesterday" -} \ No newline at end of file +} diff --git a/src/addons/calendar/pages/day/day.html b/src/addons/calendar/pages/day/day.html index 9f4b23431..fba17f45a 100644 --- a/src/addons/calendar/pages/day/day.html +++ b/src/addons/calendar/pages/day/day.html @@ -3,18 +3,20 @@ -

{{ 'addon.calendar.calendarevents' | translate }}

+ +

{{ 'addon.calendar.calendarevents' | translate }}

+
- + - - + @@ -25,69 +27,83 @@ - - - - - - - - - -

{{ periodName }}

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

{{ periodName }}

+
+ + + + + +
+
- - - - - - {{ 'core.hasdatatosync' | translate:{$a: 'core.day' | translate} }} - - + + + + + + + + {{ 'core.hasdatatosync' | translate:{$a: 'core.day' | translate} }} + + - - + + - - - - - - - - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - -

- -

-

-
- - - {{ 'core.notsent' | translate }} - - - - {{ 'core.deletedoffline' | translate }} - -
-
-
+ + + + + + + + + + + {{ 'addon.calendar.type' + event.formattedType | translate }} + {{ event.iconTitle + }} + +

+ +

+

+
+ + + {{ 'core.notsent' | translate }} + + + + {{ 'core.deletedoffline' | translate }} + +
+
+
+
+
+
+
+
diff --git a/src/addons/calendar/pages/day/day.page.ts b/src/addons/calendar/pages/day/day.page.ts index 2d26cf281..36746c630 100644 --- a/src/addons/calendar/pages/day/day.page.ts +++ b/src/addons/calendar/pages/day/day.page.ts @@ -12,11 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, OnDestroy } from '@angular/core'; +import { Component, OnInit, OnDestroy, ViewChild } from '@angular/core'; import { IonRefresher } from '@ionic/angular'; import { CoreApp } from '@services/app'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; -import { CoreLocalNotifications } from '@services/local-notifications'; import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreTimeUtils } from '@services/utils/time'; @@ -32,7 +31,7 @@ import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calenda import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync'; import { CoreCategoryData, CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreCoursesHelper } from '@features/courses/services/courses-helper'; -import { AddonCalendarFilterPopoverComponent } from '../../components/filter/filter'; +import { AddonCalendarFilterComponent } from '../../components/filter/filter'; import moment from 'moment'; import { Network, NgZone } from '@singletons'; import { CoreNavigator } from '@services/navigator'; @@ -40,6 +39,12 @@ import { Params } from '@angular/router'; import { Subscription } from 'rxjs'; import { CoreUtils } from '@services/utils/utils'; import { CoreConstants } from '@/core/constants'; +import { CoreSwipeSlidesDynamicItemsManager } from '@classes/items-management/swipe-slides-dynamic-items-manager'; +import { CoreSwipeSlidesComponent } from '@components/swipe-slides/swipe-slides'; +import { + CoreSwipeSlidesDynamicItem, + CoreSwipeSlidesDynamicItemsManagerSource, +} from '@classes/items-management/swipe-slides-dynamic-items-manager-source'; /** * Page that displays the calendar events for a certain day. @@ -51,20 +56,9 @@ import { CoreConstants } from '@/core/constants'; }) export class AddonCalendarDayPage implements OnInit, OnDestroy { - protected currentSiteId: string; - protected year!: number; - protected month!: number; - protected day!: number; - protected categories: { [id: number]: CoreCategoryData } = {}; - protected events: AddonCalendarEventToDisplay[] = []; // Events (both online and offline). - protected onlineEvents: AddonCalendarEventToDisplay[] = []; - protected offlineEvents: { [monthId: string]: { [day: number]: AddonCalendarEventToDisplay[] } } = - {}; // Offline events classified in month & day. + @ViewChild(CoreSwipeSlidesComponent) slides?: CoreSwipeSlidesComponent; - protected offlineEditedEventsIds: number[] = []; // IDs of events edited in offline. - protected deletedEvents: number[] = []; // Events deleted in offline. - protected timeFormat?: string; - protected currentTime!: number; + protected currentSiteId: string; // Observers. protected newEventObserver: CoreEventObserver; @@ -75,20 +69,14 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { protected syncObserver: CoreEventObserver; protected manualSyncObserver: CoreEventObserver; protected onlineObserver: Subscription; - protected obsDefaultTimeChange?: CoreEventObserver; protected filterChangedObserver: CoreEventObserver; + protected managerUnsubscribe?: () => void; periodName?: string; - filteredEvents: AddonCalendarEventToDisplay [] = []; - canCreate = false; - courses: Partial[] = []; + manager?: CoreSwipeSlidesDynamicItemsManager; loaded = false; - hasOffline = false; isOnline = false; syncIcon = CoreConstants.ICON_LOADING; - isCurrentDay = false; - isPastDay = false; - currentMoment!: moment.Moment; filter: AddonCalendarFilter = { filtered: false, courseId: undefined, @@ -103,19 +91,12 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { constructor() { this.currentSiteId = CoreSites.getCurrentSiteId(); - if (CoreLocalNotifications.isAvailable()) { - // Re-schedule events if default time changes. - this.obsDefaultTimeChange = CoreEvents.on(AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_CHANGED, () => { - AddonCalendar.scheduleEventsNotifications(this.onlineEvents); - }, this.currentSiteId); - } - // Listen for events added. When an event is added, reload the data. this.newEventObserver = CoreEvents.on( AddonCalendarProvider.NEW_EVENT_EVENT, (data) => { if (data && data.eventId) { - this.loaded = false; + this.manager?.getSource().markAllItemsUnloaded(); this.refreshData(true, true); } }, @@ -124,7 +105,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { // Listen for new event discarded event. When it does, reload the data. this.discardedObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => { - this.loaded = false; + this.manager?.getSource().markAllItemsUnloaded(); this.refreshData(true, true); }, this.currentSiteId); @@ -133,7 +114,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { AddonCalendarProvider.EDIT_EVENT_EVENT, (data) => { if (data && data.eventId) { - this.loaded = false; + this.manager?.getSource().markAllItemsUnloaded(); this.refreshData(true, true); } }, @@ -142,14 +123,15 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { // Refresh data if calendar events are synchronized automatically. this.syncObserver = CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => { - this.loaded = false; + this.manager?.getSource().markAllItemsUnloaded(); this.refreshData(false, true); }, this.currentSiteId); // Refresh data if calendar events are synchronized manually but not by this page. this.manualSyncObserver = CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => { - if (data && (data.source != 'day' || data.year != this.year || data.month != this.month || data.day != this.day)) { - this.loaded = false; + const selectedDay = this.manager?.getSelectedItem(); + if (data && (data.source != 'day' || !selectedDay || !data.moment || !selectedDay.moment.isSame(data.moment, 'day'))) { + this.manager?.getSource().markAllItemsUnloaded(); this.refreshData(false, true); } }, this.currentSiteId); @@ -160,10 +142,9 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { (data) => { if (data && !data.sent) { // Event was deleted in offline. Just mark it as deleted, no need to refresh. - this.hasOffline = this.markAsDeleted(data.eventId, true) || this.hasOffline; - this.deletedEvents.push(data.eventId); + this.manager?.getSource().markAsDeleted(data.eventId, true); } else { - this.loaded = false; + this.manager?.getSource().markAllItemsUnloaded(); this.refreshData(false, true); } }, @@ -179,26 +160,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { } // Mark it as undeleted, no need to refresh. - const found = this.markAsDeleted(data.eventId, false); - - // Remove it from the list of deleted events if it's there. - const index = this.deletedEvents.indexOf(data.eventId); - if (index != -1) { - this.deletedEvents.splice(index, 1); - } - - if (found) { - // The deleted event belongs to current list. Re-calculate "hasOffline". - this.hasOffline = false; - - if (this.events.length != this.onlineEvents.length) { - this.hasOffline = true; - } else { - const event = this.events.find((event) => event.deleted || event.offline); - - this.hasOffline = !!event; - } - } + this.manager?.getSource().markAsDeleted(data.eventId, false); }, this.currentSiteId, ); @@ -209,9 +171,9 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { this.filter = data; // Course viewed has changed, check if the user can create events for this course calendar. - this.canCreate = await AddonCalendarHelper.canEditEvents(this.filter.courseId); + await this.manager?.getSource().loadCanCreate(this.filter.courseId); - this.filterEvents(); + this.manager?.getSource().filterAllDayEvents(this.filter); }, ); @@ -238,19 +200,32 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { this.filter.courseId = CoreNavigator.getRouteNumberParam('courseId'); this.filter.categoryId = CoreNavigator.getRouteNumberParam('categoryId'); - this.filter.filtered = typeof this.filter.courseId != 'undefined' || types.some((name) => !this.filter[name]); + this.filter.filtered = this.filter.courseId !== undefined || types.some((name) => !this.filter[name]); - const now = new Date(); - this.year = CoreNavigator.getRouteNumberParam('year') || now.getFullYear(); - this.month = CoreNavigator.getRouteNumberParam('month') || (now.getMonth() + 1); - this.day = CoreNavigator.getRouteNumberParam('day') || now.getDate(); - - this.calculateCurrentMoment(); - this.calculateIsCurrentDay(); + const month = CoreNavigator.getRouteNumberParam('month'); + const source = new AddonCalendarDaySlidesItemsManagerSource(this, moment({ + year: CoreNavigator.getRouteNumberParam('year'), + month: month ? month - 1 : undefined, + date: CoreNavigator.getRouteNumberParam('day'), + })); + this.manager = new CoreSwipeSlidesDynamicItemsManager(source); + this.managerUnsubscribe = this.manager.addListener({ + onSelectedItemUpdated: (item) => { + this.onDayViewed(item); + }, + }); this.fetchData(true); } + get canCreate(): boolean { + return this.manager?.getSource().canCreate || false; + } + + get timeFormat(): string { + return this.manager?.getSource().timeFormat || 'core.strftimetime'; + } + /** * Fetch all the data required for the view. * @@ -259,7 +234,6 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { * @return Promise resolved when done. */ async fetchData(sync?: boolean): Promise { - this.syncIcon = CoreConstants.ICON_LOADING; this.isOnline = CoreApp.isOnline(); @@ -268,53 +242,9 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { } try { - const promises: Promise[] = []; + await this.manager?.getSource().fetchData(this.filter.courseId); - // Load courses for the popover. - promises.push(CoreCoursesHelper.getCoursesForPopover(this.filter.courseId).then((data) => { - this.courses = data.courses; - - return; - })); - - // Get categories. - promises.push(this.loadCategories()); - - // Get offline events. - promises.push(AddonCalendarOffline.getAllEditedEvents().then((offlineEvents) => { - // Classify them by month & day. - this.offlineEvents = AddonCalendarHelper.classifyIntoMonths(offlineEvents); - - // Get the IDs of events edited in offline. - this.offlineEditedEventsIds = offlineEvents.filter((event) => event.id! > 0).map((event) => event.id!); - - return; - })); - - // Get events deleted in offline. - promises.push(AddonCalendarOffline.getAllDeletedEventsIds().then((ids) => { - this.deletedEvents = ids; - - return; - })); - - // Check if user can create events. - promises.push(AddonCalendarHelper.canEditEvents(this.filter.courseId).then((canEdit) => { - this.canCreate = canEdit; - - return; - })); - - // Get user preferences. - promises.push(AddonCalendar.getCalendarTimeFormat().then((value) => { - this.timeFormat = value; - - return; - })); - - await Promise.all(promises); - - await this.fetchEvents(); + await this.manager?.getSource().load(this.manager?.getSelectedItem()); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); } @@ -324,104 +254,15 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { } /** - * Fetch the events for current day. + * Update data related to day being viewed. * - * @return Promise resolved when done. + * @param day Day viewed. */ - async fetchEvents(): Promise { - let result: AddonCalendarCalendarDay; - try { - // Don't pass courseId and categoryId, we'll filter them locally. - result = await AddonCalendar.getDayEvents(this.year, this.month, this.day); - this.onlineEvents = result.events.map((event) => AddonCalendarHelper.formatEventData(event)); - } catch (error) { - if (CoreApp.isOnline()) { - throw error; - } - // Allow navigating to non-cached days in offline (behave as if using emergency cache). - this.onlineEvents = []; - } - - // Calculate the period name. We don't use the one in result because it's in server's language. + onDayViewed(day: DayBasicData): void { this.periodName = CoreTimeUtils.userDate( - new Date(this.year, this.month - 1, this.day).getTime(), + day.moment.unix() * 1000, 'core.strftimedaydate', ); - - // Schedule notifications for the events retrieved (only future events will be scheduled). - AddonCalendar.scheduleEventsNotifications(this.onlineEvents); - // Merge the online events with offline data. - this.events = this.mergeEvents(); - // Filter events by course. - this.filterEvents(); - this.calculateIsCurrentDay(); - // Re-calculate the formatted time so it uses the device date. - const dayTime = this.currentMoment.unix() * 1000; - - const promises = this.events.map((event) => { - event.ispast = this.isPastDay || (this.isCurrentDay && this.isEventPast(event)); - - return AddonCalendar.formatEventTime(event, this.timeFormat!, true, dayTime).then((time) => { - event.formattedtime = time; - - return; - }); - }); - - await Promise.all(promises); - } - - /** - * Merge online events with the offline events of that period. - * - * @return Merged events. - */ - protected mergeEvents(): AddonCalendarEventToDisplay[] { - this.hasOffline = false; - - if (!Object.keys(this.offlineEvents).length && !this.deletedEvents.length) { - // No offline events, nothing to merge. - return this.onlineEvents; - } - - const monthOfflineEvents = this.offlineEvents[AddonCalendarHelper.getMonthId(this.year, this.month)]; - const dayOfflineEvents = monthOfflineEvents && monthOfflineEvents[this.day]; - let result = this.onlineEvents; - - if (this.deletedEvents.length) { - // Mark as deleted the events that were deleted in offline. - result.forEach((event) => { - event.deleted = this.deletedEvents.indexOf(event.id) != -1; - - if (event.deleted) { - this.hasOffline = true; - } - }); - } - - if (this.offlineEditedEventsIds.length) { - // Remove the online events that were modified in offline. - result = result.filter((event) => this.offlineEditedEventsIds.indexOf(event.id) == -1); - - if (result.length != this.onlineEvents.length) { - this.hasOffline = true; - } - } - - if (dayOfflineEvents && dayOfflineEvents.length) { - // Add the offline events (either new or edited). - this.hasOffline = true; - result = AddonCalendarHelper.sortEvents(result.concat(dayOfflineEvents)); - } - - return result; - } - - /** - * Filter events based on the filter popover. - */ - protected filterEvents(): void { - this.filteredEvents = AddonCalendarHelper.getFilteredEvents(this.events, this.filter, this.categories); } /** @@ -452,37 +293,12 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { async refreshData(sync?: boolean, afterChange?: boolean): Promise { this.syncIcon = CoreConstants.ICON_LOADING; - const promises: Promise[] = []; + const selectedDay = this.manager?.getSelectedItem() || null; // Don't invalidate day events after a change, it has already been handled. - if (!afterChange) { - promises.push(AddonCalendar.invalidateDayEvents(this.year, this.month, this.day)); - } - promises.push(AddonCalendar.invalidateAllowedEventTypes()); - promises.push(CoreCourses.invalidateCategories(0, true)); - promises.push(AddonCalendar.invalidateTimeFormat()); + await this.manager?.getSource().invalidateContent(selectedDay, !afterChange); - await Promise.all(promises).finally(() => - this.fetchData(sync)); - } - - /** - * Load categories to be able to filter events. - * - * @return Promise resolved when done. - */ - protected async loadCategories(): Promise { - try { - const cats = await CoreCourses.getCategories(0, true); - this.categories = {}; - - // Index categories by ID. - cats.forEach((category) => { - this.categories[category.id] = category; - }); - } catch { - // Ignore errors. - } + await this.fetchData(sync); } /** @@ -501,11 +317,11 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { if (result.updated) { // Trigger a manual sync event. + const selectedDay = this.manager?.getSelectedItem(); result.source = 'day'; - result.day = this.day; - result.month = this.month; - result.year = this.year; + result.moment = selectedDay?.moment; + this.manager?.getSource().markAllItemsUnloaded(); CoreEvents.trigger(AddonCalendarSyncProvider.MANUAL_SYNCED, result, this.currentSiteId); } } catch (error) { @@ -515,33 +331,32 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { } } + /** + * Check whether selected day is current day. + */ + selectedDayIsCurrent(): boolean { + return !!this.manager?.getSelectedItem()?.isCurrentDay; + } + /** * Navigate to a particular event. * * @param eventId Event to load. */ gotoEvent(eventId: number): void { - if (eventId < 0) { - // It's an offline event, go to the edit page. - this.openEdit(eventId); - } else { - CoreNavigator.navigateToSitePath(`/calendar/event/${eventId}`); - } + CoreNavigator.navigateToSitePath(`/calendar/event/${eventId}`); } /** - * Show the context menu. - * - * @param event Event. + * Show the filter menu. */ - async openFilter(event: MouseEvent): Promise { - await CoreDomUtils.openPopover({ - component: AddonCalendarFilterPopoverComponent, + async openFilter(): Promise { + await CoreDomUtils.openSideModal({ + component: AddonCalendarFilterComponent, componentProps: { - courses: this.courses, + courses: this.manager?.getSource().courses, filter: this.filter, }, - event, }); } @@ -556,7 +371,13 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { if (!eventId) { // It's a new event, set the time. eventId = 0; - params.timestamp = moment().year(this.year).month(this.month - 1).date(this.day).unix() * 1000; + + const selectedDay = this.manager?.getSelectedItem(); + if (selectedDay) { + // Use current time but in the specified day. + const now = moment(); + params.timestamp = selectedDay.moment.clone().set({ hour: now.hour(), minute: now.minute() }).unix() * 1000; + } } if (this.filter.courseId) { @@ -567,140 +388,55 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { } /** - * Calculate current moment. + * Check whether selected day has offline data. + * + * @return Whether selected day has offline data. */ - calculateCurrentMoment(): void { - this.currentMoment = moment().year(this.year).month(this.month - 1).date(this.day); - } + selectedDayHasOffline(): boolean { + const selectedDay = this.manager?.getSelectedItem(); - /** - * Check if user is viewing the current day. - */ - calculateIsCurrentDay(): void { - const now = new Date(); - - this.currentTime = CoreTimeUtils.timestamp(); - - this.isCurrentDay = this.year == now.getFullYear() && this.month == now.getMonth() + 1 && this.day == now.getDate(); - this.isPastDay = this.year < now.getFullYear() || (this.year == now.getFullYear() && this.month < now.getMonth()) || - (this.year == now.getFullYear() && this.month == now.getMonth() + 1 && this.day < now.getDate()); + return !!(selectedDay?.hasOffline); } /** * Go to current day. */ async goToCurrentDay(): Promise { - const now = new Date(); - const initialDay = this.day; - const initialMonth = this.month; - const initialYear = this.year; - - this.day = now.getDate(); - this.month = now.getMonth() + 1; - this.year = now.getFullYear(); - this.calculateCurrentMoment(); + const manager = this.manager; + const slides = this.slides; + if (!manager || !slides) { + return; + } + const currentDay = { + moment: moment(), + }; this.loaded = false; try { - await this.fetchEvents(); + // Make sure the day is loaded. + await manager.getSource().loadItem(currentDay); - this.isCurrentDay = true; + slides.slideToItem(currentDay); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - - this.year = initialYear; - this.month = initialMonth; - this.day = initialDay; - this.calculateCurrentMoment(); + } finally { + this.loaded = true; } - - this.loaded = true; } /** * Load next day. */ async loadNext(): Promise { - this.increaseDay(); - - this.loaded = false; - - try { - await this.fetchEvents(); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - this.decreaseDay(); - } - this.loaded = true; + this.slides?.slideNext(); } /** * Load previous day. */ async loadPrevious(): Promise { - this.decreaseDay(); - - this.loaded = false; - - try { - await this.fetchEvents(); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - this.increaseDay(); - } - this.loaded = true; - } - - /** - * Decrease the current day. - */ - protected decreaseDay(): void { - this.currentMoment.subtract(1, 'day'); - - this.year = this.currentMoment.year(); - this.month = this.currentMoment.month() + 1; - this.day = this.currentMoment.date(); - } - - /** - * Increase the current day. - */ - protected increaseDay(): void { - this.currentMoment.add(1, 'day'); - - this.year = this.currentMoment.year(); - this.month = this.currentMoment.month() + 1; - this.day = this.currentMoment.date(); - } - - /** - * Find an event and mark it as deleted. - * - * @param eventId Event ID. - * @param deleted Whether to mark it as deleted or not. - * @return Whether the event was found. - */ - protected markAsDeleted(eventId: number, deleted: boolean): boolean { - const event = this.onlineEvents.find((event) => event.id == eventId); - - if (event) { - event.deleted = deleted; - - return true; - } - - return false; - } - - /** - * Returns if the event is in the past or not. - * - * @param event Event object. - * @return True if it's in the past. - */ - isEventPast(event: AddonCalendarEventToDisplay): boolean { - return (event.timestart + event.timeduration) < this.currentTime; + this.slides?.slidePrev(); } /** @@ -716,7 +452,368 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy { this.manualSyncObserver?.off(); this.onlineObserver?.unsubscribe(); this.filterChangedObserver?.off(); - this.obsDefaultTimeChange?.off(); + this.manager?.destroy(); + this.managerUnsubscribe && this.managerUnsubscribe(); + } + +} + +/** + * Basic data to identify a day. + */ +type DayBasicData = { + moment: moment.Moment; +}; + +/** + * Preloaded month. + */ +type PreloadedDay = DayBasicData & CoreSwipeSlidesDynamicItem & { + events?: AddonCalendarEventToDisplay[]; // Events (both online and offline). + onlineEvents?: AddonCalendarEventToDisplay[]; + filteredEvents?: AddonCalendarEventToDisplay[]; + isCurrentDay?: boolean; + isPastDay?: boolean; + hasOffline?: boolean; // Whether the day has offline data. +}; + +/** + * Helper to manage swiping within days. + */ +class AddonCalendarDaySlidesItemsManagerSource extends CoreSwipeSlidesDynamicItemsManagerSource { + + courses: Partial[] = []; + // Offline events classified in month & day. + offlineEvents: Record> = {}; + offlineEditedEventsIds: number[] = []; // IDs of events edited in offline. + categories?: { [id: number]: CoreCategoryData }; + deletedEvents?: Set; // Events deleted in offline. + timeFormat?: string; + canCreate = false; + + protected dayPage: AddonCalendarDayPage; + + constructor(page: AddonCalendarDayPage, initialMoment: moment.Moment) { + super({ moment: initialMoment }); + + this.dayPage = page; + } + + /** + * Fetch data. + * + * @param courseId Current selected course id (if any). + * @return Promise resolved when done. + */ + async fetchData(courseId?: number): Promise { + await Promise.all([ + this.loadCourses(courseId), + this.loadCanCreate(courseId), + this.loadCategories(), + this.loadOfflineEvents(), + this.loadOfflineDeletedEvents(), + this.loadTimeFormat(), + ]); + } + + /** + * Filter all loaded days events based on the filter popover. + * + * @param filter Filter to apply. + */ + filterAllDayEvents(filter: AddonCalendarFilter): void { + this.getItems()?.forEach(day => this.filterEvents(day, filter)); + } + + /** + * Filter events of a certain day based on the filter popover. + * + * @param day Day with the events. + * @param filter Filter to apply. + */ + filterEvents(day: PreloadedDay, filter: AddonCalendarFilter): void { + day.filteredEvents = AddonCalendarHelper.getFilteredEvents(day.events || [], filter, this.categories || {}); + } + + /** + * Load courses. + * + * @param courseId Current selected course id (if any). + * @return Promise resolved when done. + */ + async loadCourses(courseId?: number): Promise { + const data = await CoreCoursesHelper.getCoursesForPopover(courseId); + + this.courses = data.courses; + } + + /** + * Load whether user can create events. + * + * @param courseId Current selected course id (if any). + * @return Promise resolved when done. + */ + async loadCanCreate(courseId?: number): Promise { + this.canCreate = await AddonCalendarHelper.canEditEvents(courseId); + } + + /** + * Load categories to be able to filter events. + * + * @return Promise resolved when done. + */ + async loadCategories(): Promise { + if (this.categories) { + // Already retrieved, stop. + return; + } + + try { + const categories = await CoreCourses.getCategories(0, true); + + // Index categories by ID. + this.categories = CoreUtils.arrayToObject(categories, 'id'); + } catch { + // Ignore errors. + } + } + + /** + * Load events created or edited in offline. + * + * @return Promise resolved when done. + */ + async loadOfflineEvents(): Promise { + // Get offline events. + const events = await AddonCalendarOffline.getAllEditedEvents(); + + // Classify them by month & day. + this.offlineEvents = AddonCalendarHelper.classifyIntoMonths(events); + + // Get the IDs of events edited in offline. + this.offlineEditedEventsIds = events.filter((event) => event.id > 0).map((event) => event.id); + } + + /** + * Load events deleted in offline. + * + * @return Promise resolved when done. + */ + async loadOfflineDeletedEvents(): Promise { + const deletedEventsIds = await AddonCalendarOffline.getAllDeletedEventsIds(); + + this.deletedEvents = new Set(deletedEventsIds); + } + + /** + * Load time format. + * + * @return Promise resolved when done. + */ + async loadTimeFormat(): Promise { + this.timeFormat = await AddonCalendar.getCalendarTimeFormat(); + } + + /** + * @inheritdoc + */ + getItemId(item: DayBasicData): string | number { + return AddonCalendarHelper.getDayId(item.moment); + } + + /** + * @inheritdoc + */ + getPreviousItem(item: DayBasicData): DayBasicData | null { + return { + moment: item.moment.clone().subtract(1, 'day'), + }; + } + + /** + * @inheritdoc + */ + getNextItem(item: DayBasicData): DayBasicData | null { + return { + moment: item.moment.clone().add(1, 'day'), + }; + } + + /** + * @inheritdoc + */ + async loadItemData(day: DayBasicData, preload = false): Promise { + const preloadedDay: PreloadedDay = { + ...day, + hasOffline: false, + events: [], + onlineEvents: [], + filteredEvents: [], + isCurrentDay: day.moment.isSame(moment(), 'day'), + isPastDay: day.moment.isBefore(moment(), 'day'), + }; + + if (preload) { + return preloadedDay; + } + + let result: AddonCalendarCalendarDay; + + try { + // Don't pass courseId and categoryId, we'll filter them locally. + result = await AddonCalendar.getDayEvents(day.moment.year(), day.moment.month() + 1, day.moment.date()); + preloadedDay.onlineEvents = await Promise.all( + result.events.map((event) => AddonCalendarHelper.formatEventData(event)), + ); + } catch (error) { + // Allow navigating to non-cached days in offline (behave as if using emergency cache). + if (CoreApp.isOnline()) { + throw error; + } + } + + // Merge the online events with offline data. + preloadedDay.events = this.mergeEvents(preloadedDay); + + // Filter events by course. + this.filterEvents(preloadedDay, this.dayPage.filter); + + // Re-calculate the formatted time so it uses the device date. + const dayTime = day.moment.unix() * 1000; + const currentTime = CoreTimeUtils.timestamp(); + + const promises = preloadedDay.events.map(async (event) => { + event.ispast = preloadedDay.isPastDay || (preloadedDay.isCurrentDay && this.isEventPast(event, currentTime)); + event.formattedtime = await AddonCalendar.formatEventTime(event, this.dayPage.timeFormat, true, dayTime); + }); + + await Promise.all(promises); + + return preloadedDay; + } + + /** + * Returns if the event is in the past or not. + * + * @param event Event object. + * @param currentTime Current time. + * @return True if it's in the past. + */ + isEventPast(event: AddonCalendarEventToDisplay, currentTime: number): boolean { + return (event.timestart + event.timeduration) < currentTime; + } + + /** + * Merge online events with the offline events of that period. + * + * @param day Day with the events. + * @return Merged events. + */ + mergeEvents(day: PreloadedDay): AddonCalendarEventToDisplay[] { + day.hasOffline = false; + + if (!Object.keys(this.offlineEvents).length && !this.deletedEvents?.size) { + // No offline events, nothing to merge. + return day.onlineEvents || []; + } + + const monthOfflineEvents = this.offlineEvents[AddonCalendarHelper.getMonthId(day.moment)]; + const dayOfflineEvents = monthOfflineEvents && monthOfflineEvents[day.moment.date()]; + let result = day.onlineEvents || []; + + if (this.deletedEvents?.size) { + // Mark as deleted the events that were deleted in offline. + result.forEach((event) => { + event.deleted = this.deletedEvents?.has(event.id); + + if (event.deleted) { + day.hasOffline = true; + } + }); + } + + if (this.offlineEditedEventsIds.length) { + // Remove the online events that were modified in offline. + result = result.filter((event) => this.offlineEditedEventsIds.indexOf(event.id) == -1); + + if (result.length != day.onlineEvents?.length) { + day.hasOffline = true; + } + } + + if (dayOfflineEvents && dayOfflineEvents.length) { + // Add the offline events (either new or edited). + day.hasOffline = true; + result = AddonCalendarHelper.sortEvents(result.concat(dayOfflineEvents)); + } + + return result; + } + + /** + * Invalidate content. + * + * @param selectedDay The current selected day. + * @param invalidateDayEvents Whether to invalidate selected day events. + * @return Promise resolved when done. + */ + async invalidateContent(selectedDay: PreloadedDay | null, invalidateDayEvents?: boolean): Promise { + const promises: Promise[] = []; + + if (invalidateDayEvents && selectedDay) { + promises.push(AddonCalendar.invalidateDayEvents( + selectedDay.moment.year(), + selectedDay.moment.month() + 1, + selectedDay.moment.date(), + )); + } + promises.push(AddonCalendar.invalidateAllowedEventTypes()); + promises.push(CoreCourses.invalidateCategories(0, true)); + promises.push(AddonCalendar.invalidateTimeFormat()); + + this.categories = undefined; // Get categories again. + + if (selectedDay) { + selectedDay.dirty = true; + } + + await Promise.all(promises); + } + + /** + * Find an event and mark it as deleted. + * + * @param eventId Event ID. + * @param deleted Whether to mark it as deleted or not. + */ + markAsDeleted(eventId: number, deleted: boolean): void { + // Mark the event as deleted or not. + this.getItems()?.some(day => { + const event = day.onlineEvents?.find((event) => event.id == eventId); + + if (!event) { + return false; + } + + event.deleted = deleted; + + if (deleted) { + day.hasOffline = true; + } else { + // Re-calculate "hasOffline". + day.hasOffline = day.events?.length != day.onlineEvents?.length || + day.events?.some((event) => event.deleted || event.offline); + } + + return true; + }); + + // Add it or remove it from the list of deleted events. + if (deleted) { + this.deletedEvents?.add(eventId); + } else { + this.deletedEvents?.delete(eventId); + } } } diff --git a/src/addons/calendar/pages/day/day.scss b/src/addons/calendar/pages/day/day.scss index a2b9031b0..145eccfb8 100644 --- a/src/addons/calendar/pages/day/day.scss +++ b/src/addons/calendar/pages/day/day.scss @@ -1,4 +1,9 @@ :host { + .core-swipe-slides-container ion-grid { + flex: none; + width: 100%; + } + .addon-calendar-period { flex-grow: 3; h3 { diff --git a/src/addons/calendar/pages/edit-event/edit-event.html b/src/addons/calendar/pages/edit-event/edit-event.html index 859291287..fe0a30baa 100644 --- a/src/addons/calendar/pages/edit-event/edit-event.html +++ b/src/addons/calendar/pages/edit-event/edit-event.html @@ -3,7 +3,9 @@ -

{{ title | translate }}

+ +

{{ title | translate }}

+
@@ -28,7 +30,7 @@

{{ 'core.date' | translate }}

- @@ -40,12 +42,8 @@

{{ 'addon.calendar.eventkind' | translate }}

{{eventTypes[0].name | translate }}

- + {{ type.name | translate }} @@ -83,8 +81,7 @@

{{ 'core.course' | translate }}

- {{ course.fullname }} @@ -93,10 +90,12 @@ -

{{ 'core.coursenogroups' | translate }}

+ +

{{ 'core.coursenogroups' | translate }}

+
- +

{{ 'core.group' | translate }}

@@ -113,136 +112,136 @@
- - - - - -

{{ 'core.showmore' | translate }}

-

{{ 'core.showless' | translate }}

-
-
- -
- - - -

{{ 'core.description' | translate }}

+ + + + +

{{ 'addon.calendar.reminders' | translate }}

- -
- - - - -

{{ 'core.location' | translate }}

+ + + + + + +

{{ reminder.label }}

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

{{ 'addon.calendar.eventduration' | translate }}

-
-
- - -

{{ 'addon.calendar.durationnone' | translate }}

-
- -
- - -

{{ 'addon.calendar.durationuntil' | translate }}

-
- -
- - - - - - - -

{{ 'addon.calendar.durationminutes' | translate }}

-
- -
- - {{ 'addon.calendar.durationminutes' | translate }} - - -
-
- - - - + +
+ + -

{{ 'addon.calendar.repeatevent' | translate }}

+

{{ 'addon.calendar.eventduration' | translate }}

- - - - -

{{ 'addon.calendar.repeatweeksl' | translate }}

+
+ + +

{{ 'addon.calendar.durationnone' | translate }}

- - +
- - - -
- - - -

{{ 'addon.calendar.repeatedevents' | translate }}

-
-
- - -

{{ 'addon.calendar.repeateditall' | translate:{$a: otherEventsCount} }}

-
- -
- - -

{{ 'addon.calendar.repeateditthis' | translate }}

-
- -
-
-
+ + +

{{ 'addon.calendar.durationuntil' | translate }}

+
+ +
+ + + + + + + +

{{ 'addon.calendar.durationminutes' | translate }}

+
+ +
+ + {{ 'addon.calendar.durationminutes' | translate }} + + +
- - - - - - {{ 'core.save' | translate }} - - - - - {{ 'core.discard' | translate }} - - - + + + + +

{{ 'addon.calendar.repeatevent' | translate }}

+
+ +
+ + +

{{ 'addon.calendar.repeatweeksl' | translate }}

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

{{ 'addon.calendar.repeatedevents' | translate }}

+
+
+ + +

{{ 'addon.calendar.repeateditall' | translate:{$a: otherEventsCount} }}

+
+ +
+ + +

{{ 'addon.calendar.repeateditthis' | translate }}

+
+ +
+
+
+ + + + +

{{ 'core.description' | translate }}

+ +
+ + + + +

{{ 'core.location' | translate }}

+
+ +
+
+
+ + {{ 'core.discard' | translate }} + + + {{ 'core.save' | translate }} + +
+
diff --git a/src/addons/calendar/pages/edit-event/edit-event.page.ts b/src/addons/calendar/pages/edit-event/edit-event.page.ts index fa21d737d..c1807d35f 100644 --- a/src/addons/calendar/pages/edit-event/edit-event.page.ts +++ b/src/addons/calendar/pages/edit-event/edit-event.page.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Optional } from '@angular/core'; +import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core'; import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms'; import { IonRefresher } from '@ionic/angular'; import { CoreEvents } from '@singletons/events'; @@ -23,7 +23,6 @@ import { CoreDomUtils } from '@services/utils/dom'; import { CoreTimeUtils } from '@services/utils/time'; import { CoreUtils } from '@services/utils/utils'; import { CoreCategoryData, CoreCourses, CoreCourseSearchedData, CoreEnrolledCourseData } from '@features/courses/services/courses'; -import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { CoreEditorRichTextEditorComponent } from '@features/editor/components/rich-text-editor/rich-text-editor'; import { AddonCalendarProvider, @@ -34,7 +33,7 @@ import { AddonCalendarSubmitCreateUpdateFormDataWSParams, } from '../../services/calendar'; import { AddonCalendarOffline } from '../../services/calendar-offline'; -import { AddonCalendarEventTypeOption, AddonCalendarHelper } from '../../services/calendar-helper'; +import { AddonCalendarEventReminder, AddonCalendarEventTypeOption, AddonCalendarHelper } from '../../services/calendar-helper'; import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync'; import { CoreSite } from '@classes/site'; import { Translate } from '@singletons'; @@ -44,6 +43,8 @@ import { CoreError } from '@classes/errors/error'; import { CoreNavigator } from '@services/navigator'; import { CanLeave } from '@guards/can-leave'; import { CoreForms } from '@singletons/form'; +import { CoreLocalNotifications } from '@services/local-notifications'; +import { AddonCalendarReminderTimeModalComponent } from '@addons/calendar/components/reminder-time-modal/reminder-time-modal'; /** * Page that displays a form to create/edit an event. @@ -69,7 +70,6 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { groups: CoreGroup[] = []; loadingGroups = false; courseGroupSet = false; - advanced = false; errors: Record; error = false; eventRepeatId?: number; @@ -84,6 +84,10 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { groupControl: FormControl; descriptionControl: FormControl; + // Reminders. + notificationsEnabled = false; + reminders: AddonCalendarEventCandidateReminder[] = []; + protected courseId!: number; protected originalData?: AddonCalendarOfflineEventDBRecord; protected currentSite: CoreSite; @@ -94,9 +98,9 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { constructor( protected fb: FormBuilder, - @Optional() protected svComponent: CoreSplitViewComponent, ) { - this.currentSite = CoreSites.getCurrentSite()!; + this.currentSite = CoreSites.getRequiredCurrentSite(); + this.notificationsEnabled = CoreLocalNotifications.isAvailable(); this.errors = { required: Translate.instant('core.required'), }; @@ -142,6 +146,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { this.form.addControl('timedurationuntil', this.fb.control(currentDate)); this.form.addControl('courseid', this.fb.control(this.courseId)); + this.initReminders(); this.fetchData().finally(() => { this.originalData = CoreUtils.clone(this.form.value); this.loaded = true; @@ -173,17 +178,19 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { if (this.eventId && !this.gotEventData) { // Editing an event, get the event data. Wait for sync first. + const eventId = this.eventId; + promises.push(AddonCalendarSync.waitForSync(AddonCalendarSyncProvider.SYNC_ID).then(async () => { // Do not block if the scope is already destroyed. if (!this.isDestroyed && this.eventId) { - CoreSync.blockOperation(AddonCalendarProvider.COMPONENT, this.eventId); + CoreSync.blockOperation(AddonCalendarProvider.COMPONENT, eventId); } let eventForm: AddonCalendarEvent | AddonCalendarOfflineEventDBRecord | undefined; // Get the event offline data if there's any. try { - eventForm = await AddonCalendarOffline.getEvent(this.eventId!); + eventForm = await AddonCalendarOffline.getEvent(eventId); this.hasOffline = true; } catch { @@ -191,9 +198,9 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { this.hasOffline = false; } - if (this.eventId! > 0) { + if (eventId > 0) { // It's an online event. get its data from server. - const event = await AddonCalendar.getEventById(this.eventId!); + const event = await AddonCalendar.getEventById(eventId); if (!eventForm) { eventForm = event; // Use offline data first. @@ -433,13 +440,6 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { } } - /** - * Show or hide advanced form fields. - */ - toggleAdvanced(): void { - this.advanced = !this.advanced; - } - selectDuration(duration: string): void { this.form.controls.duration.setValue(duration); } @@ -519,7 +519,9 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { let event: AddonCalendarEvent | AddonCalendarOfflineEventDBRecord; try { - const result = await AddonCalendar.submitEvent(this.eventId, data); + const result = await AddonCalendar.submitEvent(this.eventId, data, { + reminders: this.eventId ? [] : this.reminders, // Only allow adding reminders for new events. + }); event = result.event; CoreForms.triggerFormSubmittedEvent(this.formElement, result.sent, this.currentSite.getId()); @@ -564,7 +566,10 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { if (event) { CoreEvents.trigger( AddonCalendarProvider.NEW_EVENT_EVENT, - { eventId: event.id! }, + { + eventId: event.id, + oldEventId: this.eventId, + }, this.currentSite.getId(), ); } else { @@ -572,25 +577,23 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { } } - if (this.svComponent?.outletActivated) { - // Empty form. - this.hasOffline = false; - this.form.reset(this.originalData); - this.originalData = CoreUtils.clone(this.form.value); - } else { - this.originalData = undefined; // Avoid asking for confirmation. - CoreNavigator.back(); - } + this.originalData = undefined; // Avoid asking for confirmation. + CoreNavigator.back(); } /** * Discard an offline saved discussion. */ async discard(): Promise { + if (!this.eventId) { + return; + } + try { await CoreDomUtils.showConfirm(Translate.instant('core.areyousure')); + try { - await AddonCalendarOffline.deleteEvent(this.eventId!); + await AddonCalendarOffline.deleteEvent(this.eventId); CoreForms.triggerFormCancelledEvent(this.formElement, this.currentSite.getId()); @@ -629,6 +632,70 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { } } + /** + * Init reminders. + * + * @return Promise resolved when done. + */ + protected async initReminders(): Promise { + // Don't init reminders when editing an event. Right now, only allow adding reminders for new events. + if (!this.notificationsEnabled || this.eventId) { + return; + } + + // Check if default reminders are enabled. + const defaultTime = await AddonCalendar.getDefaultNotificationTime(this.currentSite.getId()); + if (defaultTime === 0) { + return; + } + + const data = AddonCalendarProvider.convertSecondsToValueAndUnit(defaultTime); + + // Add default reminder. + this.reminders.push({ + time: null, + value: data.value, + unit: data.unit, + label: AddonCalendar.getUnitValueLabel(data.value, data.unit, true), + }); + } + + /** + * Add a reminder. + */ + async addReminder(): Promise { + const reminderTime = await CoreDomUtils.openModal({ + component: AddonCalendarReminderTimeModalComponent, + }); + + if (reminderTime === undefined) { + // User canceled. + return; + } + + const data = AddonCalendarProvider.convertSecondsToValueAndUnit(reminderTime); + + // Add reminder. + this.reminders.push({ + time: reminderTime, + value: data.value, + unit: data.unit, + label: AddonCalendar.getUnitValueLabel(data.value, data.unit), + }); + } + + /** + * Remove a reminder. + * + * @param reminder The reminder to remove. + */ + removeReminder(reminder: AddonCalendarEventCandidateReminder): void { + const index = this.reminders.indexOf(reminder); + if (index != -1) { + this.reminders.splice(index, 1); + } + } + /** * Page destroyed. */ @@ -638,3 +705,5 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave { } } + +type AddonCalendarEventCandidateReminder = Omit; diff --git a/src/addons/calendar/pages/event/event.html b/src/addons/calendar/pages/event/event.html index 00acf2531..ab3c5bcb8 100644 --- a/src/addons/calendar/pages/event/event.html +++ b/src/addons/calendar/pages/event/event.html @@ -1,40 +1,31 @@ - + -

- - - - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - - -

+ +

+ + +

+
- + + + + + + + +
- - - - - - - - - - @@ -48,131 +39,121 @@
- - - - - - - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - -

{{ 'addon.calendar.eventname' | translate }}

-

- -

-
- - {{ 'core.deletedoffline' | translate }} - -
- - -

{{ 'addon.calendar.when' | translate }}

- + + + + + + + {{ 'addon.calendar.type' + event.formattedType | translate }} + {{ event.iconTitle }} + +

+ + +

+
+
+ + +

{{ 'addon.calendar.when' | translate }}

+ -
- - {{ 'core.deletedoffline' | translate }} - -
- - -

{{ 'addon.calendar.eventtype' | translate }}

-

{{ 'addon.calendar.type' + event.formattedType | translate }}

-
-
- - -

{{ 'core.course' | translate}}

-

- - -

-
-
- - -

{{ 'core.group' | translate}}

-

{{ groupName }}

-
-
- - -

{{ 'core.category' | translate}}

-

-
-
- - -

{{ 'core.description' | translate}}

-

- + + {{ 'core.deletedoffline' | translate }} + + + + +

{{ 'addon.calendar.eventtype' | translate }}

+

{{ 'addon.calendar.type' + event.formattedType | translate }}

+
+
+ + +

{{ 'core.course' | translate}}

+

+ + +

+
+
+ + +

{{ 'core.group' | translate}}

+

{{ groupName }}

+
+
+ + +

{{ 'core.category' | translate}}

+

+ + +

+
+
+ + +

{{ 'core.description' | translate}}

+

+ +

+
+
+ + +

{{ 'core.location' | translate}}

+

+ + -

-
-
- - -

{{ 'core.location' | translate}}

-

- - - -

-
-
- - - - {{ 'addon.calendar.gotoactivity' | translate }} - - - -
-
+ +

+
+
+ + + + {{ 'addon.calendar.gotoactivity' | translate }} + + + + - +

{{ 'addon.calendar.reminders' | translate }}

- + -

- {{ 'core.defaultvalue' | translate :{$a: ((event.timestart - defaultTime) * 1000) | coreFormatDate } }} -

-

{{ reminder.time * 1000 | coreFormatDate }}

+

{{ reminder.label }}

+

{{ reminder.sublabel }}

- +
- + - + {{ 'addon.calendar.setnewreminder' | translate }} -
diff --git a/src/addons/calendar/pages/event/event.page.ts b/src/addons/calendar/pages/event/event.page.ts index 61b53c219..28c5de7e9 100644 --- a/src/addons/calendar/pages/event/event.page.ts +++ b/src/addons/calendar/pages/event/event.page.ts @@ -12,21 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnDestroy, OnInit, Optional } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { IonRefresher } from '@ionic/angular'; import { AlertOptions } from '@ionic/core'; import { AddonCalendar, - AddonCalendarEvent, - AddonCalendarEventBase, AddonCalendarEventToDisplay, - AddonCalendarGetEventsEvent, AddonCalendarProvider, } from '../../services/calendar'; -import { AddonCalendarHelper } from '../../services/calendar-helper'; +import { AddonCalendarEventReminder, AddonCalendarHelper } from '../../services/calendar-helper'; import { AddonCalendarOffline } from '../../services/calendar-offline'; import { AddonCalendarSync, AddonCalendarSyncEvents, AddonCalendarSyncProvider } from '../../services/calendar-sync'; -import { CoreCourses } from '@features/courses/services/courses'; import { CoreApp } from '@services/app'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreDomUtils } from '@services/utils/dom'; @@ -36,16 +32,13 @@ import { CoreLocalNotifications } from '@services/local-notifications'; import { CoreCourse } from '@features/course/services/course'; import { CoreTimeUtils } from '@services/utils/time'; import { CoreGroups } from '@services/groups'; -import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { Network, NgZone, Translate } from '@singletons'; import { Subscription } from 'rxjs'; import { CoreNavigator } from '@services/navigator'; import { CoreUtils } from '@services/utils/utils'; -import { AddonCalendarReminderDBRecord } from '../../services/database/calendar'; import { ActivatedRoute } from '@angular/router'; -import { CoreScreen } from '@services/screen'; import { CoreConstants } from '@/core/constants'; -import { CoreLang } from '@services/lang'; +import { AddonCalendarReminderTimeModalComponent } from '@addons/calendar/components/reminder-time-modal/reminder-time-modal'; /** * Page that displays a single calendar event. @@ -53,23 +46,22 @@ import { CoreLang } from '@services/lang'; @Component({ selector: 'page-addon-calendar-event', templateUrl: 'event.html', - styleUrls: ['event.scss'], + styleUrls: ['../../calendar-common.scss', 'event.scss'], }) export class AddonCalendarEventPage implements OnInit, OnDestroy { protected eventId!: number; protected siteHomeId: number; + protected newEventObserver: CoreEventObserver; protected editEventObserver: CoreEventObserver; protected syncObserver: CoreEventObserver; protected manualSyncObserver: CoreEventObserver; protected onlineObserver: Subscription; + protected defaultTimeChangedObserver: CoreEventObserver; protected currentSiteId: string; + protected updateCurrentTime?: number; eventLoaded = false; - notificationFormat?: string; - notificationMin?: string; - notificationMax?: string; - notificationTimeText?: string; event?: AddonCalendarEventToDisplay; courseId?: number; courseName = ''; @@ -78,34 +70,35 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { notificationsEnabled = false; moduleUrl = ''; categoryPath = ''; - currentTime?: number; - defaultTime = 0; - reminders: AddonCalendarReminderDBRecord[] = []; + currentTime = -1; + reminders: AddonCalendarEventReminder[] = []; canEdit = false; - canDelete = false; hasOffline = false; isOnline = false; syncIcon = CoreConstants.ICON_LOADING; // Sync icon. - isSplitViewOn = false; - monthNames?: string[]; constructor( - @Optional() protected svComponent: CoreSplitViewComponent, protected route: ActivatedRoute, ) { - this.notificationsEnabled = CoreLocalNotifications.isAvailable(); this.siteHomeId = CoreSites.getCurrentSiteHomeId(); this.currentSiteId = CoreSites.getCurrentSiteId(); - this.isSplitViewOn = this.svComponent?.outletActivated; - // Check if site supports editing and deleting. No need to check allowed types, event.canedit already does it. + // Check if site supports editing. No need to check allowed types, event.canedit already does it. this.canEdit = AddonCalendar.canEditEventsInSite(); - this.canDelete = AddonCalendar.canDeleteEventsInSite(); // Listen for event edited. If current event is edited, reload the data. this.editEventObserver = CoreEvents.on(AddonCalendarProvider.EDIT_EVENT_EVENT, (data) => { - if (data && data.eventId == this.eventId) { + if (data && data.eventId === this.eventId) { + this.eventLoaded = false; + this.refreshEvent(true, false); + } + }, this.currentSiteId); + + // Listen for event created. If user edits the data of a new offline event or it's sent to server, this event is triggered. + this.newEventObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_EVENT, (data) => { + if (this.eventId < 0 && data && (data.eventId === this.eventId || data.oldEventId === this.eventId)) { + this.eventId = data.eventId; this.eventLoaded = false; this.refreshEvent(true, false); } @@ -132,32 +125,50 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { this.isOnline = CoreApp.isOnline(); }); }); + + // Reload reminders if default notification time changes. + this.defaultTimeChangedObserver = CoreEvents.on(AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_CHANGED, () => { + this.loadReminders(); + }, this.currentSiteId); + + // Set and update current time. Use a 5 seconds error margin. + this.currentTime = CoreTimeUtils.timestamp(); + this.updateCurrentTime = window.setInterval(() => { + this.currentTime = CoreTimeUtils.timestamp(); + }, 5000); } - protected async initReminders(): Promise { - if (this.notificationsEnabled) { - this.monthNames = CoreLang.getMonthNames(); - - this.reminders = await AddonCalendar.getEventReminders(this.eventId); - this.defaultTime = await AddonCalendar.getDefaultNotificationTime() * 60; - - // Calculate format to use. - this.notificationFormat = - CoreTimeUtils.fixFormatForDatetime(CoreTimeUtils.convertPHPToMoment( - Translate.instant('core.strftimedatetime'), - )); + /** + * Load reminders. + * + * @return Promise resolved when done. + */ + protected async loadReminders(): Promise { + if (!this.notificationsEnabled || !this.event) { + return; } + + const reminders = await AddonCalendar.getEventReminders(this.eventId, this.currentSiteId); + this.reminders = await AddonCalendarHelper.formatReminders(reminders, this.event.timestart, this.currentSiteId); } /** * View loaded. */ ngOnInit(): void { - this.eventId = CoreNavigator.getRouteNumberParam('id')!; + try { + this.eventId = CoreNavigator.getRequiredRouteNumberParam('id'); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } + this.syncIcon = CoreConstants.ICON_LOADING; this.fetchEvent(); - this.initReminders(); } /** @@ -168,55 +179,22 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { * @return Promise resolved when done. */ async fetchEvent(sync = false, showErrors = false): Promise { - const currentSite = CoreSites.getCurrentSite(); - const canGetById = AddonCalendar.isGetEventByIdAvailableInSite(); - let deleted = false; - this.isOnline = CoreApp.isOnline(); if (sync) { - // Try to synchronize offline events. - try { - const result = await AddonCalendarSync.syncEvents(); - if (result.warnings && result.warnings.length) { - CoreDomUtils.showErrorModal(result.warnings[0]); - } + const deleted = await this.syncEvents(showErrors); - if (result.deleted && result.deleted.indexOf(this.eventId) != -1) { - // This event was deleted during the sync. - deleted = true; - } - - if (result.updated) { - // Trigger a manual sync event. - result.source = 'event'; - - CoreEvents.trigger( - AddonCalendarSyncProvider.MANUAL_SYNCED, - result, - this.currentSiteId, - ); - } - } catch (error) { - if (showErrors) { - CoreDomUtils.showErrorModalDefault(error, 'core.errorsync', true); - } + if (deleted) { + return; } } - if (deleted) { - return; - } - try { - let event: AddonCalendarEvent | AddonCalendarEventBase | AddonCalendarGetEventsEvent; // Get the event data. - if (canGetById) { - event = await AddonCalendar.getEventById(this.eventId); - } else { - event = await AddonCalendar.getEvent(this.eventId); + if (this.eventId >= 0) { + const event = await AddonCalendar.getEventById(this.eventId); + this.event = await AddonCalendarHelper.formatEventData(event); } - this.event = AddonCalendarHelper.formatEventData(event); try { const offlineEvent = AddonCalendarHelper.formatOfflineEventData( @@ -225,20 +203,26 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { // There is offline data, apply it. this.hasOffline = true; - - this.event = Object.assign(this.event, offlineEvent); + this.event = Object.assign(this.event || {}, offlineEvent); } catch { // No offline data. this.hasOffline = false; + + if (this.eventId < 0) { + // It's an offline event, but it wasn't found. Shouldn't happen. + CoreDomUtils.showErrorModal('Event not found.'); + CoreNavigator.back(); + + return; + } } - this.currentTime = CoreTimeUtils.timestamp(); - this.notificationMin = CoreTimeUtils.userDate(this.currentTime * 1000, 'YYYY-MM-DDTHH:mm', false); - this.notificationMax = CoreTimeUtils.userDate( - (this.event!.timestart + this.event!.timeduration) * 1000, - 'YYYY-MM-DDTHH:mm', - false, - ); + if (!this.event) { + return; // At this point we should always have the event, adding this check to avoid TS errors. + } + + // Load reminders. + this.loadReminders(); // Reset some of the calculated data. this.categoryPath = ''; @@ -246,60 +230,36 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { this.courseUrl = ''; this.moduleUrl = ''; - if (this.event!.moduleIcon) { + if (this.event.moduleIcon) { // It's a module event, translate the module name to the current language. - const name = CoreCourse.translateModuleName(this.event!.modulename || ''); + const name = CoreCourse.translateModuleName(this.event.modulename || ''); if (name.indexOf('core.mod_') === -1) { - this.event!.modulename = name; + this.event.modulename = name; } // Get the module URL. - if (canGetById) { - this.moduleUrl = this.event!.url || ''; - } + this.moduleUrl = this.event.url || ''; } const promises: Promise[] = []; + const event = this.event; const courseId = this.event.courseid; if (courseId != this.siteHomeId) { // If the event belongs to a course, get the course name and the URL to view it. - if (canGetById && this.event.course) { + if (this.event.course) { this.courseId = this.event.course.id; this.courseName = this.event.course.fullname; this.courseUrl = this.event.course.viewurl; - } else if (!canGetById && this.event.courseid ) { - // Retrieve the course. - promises.push(CoreCourses.getUserCourse(this.event.courseid, true).then((course) => { - this.courseId = course.id; - this.courseName = course.fullname; - this.courseUrl = currentSite ? CoreTextUtils.concatenatePaths( - currentSite.siteUrl, - '/course/view.php?id=' + this.courseId, - ) : ''; - - return; - }).catch(() => { - // Error getting course, just don't show the course name. - })); } } // If it's a group event, get the name of the group. if (courseId && this.event.groupid) { - promises.push(CoreGroups.getUserGroupsInCourse(courseId).then((groups) => { - const group = groups.find((group) => group.id == this.event!.groupid); - - this.groupName = group ? group.name : ''; - - return; - }).catch(() => { - // Error getting groups, just don't show the group name. - this.groupName = ''; - })); + promises.push(this.loadGroupName(this.event, courseId)); } - if (canGetById && this.event.iscategoryevent && this.event.category) { + if (this.event.iscategoryevent && this.event.category) { this.categoryPath = this.event.category.nestedname; } @@ -311,14 +271,14 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { // Check if event was deleted in offine. promises.push(AddonCalendarOffline.isEventDeleted(this.eventId).then((deleted) => { - this.event!.deleted = deleted; + event.deleted = deleted; return; })); // Re-calculate the formatted time so it uses the device date. promises.push(AddonCalendar.getCalendarTimeFormat().then(async (timeFormat) => { - this.event!.formattedtime = await AddonCalendar.formatEventTime(this.event!, timeFormat); + event.formattedtime = await AddonCalendar.formatEventTime(event, timeFormat); return; })); @@ -333,24 +293,88 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { } /** - * Add a reminder for this event. + * Sync offline events. + * + * @param showErrors Whether to show sync errors to the user. + * @return Promise resolved with boolean: whether event was deleted on sync. */ - async addNotificationTime(): Promise { - if (this.notificationTimeText && this.event && this.event.id) { - let notificationTime = CoreTimeUtils.convertToTimestamp(this.notificationTimeText); + protected async syncEvents(showErrors = false): Promise { + let deleted = false; - const currentTime = CoreTimeUtils.timestamp(); - const minute = Math.floor(currentTime / 60) * 60; - - // Check if the notification time is in the same minute as we are, so the notification is triggered. - if (notificationTime >= minute && notificationTime < minute + 60) { - notificationTime = currentTime + 1; + // Try to synchronize offline events. + try { + const result = await AddonCalendarSync.syncEvents(); + if (result.warnings && result.warnings.length) { + CoreDomUtils.showErrorModal(result.warnings[0]); } - await AddonCalendar.addEventReminder(this.event, notificationTime); - this.reminders = await AddonCalendar.getEventReminders(this.eventId); - this.notificationTimeText = undefined; + if (result.deleted && result.deleted.indexOf(this.eventId) != -1) { + // This event was deleted during the sync. + deleted = true; + } else if (this.eventId < 0 && result.offlineIdMap[this.eventId]) { + // Event was created, use the online ID. + this.eventId = result.offlineIdMap[this.eventId]; + } + + if (result.updated) { + // Trigger a manual sync event. + result.source = 'event'; + + CoreEvents.trigger( + AddonCalendarSyncProvider.MANUAL_SYNCED, + result, + this.currentSiteId, + ); + } + } catch (error) { + if (showErrors) { + CoreDomUtils.showErrorModalDefault(error, 'core.errorsync', true); + } } + + return deleted; + } + + /** + * Load group name. + * + * @param event Event. + * @param courseId Course ID. + * @return Promise resolved when done. + */ + protected async loadGroupName(event: AddonCalendarEventToDisplay, courseId: number): Promise { + try { + const groups = await CoreGroups.getUserGroupsInCourse(courseId); + + const group = groups.find((group) => group.id == event.groupid); + this.groupName = group ? group.name : ''; + + } catch { + // Error getting groups, just don't show the group name. + this.groupName = ''; + } + } + + /** + * Add a reminder for this event. + */ + async addReminder(): Promise { + if (!this.event || !this.event.id) { + return; + } + + const reminderTime = await CoreDomUtils.openModal({ + component: AddonCalendarReminderTimeModalComponent, + }); + + if (reminderTime === undefined) { + // User canceled. + return; + } + + await AddonCalendar.addEventReminder(this.event, reminderTime, this.currentSiteId); + + await this.loadReminders(); } /** @@ -370,7 +394,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { try { await AddonCalendar.deleteEventReminder(id); - this.reminders = await AddonCalendar.getEventReminders(this.eventId); + await this.loadReminders(); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'Error deleting reminder'); } finally { @@ -412,7 +436,9 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { const promises: Promise[] = []; - promises.push(AddonCalendar.invalidateEvent(this.eventId)); + if (this.eventId > 0) { + promises.push(AddonCalendar.invalidateEvent(this.eventId)); + } promises.push(AddonCalendar.invalidateTimeFormat()); await CoreUtils.allPromisesIgnoringErrors(promises); @@ -479,9 +505,14 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { const modal = await CoreDomUtils.showModalLoading('core.sending', true); try { - const sent = await AddonCalendar.deleteEvent(this.event.id, this.event.name, deleteAll); + let onlineEventDeleted = false; + if (this.event.id < 0) { + await AddonCalendarOffline.deleteEvent(this.event.id); + } else { + onlineEventDeleted = await AddonCalendar.deleteEvent(this.event.id, this.event.name, deleteAll); + } - if (sent) { + if (onlineEventDeleted) { // Event deleted, invalidate right days & months. try { await AddonCalendarHelper.refreshAfterChangeEvent(this.event, deleteAll ? this.event.eventcount : 1); @@ -491,18 +522,20 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { } // Trigger an event. - CoreEvents.trigger(AddonCalendarProvider.DELETED_EVENT_EVENT, { - eventId: this.eventId, - sent: sent, - }, CoreSites.getCurrentSiteId()); + if (this.event.id < 0) { + CoreEvents.trigger(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, {}, CoreSites.getCurrentSiteId()); + } else { + CoreEvents.trigger(AddonCalendarProvider.DELETED_EVENT_EVENT, { + eventId: this.eventId, + sent: onlineEventDeleted, + }, CoreSites.getCurrentSiteId()); + } - if (sent) { + if (onlineEventDeleted || this.event.id < 0) { CoreDomUtils.showToast('addon.calendar.eventcalendareventdeleted', true, 3000); // Event deleted, close the view. - if (CoreScreen.isMobile) { - CoreNavigator.back(); - } + CoreNavigator.back(); } else { // Event deleted in offline, just mark it as deleted. this.event.deleted = true; @@ -557,15 +590,23 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { CoreDomUtils.showToast('addon.calendar.eventcalendareventdeleted', true, 3000); // Event was deleted, close the view. - if (CoreScreen.isMobile) { - CoreNavigator.back(); - } + CoreNavigator.back(); } else if (data.events && (!isManual || data.source != 'event')) { - const event = data.events.find((ev) => ev.id == this.eventId); + if (this.eventId < 0) { + if (data.offlineIdMap[this.eventId]) { + // Event was created, use the online ID. + this.eventId = data.offlineIdMap[this.eventId]; - if (event) { - this.eventLoaded = false; - this.refreshEvent(); + this.eventLoaded = false; + this.refreshEvent(); + } + } else { + const event = data.events.find((ev) => ev.id == this.eventId); + + if (event) { + this.eventLoaded = false; + this.refreshEvent(); + } } } } @@ -574,10 +615,12 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { * Page destroyed. */ ngOnDestroy(): void { - this.editEventObserver?.off(); - this.syncObserver?.off(); - this.manualSyncObserver?.off(); - this.onlineObserver?.unsubscribe(); + this.editEventObserver.off(); + this.syncObserver.off(); + this.manualSyncObserver.off(); + this.onlineObserver.unsubscribe(); + this.newEventObserver.off(); + clearInterval(this.updateCurrentTime); } } diff --git a/src/addons/calendar/pages/event/event.scss b/src/addons/calendar/pages/event/event.scss index bc2bb8cb3..24e862cd4 100644 --- a/src/addons/calendar/pages/event/event.scss +++ b/src/addons/calendar/pages/event/event.scss @@ -2,8 +2,4 @@ ion-card ion-note { font-size: 1.6rem; } - h1 ion-icon, h1 img { - margin-left: 10px; - margin-right: 10px; - } } diff --git a/src/addons/calendar/pages/index/index.html b/src/addons/calendar/pages/index/index.html index 1533cc434..61b07e7d5 100644 --- a/src/addons/calendar/pages/index/index.html +++ b/src/addons/calendar/pages/index/index.html @@ -3,25 +3,26 @@ -

{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}

+ +

{{ (showCalendar ? 'addon.calendar.calendarevents' : 'addon.calendar.upcomingevents') | translate }}

+
- + - - - + + + + [content]="'core.settings.synchronizenow' | translate" (action)="doRefresh(undefined, $event, true)" + [iconAction]="syncIcon" [closeOnClick]="false"> + @@ -42,8 +43,7 @@ [displayNavButtons]="showCalendar" (onEventClicked)="gotoEvent($event)" (onDayClicked)="gotoDay($event)"> - + diff --git a/src/addons/calendar/pages/index/index.module.ts b/src/addons/calendar/pages/index/index.module.ts index be80e63e6..0ecbc7b6e 100644 --- a/src/addons/calendar/pages/index/index.module.ts +++ b/src/addons/calendar/pages/index/index.module.ts @@ -19,6 +19,7 @@ import { CoreSharedModule } from '@/core/shared.module'; import { AddonCalendarComponentsModule } from '../../components/components.module'; import { AddonCalendarIndexPage } from './index.page'; +import { CoreMainMenuComponentsModule } from '@features/mainmenu/components/components.module'; const routes: Routes = [ { @@ -32,6 +33,7 @@ const routes: Routes = [ RouterModule.forChild(routes), CoreSharedModule, AddonCalendarComponentsModule, + CoreMainMenuComponentsModule, ], declarations: [ AddonCalendarIndexPage, diff --git a/src/addons/calendar/pages/index/index.page.ts b/src/addons/calendar/pages/index/index.page.ts index 7e4f1eeb2..9b9fd080b 100644 --- a/src/addons/calendar/pages/index/index.page.ts +++ b/src/addons/calendar/pages/index/index.page.ts @@ -29,10 +29,11 @@ import { CoreEnrolledCourseData } from '@features/courses/services/courses'; import { ActivatedRoute, Params } from '@angular/router'; import { AddonCalendarCalendarComponent } from '../../components/calendar/calendar'; import { AddonCalendarUpcomingEventsComponent } from '../../components/upcoming-events/upcoming-events'; -import { AddonCalendarFilterPopoverComponent } from '../../components/filter/filter'; +import { AddonCalendarFilterComponent } from '../../components/filter/filter'; import { CoreNavigator } from '@services/navigator'; import { CoreLocalNotifications } from '@services/local-notifications'; import { CoreConstants } from '@/core/constants'; +import { CoreMainMenuDeepLinkManager } from '@features/mainmenu/classes/deep-link-manager'; /** * Page that displays the calendar events. @@ -92,7 +93,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { (data) => { if (data && data.eventId) { this.loaded = false; - this.refreshData(true, false); + this.refreshData(true, false, true); } }, this.currentSiteId, @@ -101,7 +102,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { // Listen for new event discarded event. When it does, reload the data. this.discardedObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => { this.loaded = false; - this.refreshData(true, false); + this.refreshData(true, false, true); }, this.currentSiteId); // Listen for events edited. When an event is edited, reload the data. @@ -110,7 +111,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { (data) => { if (data && data.eventId) { this.loaded = false; - this.refreshData(true, false); + this.refreshData(true, false, true); } }, this.currentSiteId, @@ -119,21 +120,21 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { // Refresh data if calendar events are synchronized automatically. this.syncObserver = CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => { this.loaded = false; - this.refreshData(false, false); + this.refreshData(false, false, true); }, this.currentSiteId); // Refresh data if calendar events are synchronized manually but not by this page. this.manualSyncObserver = CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => { if (data && data.source != 'index') { this.loaded = false; - this.refreshData(false, false); + this.refreshData(false, false, true); } }, this.currentSiteId); // Update the events when an event is deleted. this.deleteEventObserver = CoreEvents.on(AddonCalendarProvider.DELETED_EVENT_EVENT, () => { this.loaded = false; - this.refreshData(false, false); + this.refreshData(false, false, true); }, this.currentSiteId); // Update the "hasOffline" property if an event deleted in offline is restored. @@ -177,6 +178,9 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { this.fetchData(true, false); }); + + const deepLinkManager = new CoreMainMenuDeepLinkManager(); + deepLinkManager.treatLink(); } /** @@ -278,7 +282,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { * @param afterChange Whether the refresh is done after an event has changed or has been synced. * @return Promise resolved when done. */ - async refreshData(sync = false, showErrors = false): Promise { + async refreshData(sync = false, showErrors = false, afterChange = false): Promise { this.syncIcon = CoreConstants.ICON_LOADING; const promises: Promise[] = []; @@ -287,7 +291,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { // Refresh the sub-component. if (this.showCalendar && this.calendarComponent) { - promises.push(this.calendarComponent.refreshData()); + promises.push(this.calendarComponent.refreshData(afterChange)); } else if (!this.showCalendar && this.upcomingEventsComponent) { promises.push(this.upcomingEventsComponent.refreshData()); } @@ -301,12 +305,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { * @param eventId Event to load. */ gotoEvent(eventId: number): void { - if (eventId < 0) { - // It's an offline event, go to the edit page. - this.openEdit(eventId); - } else { - CoreNavigator.navigateToSitePath(`/calendar/event/${eventId}`); - } + CoreNavigator.navigateToSitePath(`/calendar/event/${eventId}`); } /** @@ -329,18 +328,15 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { } /** - * Show the context menu. - * - * @param event Event. + * Show the filter menu. */ - async openFilter(event: MouseEvent): Promise { - await CoreDomUtils.openPopover({ - component: AddonCalendarFilterPopoverComponent, + async openFilter(): Promise { + await CoreDomUtils.openSideModal({ + component: AddonCalendarFilterComponent, componentProps: { courses: this.courses, filter: this.filter, }, - event, }); } @@ -364,7 +360,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { * Open calendar events settings. */ openSettings(): void { - CoreNavigator.navigateToSitePath('/calendar/settings'); + CoreNavigator.navigateToSitePath('/calendar/calendar-settings'); } /** diff --git a/src/addons/calendar/pages/list/list.html b/src/addons/calendar/pages/list/list.html deleted file mode 100644 index 9e64554e4..000000000 --- a/src/addons/calendar/pages/list/list.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - -

{{ 'addon.calendar.calendarevents' | translate }}

- - - - - - - - - - -
-
- - - - - - - - - - {{ 'core.hasdatatosync' | translate:{$a: 'addon.calendar.calendar' | translate} }} - - - - - - - - - -

{{ event.timestart * 1000 | coreFormatDate: "strftimedayshort" }}

-
- - - - -

- - - {{ 'addon.calendar.type' + event.formattedType | translate }} - {{ event.iconTitle }} - - - -

-

- {{ event.timestart * 1000 | coreFormatDate: "strftimetime" }} - - - {{ (event.timestart + event.timeduration) * 1000 | coreFormatDate: "strftimetime" }} - - - - {{ (event.timestart + event.timeduration) * 1000 | coreFormatDate: "strftimedatetimeshort" }} - -

-
- - - {{ 'core.notsent' | translate }} - - - - {{ 'core.deletedoffline' | translate }} - -
-
-
- - - -
- - - - - - {{ 'addon.calendar.newevent' | translate }} - - -
diff --git a/src/addons/calendar/pages/list/list.module.ts b/src/addons/calendar/pages/list/list.module.ts deleted file mode 100644 index 751dfd235..000000000 --- a/src/addons/calendar/pages/list/list.module.ts +++ /dev/null @@ -1,60 +0,0 @@ -// (C) Copyright 2015 Moodle Pty Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { AddonCalendarEventRoute, AddonCalendarEditRoute } from '@addons/calendar/calendar-lazy.module'; -import { conditionalRoutes } from '@/app/app-routing.module'; -import { CoreScreen } from '@services/screen'; - -import { CoreSharedModule } from '@/core/shared.module'; - -import { AddonCalendarListPage } from './list.page'; - -const splitviewRoutes = [AddonCalendarEditRoute, AddonCalendarEventRoute]; - -const mobileRoutes: Routes = [ - { - path: '', - component: AddonCalendarListPage, - }, - ...splitviewRoutes, -]; - -const tabletRoutes: Routes = [ - { - path: '', - component: AddonCalendarListPage, - children: [ - ...splitviewRoutes, - ], - }, -]; - -const routes: Routes = [ - ...conditionalRoutes(mobileRoutes, () => CoreScreen.isMobile), - ...conditionalRoutes(tabletRoutes, () => CoreScreen.isTablet), -]; - -@NgModule({ - imports: [ - RouterModule.forChild(routes), - CoreSharedModule, - ], - declarations: [ - AddonCalendarListPage, - ], - exports: [RouterModule], -}) -export class AddonCalendarListPageModule {} diff --git a/src/addons/calendar/pages/list/list.page.ts b/src/addons/calendar/pages/list/list.page.ts deleted file mode 100644 index d7d97a084..000000000 --- a/src/addons/calendar/pages/list/list.page.ts +++ /dev/null @@ -1,647 +0,0 @@ -// (C) Copyright 2015 Moodle Pty Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { Component, ViewChild, OnDestroy, OnInit } from '@angular/core'; -import { IonContent, IonRefresher } from '@ionic/angular'; -import { - AddonCalendarProvider, - AddonCalendar, - AddonCalendarEventToDisplay, -} from '../../services/calendar'; -import { AddonCalendarOffline } from '../../services/calendar-offline'; -import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calendar-helper'; -import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync'; -import { CoreCategoryData, CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses'; -import { CoreDomUtils } from '@services/utils/dom'; -import { CoreTimeUtils } from '@services/utils/time'; -import { CoreSites } from '@services/sites'; -import { CoreLocalNotifications } from '@services/local-notifications'; -import { CoreEventObserver, CoreEvents } from '@singletons/events'; -import { CoreApp } from '@services/app'; -import moment from 'moment'; -import { CoreConstants } from '@/core/constants'; -import { AddonCalendarFilterPopoverComponent } from '../../components/filter/filter'; -import { Params } from '@angular/router'; -import { Subscription } from 'rxjs'; -import { Network, NgZone } from '@singletons'; -import { CoreCoursesHelper } from '@features/courses/services/courses-helper'; -import { CoreUtils } from '@services/utils/utils'; -import { CoreNavigator } from '@services/navigator'; - -/** - * Page that displays the list of calendar events. - */ -@Component({ - selector: 'page-addon-calendar-list', - templateUrl: 'list.html', - styleUrls: ['../../calendar-common.scss', 'list.scss'], -}) -export class AddonCalendarListPage implements OnInit, OnDestroy { - - @ViewChild(IonContent) content?: IonContent; - - protected initialTime = 0; - protected daysLoaded = 0; - protected emptyEventsTimes = 0; // Variable to identify consecutive calls returning 0 events. - protected categoriesRetrieved = false; - protected getCategories = false; - protected categories: { [id: number]: CoreCategoryData } = {}; - protected siteHomeId: number; - protected currentSiteId: string; - protected onlineEvents: AddonCalendarEventToDisplay[] = []; - protected offlineEvents: AddonCalendarEventToDisplay[] = []; - protected deletedEvents: number [] = []; - - // Observers. - protected obsDefaultTimeChange?: CoreEventObserver; - protected newEventObserver: CoreEventObserver; - protected discardedObserver: CoreEventObserver; - protected editEventObserver: CoreEventObserver; - protected deleteEventObserver: CoreEventObserver; - protected undeleteEventObserver: CoreEventObserver; - protected syncObserver: CoreEventObserver; - protected manualSyncObserver: CoreEventObserver; - protected filterChangedObserver: CoreEventObserver; - protected onlineObserver: Subscription; - - eventId?: number; // Selected EventId on list - courses: Partial[] = []; - eventsLoaded = false; - events: AddonCalendarEventToDisplay[] = []; // Events (both online and offline). - notificationsEnabled = false; - filteredEvents: AddonCalendarEventToDisplay[] = []; - canLoadMore = false; - loadMoreError = false; - canCreate = false; - hasOffline = false; - isOnline = false; - syncIcon = CoreConstants.ICON_LOADING; - filter: AddonCalendarFilter = { - filtered: false, - courseId: undefined, - categoryId: undefined, - course: true, - group: true, - site: true, - user: true, - category: true, - }; - - constructor() { - - this.siteHomeId = CoreSites.getCurrentSiteHomeId(); - this.notificationsEnabled = CoreLocalNotifications.isAvailable(); - this.currentSiteId = CoreSites.getCurrentSiteId(); - - if (this.notificationsEnabled) { - // Re-schedule events if default time changes. - this.obsDefaultTimeChange = CoreEvents.on(AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_CHANGED, () => { - AddonCalendar.scheduleEventsNotifications(this.onlineEvents); - }, this.currentSiteId); - } - - // Listen for events added. When an event is added, reload the data. - this.newEventObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_EVENT, (data) => { - if (data && data.eventId) { - this.eventsLoaded = false; - this.refreshEvents(true, false); - } - }, this.currentSiteId); - - // Listen for new event discarded event. When it does, reload the data. - this.discardedObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => { - this.eventsLoaded = false; - this.refreshEvents(true, false); - }, this.currentSiteId); - - // Listen for events edited. When an event is edited, reload the data. - this.editEventObserver = CoreEvents.on(AddonCalendarProvider.EDIT_EVENT_EVENT, (data) => { - if (data && data.eventId) { - this.eventsLoaded = false; - this.refreshEvents(true, false); - } - }, this.currentSiteId); - - // Refresh data if calendar events are synchronized automatically. - this.syncObserver = CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => { - this.eventsLoaded = false; - this.refreshEvents(); - }, this.currentSiteId); - - // Refresh data if calendar events are synchronized manually but not by this page. - this.manualSyncObserver = CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => { - if (data && data.source != 'list') { - this.eventsLoaded = false; - this.refreshEvents(); - } - }, this.currentSiteId); - - // Update the list when an event is deleted. - this.deleteEventObserver = CoreEvents.on( - AddonCalendarProvider.DELETED_EVENT_EVENT, - (data) => { - if (data && !data.sent) { - // Event was deleted in offline. Just mark it as deleted, no need to refresh. - this.markAsDeleted(data.eventId, true); - this.deletedEvents.push(data.eventId); - this.hasOffline = true; - } else { - // Event deleted, refresh the view. - this.eventsLoaded = false; - this.refreshEvents(); - } - }, - this.currentSiteId, - ); - - // Listen for events "undeleted" (offline). - this.undeleteEventObserver = CoreEvents.on( - AddonCalendarProvider.UNDELETED_EVENT_EVENT, - (data) => { - if (!data || !data.eventId) { - return; - } - - // Mark it as undeleted, no need to refresh. - this.markAsDeleted(data.eventId, false); - - // Remove it from the list of deleted events if it's there. - const index = this.deletedEvents.indexOf(data.eventId); - if (index != -1) { - this.deletedEvents.splice(index, 1); - } - - this.hasOffline = !!this.offlineEvents.length || !!this.deletedEvents.length; - }, - this.currentSiteId, - ); - - this.filterChangedObserver = - CoreEvents.on(AddonCalendarProvider.FILTER_CHANGED_EVENT, async (data) => { - this.filter = data; - - // Course viewed has changed, check if the user can create events for this course calendar. - this.canCreate = await AddonCalendarHelper.canEditEvents(this.filter.courseId); - - this.filterEvents(); - - this.content?.scrollToTop(); - }); - - // Refresh online status when changes. - this.onlineObserver = Network.onChange().subscribe(() => { - // Execute the callback in the Angular zone, so change detection doesn't stop working. - NgZone.run(() => { - this.isOnline = CoreApp.isOnline(); - }); - }); - } - - /** - * View loaded. - */ - async ngOnInit(): Promise { - this.filter.courseId = CoreNavigator.getRouteNumberParam('courseId'); - this.syncIcon = CoreConstants.ICON_LOADING; - - await this.fetchData(false, true, false); - } - - /** - * Fetch all the data required for the view. - * - * @param refresh Empty events array first. - * @param sync Whether it should try to synchronize offline events. - * @param showErrors Whether to show sync errors to the user. - * @return Promise resolved when done. - */ - async fetchData(refresh = false, sync = false, showErrors = false): Promise { - this.initialTime = CoreTimeUtils.timestamp(); - this.daysLoaded = 0; - this.emptyEventsTimes = 0; - this.isOnline = CoreApp.isOnline(); - - if (sync) { - // Try to synchronize offline events. - try { - const result = await AddonCalendarSync.syncEvents(); - if (result.warnings && result.warnings.length) { - CoreDomUtils.showErrorModal(result.warnings[0]); - } - - if (result.updated) { - // Trigger a manual sync event. - result.source = 'list'; - - CoreEvents.trigger( - AddonCalendarSyncProvider.MANUAL_SYNCED, - result, - this.currentSiteId, - ); - } - } catch (error) { - if (showErrors) { - CoreDomUtils.showErrorModalDefault(error, 'core.errorsync', true); - } - } - } - - try { - const promises: Promise[] = []; - - this.hasOffline = false; - - promises.push(AddonCalendarHelper.canEditEvents(this.filter.courseId).then((canEdit) => { - this.canCreate = canEdit; - - return; - })); - - // Load courses for the popover. - promises.push(CoreCoursesHelper.getCoursesForPopover(this.filter.courseId).then((result) => { - this.courses = result.courses; - - return this.fetchEvents(refresh); - })); - - // Get offline events. - promises.push(AddonCalendarOffline.getAllEditedEvents().then((offlineEvents) => { - this.hasOffline = this.hasOffline || !!offlineEvents.length; - - // Format data and sort by timestart. - const events: AddonCalendarEventToDisplay[] = offlineEvents.map((event) => - AddonCalendarHelper.formatOfflineEventData(event)); - - this.offlineEvents = AddonCalendarHelper.sortEvents(events); - - return; - })); - - // Get events deleted in offline. - promises.push(AddonCalendarOffline.getAllDeletedEventsIds().then((ids) => { - this.hasOffline = this.hasOffline || !!ids.length; - this.deletedEvents = ids; - - return; - })); - - await Promise.all(promises); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - } - - this.eventsLoaded = true; - this.syncIcon = CoreConstants.ICON_SYNC; - } - - /** - * Fetches the events and updates the view. - * - * @param refresh Empty events array first. - * @return Promise resolved when done. - */ - async fetchEvents(refresh = false): Promise { - this.loadMoreError = false; - - try { - const onlineEventsTemp = - await AddonCalendar.getEventsList(this.initialTime, this.daysLoaded, AddonCalendarProvider.DAYS_INTERVAL); - - if (onlineEventsTemp.length === 0) { - this.emptyEventsTimes++; - if (this.emptyEventsTimes > 5) { // Stop execution if we retrieve empty list 6 consecutive times. - this.canLoadMore = false; - if (refresh) { - this.onlineEvents = []; - this.filteredEvents = []; - this.events = this.offlineEvents; - } - } else { - // No events returned, load next events. - this.daysLoaded += AddonCalendarProvider.DAYS_INTERVAL; - - return this.fetchEvents(); - } - } else { - const onlineEvents = onlineEventsTemp.map((event) => AddonCalendarHelper.formatEventData(event)); - - // Get the merged events of this period. - const events = this.mergeEvents(onlineEvents); - - this.getCategories = this.shouldLoadCategories(onlineEvents); - - if (refresh) { - this.onlineEvents = onlineEvents; - this.events = events; - } else { - // Filter events with same ID. Repeated events are returned once per WS call, show them only once. - this.onlineEvents = CoreUtils.mergeArraysWithoutDuplicates(this.onlineEvents, onlineEvents, 'id'); - this.events = CoreUtils.mergeArraysWithoutDuplicates(this.events, events, 'id'); - } - this.filterEvents(); - - // Calculate which evemts need to display the date. - this.filteredEvents.forEach((event, index) => { - event.showDate = this.showDate(event, this.filteredEvents[index - 1]); - event.endsSameDay = this.endsSameDay(event); - }); - this.canLoadMore = true; - - // Schedule notifications for the events retrieved (might have new events). - AddonCalendar.scheduleEventsNotifications(this.onlineEvents); - - this.daysLoaded += AddonCalendarProvider.DAYS_INTERVAL; - } - - // Resize the content so infinite loading is able to calculate if it should load more items or not. - // @todo: Infinite loading is not working if content is not high enough. - // this.content.resize(); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true); - this.loadMoreError = true; // Set to prevent infinite calls with infinite-loading. - } - - // Success retrieving events. Get categories if needed. - if (this.getCategories) { - this.getCategories = false; - - return this.loadCategories(); - } - } - - /** - * Function to load more events. - * - * @param infiniteComplete Infinite scroll complete function. Only used from core-infinite-loading. - * @return Resolved when done. - */ - loadMoreEvents(infiniteComplete?: () => void ): void { - this.fetchEvents().finally(() => { - infiniteComplete && infiniteComplete(); - }); - } - - protected filterEvents(): void { - this.filteredEvents = AddonCalendarHelper.getFilteredEvents(this.events, this.filter, this.categories); - } - - /** - * Returns if the current state should load categories or not. - * - * @param events Events to parse. - * @return True if categories should be loaded. - */ - protected shouldLoadCategories(events: AddonCalendarEventToDisplay[]): boolean { - if (this.categoriesRetrieved || this.getCategories) { - // Use previous value - return this.getCategories; - } - - // Categories not loaded yet. We should get them if there's any category event. - const found = events.some((event) => typeof event.categoryid != 'undefined' && event.categoryid > 0); - - return found || this.getCategories; - } - - /** - * Load categories to be able to filter events. - * - * @return Promise resolved when done. - */ - protected async loadCategories(): Promise { - try { - const cats = await CoreCourses.getCategories(0, true); - this.categoriesRetrieved = true; - this.categories = {}; - // Index categories by ID. - cats.forEach((category) => { - this.categories[category.id] = category; - }); - } catch { - // Ignore errors. - } - } - - /** - * Merge a period of online events with the offline events of that period. - * - * @param onlineEvents Online events. - * @return Merged events. - */ - protected mergeEvents(onlineEvents: AddonCalendarEventToDisplay[]): AddonCalendarEventToDisplay[] { - if (!this.offlineEvents.length && !this.deletedEvents.length) { - // No offline events, nothing to merge. - return onlineEvents; - } - - const start = this.initialTime + (CoreConstants.SECONDS_DAY * this.daysLoaded); - const end = start + (CoreConstants.SECONDS_DAY * AddonCalendarProvider.DAYS_INTERVAL) - 1; - let result = onlineEvents; - - if (this.deletedEvents.length) { - // Mark as deleted the events that were deleted in offline. - result.forEach((event) => { - event.deleted = this.deletedEvents.indexOf(event.id) != -1; - }); - } - - if (this.offlineEvents.length) { - // Remove the online events that were modified in offline. - result = result.filter((event) => { - const offlineEvent = this.offlineEvents.find((ev) => ev.id == event.id); - - return !offlineEvent; - }); - } - - // Now get the offline events that belong to this period. - const periodOfflineEvents = this.offlineEvents.filter((event) => { - if (this.daysLoaded == 0 && event.timestart < start) { - // Display offline events that are previous to current time to allow editing them. - return true; - } - - return (event.timestart >= start || event.timestart + event.timeduration >= start) && event.timestart <= end; - }); - - // Merge both arrays and sort them. - result = result.concat(periodOfflineEvents); - - return AddonCalendarHelper.sortEvents(result); - } - - /** - * Refresh the data. - * - * @param refresher Refresher. - * @param done Function to call when done. - * @param showErrors Whether to show sync errors to the user. - * @return Promise resolved when done. - */ - async doRefresh(refresher?: IonRefresher, done?: () => void, showErrors?: boolean): Promise { - if (!this.eventsLoaded) { - return; - } - - await this.refreshEvents(true, showErrors).finally(() => { - refresher?.complete(); - done && done(); - }); - } - - /** - * Refresh the events. - * - * @param sync Whether it should try to synchronize offline events. - * @param showErrors Whether to show sync errors to the user. - * @return Promise resolved when done. - */ - async refreshEvents(sync?: boolean, showErrors?: boolean): Promise { - this.syncIcon = CoreConstants.ICON_LOADING; - - const promises: Promise[] = []; - - promises.push(AddonCalendar.invalidateEventsList()); - promises.push(AddonCalendar.invalidateAllowedEventTypes()); - - if (this.categoriesRetrieved) { - promises.push(CoreCourses.invalidateCategories(0, true)); - this.categoriesRetrieved = false; - } - - await Promise.all(promises).finally(() => this.fetchData(true, sync, showErrors)); - } - - /** - * Check date should be shown on event list for the current event. - * If date has changed from previous to current event it should be shown. - * - * @param event Current event where to show the date. - * @param prevEvent Previous event where to compare the date with. - * @return If date has changed and should be shown. - */ - protected showDate(event: AddonCalendarEventToDisplay, prevEvent?: AddonCalendarEventToDisplay): boolean { - if (!prevEvent) { - // First event, show it. - return true; - } - - // Check if day has changed. - return !moment(event.timestart * 1000).isSame(prevEvent.timestart * 1000, 'day'); - } - - /** - * Check if event ends the same date or not. - * - * @param event Event info. - * @return If date has changed and should be shown. - */ - protected endsSameDay(event: AddonCalendarEventToDisplay): boolean { - if (!event.timeduration) { - // No duration. - return true; - } - - // Check if day has changed. - return moment(event.timestart * 1000).isSame((event.timestart + event.timeduration) * 1000, 'day'); - } - - /** - * Show the context menu. - * - * @param event Event. - */ - async openFilter(event: MouseEvent): Promise { - await CoreDomUtils.openPopover({ - component: AddonCalendarFilterPopoverComponent, - componentProps: { - courses: this.courses, - filter: this.filter, - }, - event, - }); - } - - /** - * Open page to create/edit an event. - * - * @param eventId Event ID to edit. - */ - openEdit(eventId?: number): void { - this.eventId = undefined; - eventId = eventId || 0; - - const params: Params = {}; - - if (this.filter.courseId) { - params.courseId = this.filter.courseId; - } - - CoreNavigator.navigateToSitePath(`calendar/edit/${eventId}`, { params }); - } - - /** - * Open calendar events settings. - */ - openSettings(): void { - CoreNavigator.navigateToSitePath('/calendar/settings'); - } - - /** - * Navigate to a particular event. - * - * @param eventId Event to load. - */ - gotoEvent(eventId: number): void { - this.eventId = eventId; - - if (eventId <= 0) { - // It's an offline event, go to the edit page. - this.openEdit(eventId); - } else { - CoreNavigator.navigateToSitePath(`/calendar/event/${eventId}`); - } - } - - /** - * Find an event and mark it as deleted. - * - * @param eventId Event ID. - * @param deleted Whether to mark it as deleted or not. - */ - protected markAsDeleted(eventId: number, deleted: boolean): void { - const event = this.onlineEvents.find((event) => event.id == eventId); - - if (event) { - event.deleted = deleted; - } - } - - /** - * Page destroyed. - */ - ngOnDestroy(): void { - this.obsDefaultTimeChange?.off(); - this.newEventObserver?.off(); - this.discardedObserver?.off(); - this.editEventObserver?.off(); - this.deleteEventObserver?.off(); - this.undeleteEventObserver?.off(); - this.syncObserver?.off(); - this.manualSyncObserver?.off(); - this.filterChangedObserver?.off(); - this.onlineObserver?.unsubscribe(); - } - -} diff --git a/src/addons/calendar/pages/list/list.scss b/src/addons/calendar/pages/list/list.scss deleted file mode 100644 index 28505ddcb..000000000 --- a/src/addons/calendar/pages/list/list.scss +++ /dev/null @@ -1,5 +0,0 @@ -:host { - ion-note { - max-width: 30%; - } -} diff --git a/src/addons/calendar/pages/settings/settings.html b/src/addons/calendar/pages/settings/settings.html index 8cc5f6dee..d8982f79b 100644 --- a/src/addons/calendar/pages/settings/settings.html +++ b/src/addons/calendar/pages/settings/settings.html @@ -3,23 +3,17 @@ -

{{ 'core.settings.settings' | translate }}

+ +

{{ 'core.settings.settings' | translate }}

+
- + {{ 'addon.calendar.defaultnotificationtime' | translate }} - - {{ 'core.settings.disabled' | translate }} - {{ 600 | coreDuration }} - {{ 1800 | coreDuration }} - {{ 3600 | coreDuration }} - {{ 7200 | coreDuration }} - {{ 21600 | coreDuration }} - {{ 43200 | coreDuration }} - {{ 86400 | coreDuration }} + + {{ defaultTimeLabel }} diff --git a/src/addons/calendar/pages/settings/settings.ts b/src/addons/calendar/pages/settings/settings.ts index a42184f2d..ec1ee3455 100644 --- a/src/addons/calendar/pages/settings/settings.ts +++ b/src/addons/calendar/pages/settings/settings.ts @@ -13,9 +13,16 @@ // limitations under the License. import { Component, OnInit } from '@angular/core'; -import { AddonCalendar, AddonCalendarProvider } from '../../services/calendar'; +import { + AddonCalendar, + AddonCalendarProvider, + AddonCalendarReminderUnits, + AddonCalendarValueAndUnit, +} from '../../services/calendar'; import { CoreEvents } from '@singletons/events'; import { CoreSites } from '@services/sites'; +import { CoreDomUtils } from '@services/utils/dom'; +import { AddonCalendarReminderTimeModalComponent } from '@addons/calendar/components/reminder-time-modal/reminder-time-modal'; /** * Page that displays the calendar settings. @@ -26,13 +33,51 @@ import { CoreSites } from '@services/sites'; }) export class AddonCalendarSettingsPage implements OnInit { - defaultTime = -1; + defaultTimeLabel = ''; + + protected defaultTime: AddonCalendarValueAndUnit = { + value: 0, + unit: AddonCalendarReminderUnits.MINUTE, + }; /** * View loaded. */ async ngOnInit(): Promise { - this.defaultTime = await AddonCalendar.getDefaultNotificationTime(); + const defaultTime = await AddonCalendar.getDefaultNotificationTime(); + + this.defaultTime = AddonCalendarProvider.convertSecondsToValueAndUnit(defaultTime); + this.defaultTimeLabel = AddonCalendar.getUnitValueLabel(this.defaultTime.value, this.defaultTime.unit); + } + + /** + * Change default time. + * + * @param e Event. + * @return Promise resolved when done. + */ + async changeDefaultTime(e: Event): Promise { + e.stopPropagation(); + e.stopImmediatePropagation(); + e.preventDefault(); + + const reminderTime = await CoreDomUtils.openModal({ + component: AddonCalendarReminderTimeModalComponent, + componentProps: { + initialValue: this.defaultTime, + allowDisable: true, + }, + }); + + if (reminderTime === undefined) { + // User canceled. + return; + } + + this.defaultTime = AddonCalendarProvider.convertSecondsToValueAndUnit(reminderTime); + this.defaultTimeLabel = AddonCalendar.getUnitValueLabel(this.defaultTime.value, this.defaultTime.unit); + + this.updateDefaultTime(reminderTime); } /** diff --git a/src/addons/calendar/services/calendar-helper.ts b/src/addons/calendar/services/calendar-helper.ts index d457e4c05..dce3c6fc5 100644 --- a/src/addons/calendar/services/calendar-helper.ts +++ b/src/addons/calendar/services/calendar-helper.ts @@ -23,6 +23,7 @@ import { AddonCalendarEventType, AddonCalendarGetEventsEvent, AddonCalendarProvider, + AddonCalendarReminderUnits, AddonCalendarWeek, AddonCalendarWeekDay, } from './calendar'; @@ -35,6 +36,8 @@ import { makeSingleton } from '@singletons'; import { AddonCalendarSyncInvalidateEvent } from './calendar-sync'; import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline'; import { CoreCategoryData } from '@features/courses/services/courses'; +import { AddonCalendarReminderDBRecord } from './database/calendar'; +import { CoreTimeUtils } from '@services/utils/time'; /** * Context levels enumeration. @@ -138,7 +141,7 @@ export class AddonCalendarHelperProvider { // Add the event to all the days it lasts. while (!treatedDay.isAfter(endDay, 'day')) { - const monthId = this.getMonthId(treatedDay.year(), treatedDay.month() + 1); + const monthId = this.getMonthId(treatedDay); const day = treatedDay.date(); if (!result[monthId]) { @@ -161,7 +164,9 @@ export class AddonCalendarHelperProvider { * * @param event Event to format. */ - formatEventData(event: AddonCalendarEvent | AddonCalendarEventBase | AddonCalendarGetEventsEvent): AddonCalendarEventToDisplay { + async formatEventData( + event: AddonCalendarEvent | AddonCalendarEventBase | AddonCalendarGetEventsEvent, + ): Promise { const eventFormatted: AddonCalendarEventToDisplay = { ...event, @@ -176,7 +181,7 @@ export class AddonCalendarHelperProvider { }; if (event.modulename) { - eventFormatted.eventIcon = CoreCourse.getModuleIconSrc(event.modulename); + eventFormatted.eventIcon = await CoreCourse.getModuleIconSrc(event.modulename); eventFormatted.moduleIcon = eventFormatted.eventIcon; eventFormatted.iconTitle = CoreCourse.translateModuleName(event.modulename); } @@ -218,7 +223,7 @@ export class AddonCalendarHelperProvider { formatOfflineEventData(event: AddonCalendarOfflineEventDBRecord): AddonCalendarEventToDisplay { const eventFormatted: AddonCalendarEventToDisplay = { - id: event.id!, + id: event.id, name: event.name, timestart: event.timestart, eventtype: event.eventtype, @@ -241,6 +246,8 @@ export class AddonCalendarHelperProvider { format: 1, visible: 1, offline: true, + canedit: event.id < 0, + candelete: event.id < 0, timeduration: 0, }; @@ -280,6 +287,58 @@ export class AddonCalendarHelperProvider { } } + /** + * Format reminders, adding calculated data. + * + * @param reminders Reminders. + * @param timestart Event timestart. + * @param siteId Site ID. + * @return Formatted reminders. + */ + async formatReminders( + reminders: AddonCalendarReminderDBRecord[], + timestart: number, + siteId?: string, + ): Promise { + const defaultTime = await AddonCalendar.getDefaultNotificationTime(siteId); + + const formattedReminders = reminders; + const eventTimestart = timestart; + let defaultTimeValue: number | undefined; + let defaultTimeUnit: AddonCalendarReminderUnits | undefined; + + if (defaultTime > 0) { + const data = AddonCalendarProvider.convertSecondsToValueAndUnit(defaultTime); + defaultTimeValue = data.value; + defaultTimeUnit = data.unit; + } + + return formattedReminders.map((reminder) => { + if (reminder.time === null) { + // Default time. Check if default notifications are disabled. + if (defaultTimeValue !== undefined && defaultTimeUnit) { + reminder.value = defaultTimeValue; + reminder.unit = defaultTimeUnit; + reminder.timestamp = eventTimestart - reminder.value * reminder.unit; + } + } else { + const data = AddonCalendarProvider.convertSecondsToValueAndUnit(reminder.time); + reminder.value = data.value; + reminder.unit = data.unit; + reminder.timestamp = eventTimestart - reminder.time; + } + + if (reminder.value && reminder.unit) { + reminder.label = AddonCalendar.getUnitValueLabel(reminder.value, reminder.unit, reminder.time === null); + if (reminder.timestamp) { + reminder.sublabel = CoreTimeUtils.userDate(reminder.timestamp * 1000, 'core.strftimedatetime'); + } + } + + return reminder; + }); + } + /** * Get options (name & value) for each allowed event type. * @@ -309,14 +368,23 @@ export class AddonCalendarHelperProvider { } /** - * Get the month "id" (year + month). + * Get the month "id". * - * @param year Year. - * @param month Month. + * @param moment Month moment. * @return The "id". */ - getMonthId(year: number, month: number): string { - return year + '#' + month; + getMonthId(moment: moment.Moment): string { + return `${moment.year()}#${moment.month() + 1}`; + } + + /** + * Get the day "id". + * + * @param day Day moment. + * @return The "id". + */ + getDayId(moment: moment.Moment): string { + return `${this.getMonthId(moment)}#${moment.date()}`; } /** @@ -333,16 +401,16 @@ export class AddonCalendarHelperProvider { year: number, month: number, siteId?: string, - ): Promise<{ daynames: Partial[]; weeks: Partial[] }> { + ): Promise<{ daynames: Partial[]; weeks: AddonCalendarWeek[] }> { const site = await CoreSites.getSite(siteId); // Get starting week day user preference, fallback to site configuration. - let startWeekDayStr = site.getStoredConfig('calendar_startwday'); + let startWeekDayStr = site.getStoredConfig('calendar_startwday') || '1'; startWeekDayStr = await CoreConfig.get(AddonCalendarProvider.STARTING_WEEK_DAY, startWeekDayStr); const startWeekDay = parseInt(startWeekDayStr, 10); const today = moment(); const isCurrentMonth = today.year() == year && today.month() == month - 1; - const weeks: Partial[] = []; + const weeks: AddonCalendarWeek[] = []; let date = moment({ year, month: month - 1, date: 1 }); for (let mday = 1; mday <= date.daysInMonth(); mday++) { @@ -369,7 +437,7 @@ export class AddonCalendarHelperProvider { } // Add day to current week. - weeks[weeks.length - 1].days!.push({ + weeks[weeks.length - 1].days.push({ events: [], hasevents: false, mday: date.date(), @@ -448,11 +516,11 @@ export class AddonCalendarHelperProvider { */ getFilteredEvents( events: AddonCalendarEventToDisplay[], - filter: AddonCalendarFilter, + filter: AddonCalendarFilter | undefined, categories: { [id: number]: CoreCategoryData }, ): AddonCalendarEventToDisplay[] { // Do not filter. - if (!filter.filtered) { + if (!filter || !filter.filtered) { return events; } @@ -473,9 +541,9 @@ export class AddonCalendarHelperProvider { * Check if an event should be displayed based on the filter. * * @param event Event object. + * @param categories Categories indexed by ID. * @param courseId Course ID to filter. * @param categoryId Category ID the course belongs to. - * @param categories Categories indexed by ID. * @return Whether it should be displayed. */ protected shouldDisplayEvent( @@ -490,7 +558,7 @@ export class AddonCalendarHelperProvider { } if (event.eventtype == 'category' && categories) { - if (!event.categoryid || !Object.keys(categories).length) { + if (!event.categoryid || !Object.keys(categories).length || !categoryId) { // We can't tell if the course belongs to the category, display them all. return true; } @@ -501,7 +569,7 @@ export class AddonCalendarHelperProvider { } // Check parent categories. - let category = categories[categoryId!]; + let category = categories[categoryId]; while (category) { if (!category.parent) { // Category doesn't have parent, stop. @@ -565,7 +633,7 @@ export class AddonCalendarHelperProvider { await AddonCalendar.getLocalEventsByRepeatIdFromLocalDb(eventData.repeatid, site.id); await CoreUtils.allPromises(repeatedEvents.map((event) => - AddonCalendar.invalidateEvent(event.id!))); + AddonCalendar.invalidateEvent(event.id))); return; } @@ -595,7 +663,7 @@ export class AddonCalendarHelperProvider { fetchTimestarts.map((fetchTime) => { const day = moment(new Date(fetchTime * 1000)); - const monthId = this.getMonthId(day.year(), day.month() + 1); + const monthId = this.getMonthId(day); if (!treatedMonths[monthId]) { // Month not refetch or invalidated already, do it now. treatedMonths[monthId] = true; @@ -631,7 +699,7 @@ export class AddonCalendarHelperProvider { invalidateTimestarts.map((fetchTime) => { const day = moment(new Date(fetchTime * 1000)); - const monthId = this.getMonthId(day.year(), day.month() + 1); + const monthId = this.getMonthId(day); if (!treatedMonths[monthId]) { // Month not refetch or invalidated already, do it now. treatedMonths[monthId] = true; @@ -668,7 +736,7 @@ export class AddonCalendarHelperProvider { */ refreshAfterChangeEvent( event: { - id?: number; + id: number; repeatid?: number; timestart: number; }, @@ -677,7 +745,7 @@ export class AddonCalendarHelperProvider { ): Promise { return this.refreshAfterChangeEvents( [{ - id: event.id!, + id: event.id, repeatid: event.repeatid, timestart: event.timestart, repeated: repeated, @@ -723,3 +791,14 @@ export type AddonCalendarEventTypeOption = { name: string; value: AddonCalendarEventType; }; + +/** + * Formatted event reminder. + */ +export type AddonCalendarEventReminder = AddonCalendarReminderDBRecord & { + value?: number; // Amount of time. + unit?: AddonCalendarReminderUnits; // Units. + timestamp?: number; // Timestamp (in seconds). + label?: string; // Label to represent the reminder. + sublabel?: string; // Sub label. +}; diff --git a/src/addons/calendar/services/calendar-offline.ts b/src/addons/calendar/services/calendar-offline.ts index d34586f91..5d11344fa 100644 --- a/src/addons/calendar/services/calendar-offline.ts +++ b/src/addons/calendar/services/calendar-offline.ts @@ -110,7 +110,7 @@ export class AddonCalendarOfflineProvider { async getAllEditedEventsIds(siteId?: string): Promise { const events = await this.getAllEditedEvents(siteId); - return events.map((event) => event.id!); + return events.map((event) => event.id); } /** @@ -215,20 +215,18 @@ export class AddonCalendarOfflineProvider { /** * Offline version for adding a new discussion to a forum. * - * @param eventId Event ID. If it's a new event, set it to undefined/null. + * @param eventId Event ID. Negative value to edit offline event. If it's a new event, set it to undefined/null. * @param data Event data. - * @param timeCreated The time the event was created. If not defined, current time. * @param siteId Site ID. If not defined, current site. * @return Promise resolved with the stored event. */ async saveEvent( eventId: number | undefined, data: AddonCalendarSubmitCreateUpdateFormDataWSParams, - timeCreated?: number, siteId?: string, ): Promise { const site = await CoreSites.getSite(siteId); - timeCreated = timeCreated || Date.now(); + const timeCreated = Date.now(); const event: AddonCalendarOfflineEventDBRecord = { id: eventId || -timeCreated, name: data.name, diff --git a/src/addons/calendar/services/calendar-sync.ts b/src/addons/calendar/services/calendar-sync.ts index 5d6fcad20..12d26e5bb 100644 --- a/src/addons/calendar/services/calendar-sync.ts +++ b/src/addons/calendar/services/calendar-sync.ts @@ -29,6 +29,7 @@ import { AddonCalendarHelper } from './calendar-helper'; import { makeSingleton, Translate } from '@singletons'; import { CoreSync } from '@services/sync'; import { CoreNetworkError } from '@classes/errors/network-error'; +import moment from 'moment'; /** * Service to sync calendar. @@ -100,9 +101,10 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider { siteId = siteId || CoreSites.getCurrentSiteId(); - if (this.isSyncing(AddonCalendarSyncProvider.SYNC_ID, siteId)) { + const currentSyncPromise = this.getOngoingSync(AddonCalendarSyncProvider.SYNC_ID, siteId); + if (currentSyncPromise) { // There's already a sync ongoing for this site, return the promise. - return this.getOngoingSync(AddonCalendarSyncProvider.SYNC_ID, siteId)!; + return currentSyncPromise; } this.logger.debug('Try to sync calendar events for site ' + siteId); @@ -123,6 +125,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider 0 ? eventId : 0, data, siteId); + const newEvent = await AddonCalendar.submitEventOnline(eventId, data, siteId); result.updated = true; result.events.push(newEvent); + if (eventId < 0) { + result.offlineIdMap[eventId] = newEvent.id; + } // Add data to invalidate. const numberOfRepetitions = data.repeat ? data.repeats : @@ -272,7 +278,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider; // Map offline ID with online ID for created events. deleted: number[]; toinvalidate: AddonCalendarSyncInvalidateEvent[]; updated: boolean; source?: string; // Added on pages. - day?: number; // Added on day page. - month?: number; // Added on day page. - year?: number; // Added on day page. + moment?: moment.Moment; // Added on day page. }; export type AddonCalendarSyncInvalidateEvent = { diff --git a/src/addons/calendar/services/calendar.ts b/src/addons/calendar/services/calendar.ts index 0d3c84412..6877b54c3 100644 --- a/src/addons/calendar/services/calendar.ts +++ b/src/addons/calendar/services/calendar.ts @@ -39,11 +39,13 @@ import { SafeUrl } from '@angular/platform-browser'; import { CoreNavigator } from '@services/navigator'; import { AddonCalendarFilter } from './calendar-helper'; import { AddonCalendarSyncEvents, AddonCalendarSyncProvider } from './calendar-sync'; +import { CoreEvents } from '@singletons/events'; +import { CoreText } from '@singletons/text'; const ROOT_CACHE_KEY = 'mmaCalendar:'; /** - * Context levels enumeration. + * Main calendar Event types enumeration. */ export enum AddonCalendarEventType { SITE = 'site', @@ -53,6 +55,16 @@ export enum AddonCalendarEventType { USER = 'user', } +/** + * Units to set a reminder. + */ +export enum AddonCalendarReminderUnits { + MINUTE = CoreConstants.SECONDS_MINUTE, + HOUR = CoreConstants.SECONDS_HOUR, + DAY = CoreConstants.SECONDS_DAY, + WEEK = CoreConstants.SECONDS_WEEK, +} + declare module '@singletons/events' { /** @@ -72,6 +84,21 @@ declare module '@singletons/events' { } +const REMINDER_UNITS_LABELS = { + single: { + [AddonCalendarReminderUnits.MINUTE]: 'core.minute', + [AddonCalendarReminderUnits.HOUR]: 'core.hour', + [AddonCalendarReminderUnits.DAY]: 'core.day', + [AddonCalendarReminderUnits.WEEK]: 'core.week', + }, + multi: { + [AddonCalendarReminderUnits.MINUTE]: 'core.minutes', + [AddonCalendarReminderUnits.HOUR]: 'core.hours', + [AddonCalendarReminderUnits.DAY]: 'core.days', + [AddonCalendarReminderUnits.WEEK]: 'core.weeks', + }, +}; + /** * Service to handle calendar events. */ @@ -82,7 +109,6 @@ export class AddonCalendarProvider { static readonly COMPONENT = 'AddonCalendarEvents'; static readonly DEFAULT_NOTIFICATION_TIME_CHANGED = 'AddonCalendarDefaultNotificationTimeChangedEvent'; static readonly DEFAULT_NOTIFICATION_TIME_SETTING = 'mmaCalendarDefaultNotifTime'; - static readonly DEFAULT_NOTIFICATION_TIME = 60; static readonly STARTING_WEEK_DAY = 'addon_calendar_starting_week_day'; static readonly NEW_EVENT_EVENT = 'addon_calendar_new_event'; static readonly NEW_EVENT_DISCARDED_EVENT = 'addon_calendar_new_event_discarded'; @@ -125,36 +151,6 @@ export class AddonCalendarProvider { }, ]; - /** - * Check if a certain site allows deleting events. - * - * @param siteId Site Id. If not defined, use current site. - * @return Promise resolved with true if can delete. - * @since 3.3 - */ - async canDeleteEvents(siteId?: string): Promise { - try { - const site = await CoreSites.getSite(siteId); - - return this.canDeleteEventsInSite(site); - } catch { - return false; - } - } - - /** - * Check if a certain site allows deleting events. - * - * @param site Site. If not defined, use current site. - * @return Whether events can be deleted. - * @since 3.3 - */ - canDeleteEventsInSite(site?: CoreSite): boolean { - site = site || CoreSites.getCurrentSite(); - - return !!site?.wsAvailable('core_calendar_delete_calendar_events'); - } - /** * Check if a certain site allows creating and editing events. * @@ -187,66 +183,40 @@ export class AddonCalendarProvider { } /** - * Check if a certain site allows viewing events in monthly view. + * Given a number of seconds, convert it to a unit&value format compatible with reminders. * - * @param siteId Site Id. If not defined, use current site. - * @return Promise resolved with true if monthly view is supported. - * @since 3.4 + * @param seconds Number of seconds. + * @return Value and unit. */ - async canViewMonth(siteId?: string): Promise { - try { - const site = await CoreSites.getSite(siteId); - - return this.canViewMonthInSite(site); - } catch { - return false; + static convertSecondsToValueAndUnit(seconds: number): AddonCalendarValueAndUnit { + if (seconds <= 0) { + return { + value: 0, + unit: AddonCalendarReminderUnits.MINUTE, + }; + } else if (seconds % AddonCalendarReminderUnits.WEEK === 0) { + return { + value: seconds / AddonCalendarReminderUnits.WEEK, + unit: AddonCalendarReminderUnits.WEEK, + }; + } else if (seconds % AddonCalendarReminderUnits.DAY === 0) { + return { + value: seconds / AddonCalendarReminderUnits.DAY, + unit: AddonCalendarReminderUnits.DAY, + }; + } else if (seconds % AddonCalendarReminderUnits.HOUR === 0) { + return { + value: seconds / AddonCalendarReminderUnits.HOUR, + unit: AddonCalendarReminderUnits.HOUR, + }; + } else { + return { + value: seconds / AddonCalendarReminderUnits.MINUTE, + unit: AddonCalendarReminderUnits.MINUTE, + }; } } - /** - * Check if a certain site allows viewing events in monthly view. - * - * @param site Site. If not defined, use current site. - * @return Whether monthly view is supported. - * @since 3.4 - */ - canViewMonthInSite(site?: CoreSite): boolean { - site = site || CoreSites.getCurrentSite(); - - return !!site?.wsAvailable('core_calendar_get_calendar_monthly_view'); - } - - /** - * Gets the site main calendar page path. - * - * @param site Site. If not defined, use current site. - * @return Main calendar page path of the site. - */ - getMainCalendarPagePath(site?: CoreSite): string { - return AddonCalendarMainMenuHandlerService.PAGE_NAME + (this.canViewMonthInSite(site) ? '' : '/list'); - } - - /** - * Removes expired events from local DB. - * - * @param siteId ID of the site the event belongs to. If not defined, use current site. - * @return Promise resolved when done. - */ - async cleanExpiredEvents(siteId?: string): Promise { - const site = await CoreSites.getSite(siteId); - if (this.canViewMonthInSite(site)) { - // Site supports monthly view, don't clean expired events because user can see past events. - return; - } - const events = await site.getDb().getRecordsSelect( - EVENTS_TABLE, - 'timestart + timeduration < ?', - [CoreTimeUtils.timestamp()], - ); - - await Promise.all(events.map((event) => this.deleteLocalEvent(event.id!, siteId))); - } - /** * Delete an event. * @@ -339,7 +309,7 @@ export class AddonCalendarProvider { REMINDERS_TABLE, { eventid: eventId }, ).then((reminders) => - Promise.all(reminders.map((reminder) => this.deleteEventReminder(reminder.id!, siteId))))); + Promise.all(reminders.map((reminder) => this.deleteEventReminder(reminder.id, siteId))))); try { await Promise.all(promises); @@ -367,12 +337,8 @@ export class AddonCalendarProvider { return; } - // Check which page we should load. - const site = await CoreSites.getSite(notification.siteId); - const pageName = this.getMainCalendarPagePath(site); - CoreNavigator.navigateToSitePath( - pageName, + AddonCalendarMainMenuHandlerService.PAGE_NAME, { siteId: notification.siteId, preferCurrentTab: false, @@ -386,6 +352,28 @@ export class AddonCalendarProvider { }, ); + if (CoreLocalNotifications.isAvailable()) { + CoreEvents.on(AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_CHANGED, async (data) => { + const site = await CoreSites.getSite(data.siteId); + + // Get all the events that have a default reminder. + const query = 'SELECT events.*, reminders.id AS reminderid ' + + 'FROM ' + EVENTS_TABLE + ' events ' + + 'INNER JOIN ' + REMINDERS_TABLE + ' reminders ON events.id = reminders.eventid ' + + 'WHERE reminders.time IS NULL'; + + const result = await site.getDb().execute(query); + + // Reschedule all the default reminders. + for (let i = 0; i < result.rows.length; i++) { + const event = result.rows.item(i) as AddonCalendarEventDBRecord & { + reminderid: number; + }; + + this.scheduleEventNotification(event, event.reminderid, null, site.getId()); + } + }); + } } /** @@ -401,7 +389,7 @@ export class AddonCalendarProvider { */ async formatEventTime( event: AddonCalendarEventToDisplay, - format: string, + format?: string, useCommonWords = true, seenDay?: number, showTime = 0, @@ -573,7 +561,7 @@ export class AddonCalendarProvider { // Ignore errors. } - if (typeof value == 'undefined' || value === null) { + if (value === undefined || value === null) { value = site.getStoredConfig('calendar_lookahead'); } @@ -643,14 +631,14 @@ export class AddonCalendarProvider { * Get the configured default notification time. * * @param siteId ID of the site. If not defined, use current site. - * @return Promise resolved with the default time. + * @return Promise resolved with the default time (in seconds). */ async getDefaultNotificationTime(siteId?: string): Promise { siteId = siteId || CoreSites.getCurrentSiteId(); const key = AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_SETTING + '#' + siteId; - return CoreConfig.get(key, AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME); + return CoreConfig.get(key, CoreConstants.CONFIG.calendarreminderdefaultvalue || 3600); } /** @@ -695,7 +683,6 @@ export class AddonCalendarProvider { * @param id Event ID. * @param siteId ID of the site. If not defined, use current site. * @return Promise resolved when the event data is retrieved. - * @since 3.4 */ async getEventById(id: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); @@ -710,6 +697,9 @@ export class AddonCalendarProvider { const response: AddonCalendarGetCalendarEventByIdWSResponse = await site.read('core_calendar_get_calendar_event_by_id', params, preSets); + this.storeEventInLocalDb(response.event, { siteId }); + this.scheduleEventsNotifications([response.event], siteId); + return response.event; } catch (error) { try { @@ -742,10 +732,6 @@ export class AddonCalendarProvider { const record: AddonCalendarGetEventsEvent | AddonCalendarEvent | AddonCalendarEventDBRecord = await site.getDb().getRecord(EVENTS_TABLE, { id: id }); - if (!this.isGetEventByIdAvailableInSite(site)) { - return record as AddonCalendarGetEventsEvent; - } - const eventConverted = record as AddonCalendarEvent; const originalEvent = record as AddonCalendarGetEventsEvent; const recordAsRecord = record as AddonCalendarEventDBRecord; @@ -756,18 +742,18 @@ export class AddonCalendarProvider { eventConverted.iscategoryevent = originalEvent.eventtype == AddonCalendarEventType.CATEGORY; eventConverted.normalisedeventtype = this.getEventType(recordAsRecord); try { - eventConverted.category = CoreTextUtils.parseJSON(recordAsRecord.category!); + eventConverted.category = CoreTextUtils.parseJSON(recordAsRecord.category || ''); } catch { // Ignore errors. } try { - eventConverted.course = CoreTextUtils.parseJSON(recordAsRecord.course!); + eventConverted.course = CoreTextUtils.parseJSON(recordAsRecord.course || ''); } catch { // Ignore errors. } try { - eventConverted.subscription = CoreTextUtils.parseJSON(recordAsRecord.subscription!); + eventConverted.subscription = CoreTextUtils.parseJSON(recordAsRecord.subscription || ''); } catch { // Ignore errors. } @@ -778,24 +764,28 @@ export class AddonCalendarProvider { /** * Adds an event reminder and schedule a new notification. * - * @param event Event to update its notification time. - * @param time New notification setting timestamp. + * @param event Event to set the reminder. + * @param time Amount of seconds of the reminder. Undefined for default reminder. * @param siteId ID of the site the event belongs to. If not defined, use current site. * @return Promise resolved when the notification is updated. */ async addEventReminder( - event: { id: number; timestart: number; timeduration: number; name: string}, - time: number, + event: { id: number; timestart: number; name: string}, + time?: number | null, siteId?: string, ): Promise { const site = await CoreSites.getSite(siteId); - const reminder: AddonCalendarReminderDBRecord = { + const reminder: Partial = { eventid: event.id, - time: time, + time: time ?? null, + timecreated: Date.now(), }; + const reminderId = await site.getDb().insertRecord(REMINDERS_TABLE, reminder); - await this.scheduleEventNotification(event, reminderId, time, site.getId()); + const timestamp = time ? event.timestart - time : time; + + await this.scheduleEventNotification(event, reminderId, timestamp, site.getId()); } /** @@ -873,7 +863,8 @@ export class AddonCalendarProvider { preSets.emergencyCache = false; } const response: AddonCalendarCalendarDay = await site.read('core_calendar_get_calendar_day_view', params, preSets); - this.storeEventsInLocalDB(response.events, siteId); + this.storeEventsInLocalDB(response.events, { siteId }); + this.scheduleEventsNotifications(response.events, siteId); return response; } @@ -924,7 +915,7 @@ export class AddonCalendarProvider { async getEventReminders(id: number, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); - return await site.getDb().getRecords(REMINDERS_TABLE, { eventid: id }, 'time ASC'); + return await site.getDb().getRecords(REMINDERS_TABLE, { eventid: id }, 'timecreated ASC, time ASC'); } /** @@ -955,6 +946,10 @@ export class AddonCalendarProvider { const start = initialTime + (CoreConstants.SECONDS_DAY * daysToStart); const end = start + (CoreConstants.SECONDS_DAY * daysInterval) - 1; + const events = { + courseids: [], + groupids: [], + }; const params: AddonCalendarGetCalendarEventsWSParams = { options: { userevents: true, @@ -962,23 +957,20 @@ export class AddonCalendarProvider { timestart: start, timeend: end, }, - events: { - courseids: [], - groupids: [], - }, + events: events, }; const promises: Promise[] = []; promises.push(CoreCourses.getUserCourses(false, siteId).then((courses) => { - params.events!.courseids = courses.map((course) => course.id); - params.events!.courseids.push(site.getSiteHomeId()); // Add front page. + events.courseids = courses.map((course) => course.id); + events.courseids.push(site.getSiteHomeId()); // Add front page. return; })); promises.push(CoreGroups.getAllUserGroups(siteId).then((groups) => { - params.events!.groupids = groups.map((group) => group.id); + events.groupids = groups.map((group) => group.id); return; })); @@ -994,10 +986,6 @@ export class AddonCalendarProvider { }; const response: AddonCalendarGetCalendarEventsWSResponse = await site.read('core_calendar_get_calendar_events', params, preSets); - if (!this.canViewMonthInSite(site)) { - // Store events only in 3.1-3.3. In 3.4+ we'll use the new WS that return more info. - this.storeEventsInLocalDB(response.events, siteId); - } return response.events; } @@ -1059,12 +1047,8 @@ export class AddonCalendarProvider { const params: AddonCalendarGetCalendarMonthlyViewWSParams = { year: year, month: month, + mini: true, // Set mini to 1 to prevent returning the course selector HTML. }; - // This parameter requires Moodle 3.5. - if (site.isVersionGreaterEqualThan('3.5')) { - // Set mini to 1 to prevent returning the course selector HTML. - params.mini = true; - } if (courseId) { params.courseid = courseId; } @@ -1084,7 +1068,8 @@ export class AddonCalendarProvider { const response = await site.read('core_calendar_get_calendar_monthly_view', params, preSets); response.weeks.forEach((week) => { week.days.forEach((day) => { - this.storeEventsInLocalDB(day.events as AddonCalendarCalendarEvent[], siteId); + this.storeEventsInLocalDB(day.events, { siteId }); + this.scheduleEventsNotifications(day.events, siteId); }); }); @@ -1130,6 +1115,35 @@ export class AddonCalendarProvider { (categoryId ? categoryId : ''); } + /** + * Given a value and a unit, return the translated label. + * + * @param value Value. + * @param unit Unit. + * @param addDefaultLabel Whether to add the "Default" text. + * @return Translated label. + */ + getUnitValueLabel(value: number, unit: AddonCalendarReminderUnits, addDefaultLabel = false): string { + if (value === 0) { + return Translate.instant('core.settings.disabled'); + } + + const unitsLabel = value === 1 ? + REMINDER_UNITS_LABELS.single[unit] : + REMINDER_UNITS_LABELS.multi[unit]; + + const label = Translate.instant('addon.calendar.timebefore', { + units: Translate.instant(unitsLabel), + value: value, + }); + + if (addDefaultLabel) { + return Translate.instant('core.defaultvalue', { $a: label }); + } + + return label; + } + /** * Get upcoming calendar events. * @@ -1168,7 +1182,8 @@ export class AddonCalendarProvider { } const response = await site.read('core_calendar_get_calendar_upcoming_view', params, preSets); - this.storeEventsInLocalDB(response.events, siteId); + this.storeEventsInLocalDB(response.events, { siteId }); + this.scheduleEventsNotifications(response.events, siteId); return response; } @@ -1204,7 +1219,7 @@ export class AddonCalendarProvider { */ async getViewUrl(view: string, time?: number, courseId?: string, siteId?: string): Promise { const site = await CoreSites.getSite(siteId); - let url = CoreTextUtils.concatenatePaths(site.getURL(), 'calendar/view.php?view=' + view); + let url = CoreText.concatenatePaths(site.getURL(), 'calendar/view.php?view=' + view); if (time) { url += '&time=' + time; @@ -1406,36 +1421,6 @@ export class AddonCalendarProvider { return this.isCalendarDisabledInSite(site); } - /** - * Check if the get event by ID WS is available. - * - * @param siteId Site Id. If not defined, use current site. - * @return Promise resolved with true if available. - * @since 3.4 - */ - async isGetEventByIdAvailable(siteId?: string): Promise { - try { - const site = await CoreSites.getSite(siteId); - - return this.isGetEventByIdAvailableInSite(site); - } catch { - return false; - } - } - - /** - * Check if the get event by ID WS is available in a certain site. - * - * @param site Site. If not defined, use current site. - * @return Whether it's available. - * @since 3.4 - */ - isGetEventByIdAvailableInSite(site?: CoreSite): boolean { - site = site || CoreSites.getCurrentSite(); - - return !!site?.wsAvailable('core_calendar_get_calendar_event_by_id'); - } - /** * Get the next events for all the sites and schedules their notifications. * If an event notification time is 0, cancel its scheduled notification (if any). @@ -1450,7 +1435,7 @@ export class AddonCalendarProvider { const siteIds = await CoreSites.getSitesIds(); - const promises = siteIds.map((siteId: string) => this.cleanExpiredEvents(siteId).then(async() => { + const promises = siteIds.map((siteId: string) => async () => { if (notificationsEnabled) { // Check if calendar is disabled for the site. const disabled = await this.isDisabled(siteId); @@ -1462,7 +1447,7 @@ export class AddonCalendarProvider { } return; - })); + }); await Promise.all(promises); } @@ -1473,14 +1458,14 @@ export class AddonCalendarProvider { * * @param event Event to schedule. * @param reminderId The reminder ID. - * @param time Notification setting time (in minutes). E.g. 10 means "notificate 10 minutes before start". + * @param time Notification timestamp (in seconds). Undefined for default time. * @param siteId Site ID the event belongs to. If not defined, use current site. * @return Promise resolved when the notification is scheduled. */ protected async scheduleEventNotification( event: { id: number; timestart: number; name: string}, reminderId: number, - time: number, + time?: number | null, siteId?: string, ): Promise { @@ -1495,16 +1480,16 @@ export class AddonCalendarProvider { return CoreLocalNotifications.cancel(reminderId, AddonCalendarProvider.COMPONENT, siteId); } - if (time == -1) { - // If time is -1, get event default time to calculate the notification time. + if (!time) { + // Get event default time to calculate the notification time. time = await this.getDefaultNotificationTime(siteId); - if (time == 0) { + if (time === 0) { // Default notification time is disabled, do not show. return CoreLocalNotifications.cancel(reminderId, AddonCalendarProvider.COMPONENT, siteId); } - time = event.timestart - (time * 60); + time = event.timestart - time; } time = time * 1000; @@ -1555,17 +1540,18 @@ export class AddonCalendarProvider { siteId = siteId || CoreSites.getCurrentSiteId(); const promises = events.map(async (event) => { - const timeEnd = (event.timestart + event.timeduration) * 1000; - - if (timeEnd <= new Date().getTime()) { - // The event has finished already, don't schedule it. - return this.deleteLocalEvent(event.id, siteId); + if (event.timestart * 1000 <= Date.now()) { + // The event has already started, don't schedule it. + return; } const reminders = await this.getEventReminders(event.id, siteId); - const p2 = reminders.map((reminder: AddonCalendarReminderDBRecord) => - this.scheduleEventNotification(event, (reminder.id!), reminder.time, siteId)); + const p2 = reminders.map((reminder) => { + const time = reminder.time ? event.timestart - reminder.time : reminder.time; + + return this.scheduleEventNotification(event, reminder.id, time, siteId); + }); await Promise.all(p2); }); @@ -1592,20 +1578,29 @@ export class AddonCalendarProvider { * Store an event in local DB as it is. * * @param event Event to store. - * @param siteId ID of the site the event belongs to. If not defined, use current site. + * @param options Options. * @return Promise resolved when stored. */ - async storeEventInLocalDb(event: AddonCalendarGetEventsEvent | AddonCalendarCalendarEvent, siteId?: string): Promise { - const site = await CoreSites.getSite(siteId); - siteId = site.getId(); - try { - await this.getEventFromLocalDb(event.id, site.id); - } catch { - // Event does not exist. Check if any reminder exists first. - const reminders = await this.getEventReminders(event.id, siteId); + protected async storeEventInLocalDb( + event: AddonCalendarGetEventsEvent | AddonCalendarCalendarEvent | AddonCalendarEvent, + options: AddonCalendarStoreEventsOptions = {}, + ): Promise { + const site = await CoreSites.getSite(options.siteId); + const siteId = site.getId(); + const addDefaultReminder = options.addDefaultReminder ?? true; - if (reminders.length == 0) { - this.addEventReminder(event, -1, siteId); + if (addDefaultReminder) { + // Add default reminder if the event isn't stored already and doesn't have any reminder. + try { + await this.getEventFromLocalDb(event.id, siteId); + } catch { + // Event does not exist. + const reminders = await this.getEventReminders(event.id, siteId); + + if (reminders.length === 0) { + // No reminders, create the default one. + this.addEventReminder(event, undefined, siteId); + } } } @@ -1643,12 +1638,17 @@ export class AddonCalendarProvider { viewurl: event.viewurl, isactionevent: event.isactionevent ? 1 : 0, url: event.url, - islastday: event.islastday ? 1 : 0, - popupname: event.popupname, - mindaytimestamp: event.mindaytimestamp, - maxdaytimestamp: event.maxdaytimestamp, - draggable: event.draggable ? 1 : 0, }); + + if ('islastday' in event) { + eventRecord = Object.assign(eventRecord, { + islastday: event.islastday ? 1 : 0, + popupname: event.popupname, + mindaytimestamp: event.mindaytimestamp, + maxdaytimestamp: event.maxdaytimestamp, + draggable: event.draggable ? 1 : 0, + }); + } } else if ('uuid' in event) { eventRecord = Object.assign(eventRecord, { courseid: event.courseid, @@ -1665,25 +1665,20 @@ export class AddonCalendarProvider { * Store events in local DB. * * @param events Events to store. - * @param siteId ID of the site the event belongs to. If not defined, use current site. + * @param options Options. * @return Promise resolved when the events are stored. */ protected async storeEventsInLocalDB( - events: (AddonCalendarGetEventsEvent | AddonCalendarCalendarEvent)[], - siteId?: string, + events: (AddonCalendarGetEventsEvent | AddonCalendarCalendarEvent | AddonCalendarEvent)[], + options: AddonCalendarStoreEventsOptions = {}, ): Promise { - const site = await CoreSites.getSite(siteId); - siteId = site.getId(); - - await Promise.all(events.map((event: AddonCalendarGetEventsEvent| AddonCalendarCalendarEvent) => - // If event does not exist on the DB, schedule the reminder. - this.storeEventInLocalDb(event, siteId))); + await Promise.all(events.map((event) => this.storeEventInLocalDb(event, options))); } /** * Submit a calendar event. * - * @param eventId ID of the event. If undefined/null, create a new event. + * @param eventId ID of the event. Negative value to edit offline event. If undefined/null, create a new event. * @param formData Form data. * @param timeCreated The time the event was created. Only if modifying a new offline event. * @param forceOffline True to always save it in offline. @@ -1693,19 +1688,26 @@ export class AddonCalendarProvider { async submitEvent( eventId: number | undefined, formData: AddonCalendarSubmitCreateUpdateFormDataWSParams, - timeCreated?: number, - forceOffline = false, - siteId?: string, + options: AddonCalendarSubmitEventOptions = {}, ): Promise<{sent: boolean; event: AddonCalendarOfflineEventDBRecord | AddonCalendarEvent}> { - siteId = siteId || CoreSites.getCurrentSiteId(); + const siteId = options.siteId || CoreSites.getCurrentSiteId(); // Function to store the event to be synchronized later. - const storeOffline = (): Promise<{ sent: boolean; event: AddonCalendarOfflineEventDBRecord }> => - AddonCalendarOffline.saveEvent(eventId, formData, timeCreated, siteId).then((event) => - ({ sent: false, event })); + const storeOffline = async (): Promise<{ sent: boolean; event: AddonCalendarOfflineEventDBRecord }> => { + const event = await AddonCalendarOffline.saveEvent(eventId, formData, siteId); - if (forceOffline || !CoreApp.isOnline()) { + // Now save the reminders if any. + if (options.reminders?.length) { + await CoreUtils.ignoreErrors( + Promise.all(options.reminders.map((reminder) => this.addEventReminder(event, reminder.time, siteId))), + ); + } + + return { sent: false, event }; + }; + + if (options.forceOffline || !CoreApp.isOnline()) { // App is offline, store the event. return storeOffline(); } @@ -1717,6 +1719,13 @@ export class AddonCalendarProvider { try { const event = await this.submitEventOnline(eventId, formData, siteId); + // Now save the reminders if any. + if (options.reminders?.length) { + await CoreUtils.ignoreErrors( + Promise.all(options.reminders.map((reminder) => this.addEventReminder(event, reminder.time, siteId))), + ); + } + return ({ sent: true, event }); } catch (error) { if (error && !CoreUtils.isWebServiceError(error)) { @@ -1732,7 +1741,7 @@ export class AddonCalendarProvider { /** * Submit an event, either to create it or to edit it. It will fail if offline or cannot connect. * - * @param eventId ID of the event. If undefined/null, create a new event. + * @param eventId ID of the event. If undefined/null or negative number, create a new event. * @param formData Form data. * @param siteId Site ID. If not provided, current site. * @return Promise resolved when done. @@ -1743,8 +1752,9 @@ export class AddonCalendarProvider { siteId?: string, ): Promise { const site = await CoreSites.getSite(siteId); + // Add data that is "hidden" in web. - formData.id = eventId; + formData.id = eventId > 0 ? eventId : 0; formData.userid = site.getUserId(); formData.visible = 1; formData.instance = 0; @@ -1753,12 +1763,14 @@ export class AddonCalendarProvider { } else { formData['_qf__core_calendar_local_event_forms_create'] = 1; } + const params: AddonCalendarSubmitCreateUpdateFormWSParams = { formdata: CoreUtils.objectToGetParams(formData), }; const result = await site.write('core_calendar_submit_create_update_form', params); - if (result.validationerror) { + + if (result.validationerror || !result.event) { // Simulate a WS error. throw new CoreWSError({ message: Translate.instant('core.invalidformdata'), @@ -1766,7 +1778,19 @@ export class AddonCalendarProvider { }); } - return result.event!; + if (eventId < 0) { + // Offline event has been sent. Change reminders eventid if any. + await CoreUtils.ignoreErrors( + site.getDb().updateRecords(REMINDERS_TABLE, { eventid: result.event.id }, { eventid: eventId }), + ); + } + + if (formData.id === 0) { + // Store the new event in local DB. + await CoreUtils.ignoreErrors(this.storeEventInLocalDb(result.event, { addDefaultReminder: false, siteId })); + } + + return result.event; } } @@ -1791,6 +1815,7 @@ export type AddonCalendarGetActionEventsByCoursesWSParams = { timesortfrom?: number; // Time sort from. timesortto?: number; // Time sort to. limitnum?: number; // Limit number. + searchvalue?: string; // The value a user wishes to search against. }; /** @@ -1810,6 +1835,7 @@ export type AddonCalendarGetActionEventsByCourseWSParams = { timesortto?: number; // Time sort to. aftereventid?: number; // The last seen event id. limitnum?: number; // Limit number. + searchvalue?: string; // The value a user wishes to search against. }; /** @@ -1822,6 +1848,7 @@ export type AddonCalendarGetActionEventsByTimesortWSParams = { limitnum?: number; // Limit number. limittononsuspendedevents?: boolean; // Limit the events to courses the user is not suspended in. userid?: number; // The user id. + searchvalue?: string; // The value a user wishes to search against. }; /** @@ -1845,14 +1872,19 @@ export type AddonCalendarEventBase = { userid?: number; // Userid. repeatid?: number; // Repeatid. eventcount?: number; // Eventcount. + component?: string; // Component. modulename?: string; // Modulename. + activityname?: string; // Activityname. + activitystr?: string; // Activitystr. instance?: number; // Instance. eventtype: AddonCalendarEventType; // Eventtype. timestart: number; // Timestart. timeduration: number; // Timeduration. timesort: number; // Timesort. + timeusermidnight: number; // Timeusermidnight. visible: number; // Visible. timemodified: number; // Timemodified. + overdue?: boolean; // Overdue. icon: { key: string; // Key. component: string; // Component. @@ -1995,7 +2027,7 @@ export type AddonCalendarMonth = { date: CoreWSDate; periodname: string; // Periodname. includenavigation: boolean; // Includenavigation. - initialeventsloaded: boolean; // @since 3.5. Initialeventsloaded. + initialeventsloaded: boolean; // Initialeventsloaded. previousperiod: CoreWSDate; previousperiodlink: string; // Previousperiodlink. previousperiodname: string; // Previousperiodname. @@ -2151,7 +2183,7 @@ export type AddonCalendarGetEventsEvent = { description?: string; // Description. format: number; // Description format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). courseid: number; // Course id. - categoryid?: number; // @since 3.4. Category id (only for category events). + categoryid?: number; // Category id (only for category events). groupid: number; // Group id. userid: number; // User id. repeatid: number; // Repeat id. @@ -2221,7 +2253,8 @@ type AddonCalendarSubmitCreateUpdateFormWSParams = { /** * Form data on AddonCalendarSubmitCreateUpdateFormWSParams. */ -export type AddonCalendarSubmitCreateUpdateFormDataWSParams = Omit & { +export type AddonCalendarSubmitCreateUpdateFormDataWSParams = Omit & { + id?: number; description?: { text: string; format: number; @@ -2276,6 +2309,7 @@ export type AddonCalendarEventToDisplay = Partial & */ export type AddonCalendarUpdatedEventEvent = { eventId: number; + oldEventId?: number; // Old event ID. Used when an offline event is sent. sent?: boolean; }; @@ -2287,3 +2321,30 @@ type AddonCalendarPushNotificationData = { reminderId: number; siteId: string; }; + +/** + * Value and unit for reminders. + */ +export type AddonCalendarValueAndUnit = { + value: number; + unit: AddonCalendarReminderUnits; +}; + +/** + * Options to pass to submit event. + */ +export type AddonCalendarSubmitEventOptions = { + reminders?: { + time: number | null; + }[]; + forceOffline?: boolean; + siteId?: string; // Site ID. If not defined, current site. +}; + +/** + * Options to pass to store events in local DB. + */ +export type AddonCalendarStoreEventsOptions = { + addDefaultReminder?: boolean; // Whether to add default reminder for new events with no reminders. Defaults to true. + siteId?: string; // Site ID. If not defined, current site. +}; diff --git a/src/addons/calendar/services/database/calendar-offline.ts b/src/addons/calendar/services/database/calendar-offline.ts index 046dc59f5..5e08f8378 100644 --- a/src/addons/calendar/services/database/calendar-offline.ts +++ b/src/addons/calendar/services/database/calendar-offline.ts @@ -135,7 +135,7 @@ export const CALENDAR_OFFLINE_SITE_SCHEMA: CoreSiteSchema = { }; export type AddonCalendarOfflineEventDBRecord = { - id?: number; // Negative for offline entries. + id: number; // Negative for offline entries. name: string; timestart: number; eventtype: AddonCalendarEventType; diff --git a/src/addons/calendar/services/database/calendar.ts b/src/addons/calendar/services/database/calendar.ts index c6d3acd3d..1349eb9be 100644 --- a/src/addons/calendar/services/database/calendar.ts +++ b/src/addons/calendar/services/database/calendar.ts @@ -13,17 +13,19 @@ // limitations under the License. import { SQLiteDB } from '@classes/sqlitedb'; +import { CoreConfig } from '@services/config'; import { CoreSiteSchema } from '@services/sites'; -import { AddonCalendarEventType } from '../calendar'; +import { CoreUtils } from '@services/utils/utils'; +import { AddonCalendar, AddonCalendarEventType, AddonCalendarProvider } from '../calendar'; /** - * Database variables for AddonDatabase service. + * Database variables for AddonCalendarProvider service. */ export const EVENTS_TABLE = 'addon_calendar_events_3'; -export const REMINDERS_TABLE = 'addon_calendar_reminders'; +export const REMINDERS_TABLE = 'addon_calendar_reminders_2'; export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { name: 'AddonCalendarProvider', - version: 3, + version: 4, canBeCleared: [EVENTS_TABLE], tables: [ { @@ -193,14 +195,19 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { name: 'time', type: 'INTEGER', }, + { + name: 'timecreated', + type: 'INTEGER', + }, ], uniqueKeys: [ ['eventid', 'time'], ], }, ], - async migrate(db: SQLiteDB, oldVersion: number): Promise { + async migrate(db: SQLiteDB, oldVersion: number, siteId: string): Promise { if (oldVersion < 3) { + // Migrate calendar events. New format @since 3.7. let oldTable = 'addon_calendar_events_2'; try { @@ -212,11 +219,67 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { await db.migrateTable(oldTable, EVENTS_TABLE); } + + if (oldVersion < 4) { + // Migrate default notification time if it was changed. + // Don't use getDefaultNotificationTime to be able to detect if the value was changed or not. + const key = AddonCalendarProvider.DEFAULT_NOTIFICATION_TIME_SETTING + '#' + siteId; + const defaultTime = await CoreUtils.ignoreErrors(CoreConfig.get(key, null)); + + if (defaultTime) { + // Convert from minutes to seconds. + AddonCalendar.setDefaultNotificationTime(defaultTime * 60, siteId); + } + + // Migrate reminders. New format @since 4.0. + const oldTable = 'addon_calendar_reminders'; + + try { + await db.tableExists(oldTable); + } catch (error) { + // Old table does not exist, ignore. + return; + } + + const records = await db.getAllRecords(oldTable); + const events: Record = {}; + + await Promise.all(records.map(async (record) => { + // Get the event to compare the reminder time with the event time. + if (!events[record.eventid]) { + try { + events[record.eventid] = await db.getRecord(EVENTS_TABLE, { id: record.eventid }); + } catch { + // Event not found in local DB, shouldn't happen. Ignore the reminder. + return; + } + } + + if (!record.time || record.time === -1) { + // Default reminder. Use null now. + record.time = null; + } else if (record.time > events[record.eventid].timestart) { + // Reminder is after the event, ignore it. + return; + } else { + // Remove seconds from the old reminder, it could include seconds by mistake. + record.time = events[record.eventid].timestart - Math.floor(record.time / 60) * 60; + } + + return db.insertRecord(REMINDERS_TABLE, record); + })); + + try { + await db.dropTable(oldTable); + } catch (error) { + // Error deleting old table, ignore. + } + } }, }; export type AddonCalendarEventDBRecord = { - id?: number; + id: number; name: string; description: string; eventtype: AddonCalendarEventType; @@ -257,7 +320,8 @@ export type AddonCalendarEventDBRecord = { }; export type AddonCalendarReminderDBRecord = { - id?: number; + id: number; eventid: number; - time: number; + time: number | null; // Number of seconds before the event, null for default time. + timecreated?: number | null; }; diff --git a/src/addons/calendar/services/handlers/mainmenu.ts b/src/addons/calendar/services/handlers/mainmenu.ts index 5540b1149..74a4cb6e0 100644 --- a/src/addons/calendar/services/handlers/mainmenu.ts +++ b/src/addons/calendar/services/handlers/mainmenu.ts @@ -26,7 +26,7 @@ export class AddonCalendarMainMenuHandlerService implements CoreMainMenuHandler static readonly PAGE_NAME = 'calendar'; name = 'AddonCalendar'; - priority = 900; + priority = 550; /** * Check if the handler is enabled on a site level. @@ -46,7 +46,7 @@ export class AddonCalendarMainMenuHandlerService implements CoreMainMenuHandler return { icon: 'far-calendar', title: 'addon.calendar.calendar', - page: AddonCalendar.getMainCalendarPagePath(), + page: AddonCalendarMainMenuHandlerService.PAGE_NAME, class: 'addon-calendar-handler', }; } diff --git a/src/addons/calendar/services/handlers/view-link.ts b/src/addons/calendar/services/handlers/view-link.ts index e7a59019f..45914e697 100644 --- a/src/addons/calendar/services/handlers/view-link.ts +++ b/src/addons/calendar/services/handlers/view-link.ts @@ -111,13 +111,9 @@ export class AddonCalendarViewLinkHandlerService extends CoreContentLinksHandler return false; } - return AddonCalendar.isDisabled(siteId).then((disabled) => { - if (disabled) { - return false; - } + const disabled = await AddonCalendar.isDisabled(siteId); - return AddonCalendar.canViewMonth(siteId); - }); + return !disabled; } } diff --git a/src/addons/competency/classes/competency-course-competencies-source.ts b/src/addons/competency/classes/competency-course-competencies-source.ts new file mode 100644 index 000000000..363514900 --- /dev/null +++ b/src/addons/competency/classes/competency-course-competencies-source.ts @@ -0,0 +1,97 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source'; +import { CoreUserProfile } from '@features/user/services/user'; +import { CoreUtils } from '@services/utils/utils'; +import { + AddonCompetency, + AddonCompetencyDataForCourseCompetenciesPageCompetency, + AddonCompetencyDataForCourseCompetenciesPageWSResponse, +} from '../services/competency'; +import { AddonCompetencyHelper } from '../services/competency-helper'; + +/** + * Provides a collection of course competencies. + */ +export class AddonCompetencyCourseCompetenciesSource + extends CoreRoutedItemsManagerSource { + + /** + * @inheritdoc + */ + static getSourceId(courseId: number, userId?: number): string { + return `${courseId}-${userId || 'current-user'}`; + } + + readonly COURSE_ID: number; + readonly USER_ID?: number; + + courseCompetencies?: AddonCompetencyDataForCourseCompetenciesPageWSResponse; + user?: CoreUserProfile; + + constructor(courseId: number, userId?: number) { + super(); + + this.COURSE_ID = courseId; + this.USER_ID = userId; + } + + /** + * @inheritdoc + */ + getItemPath(competency: AddonCompetencyDataForCourseCompetenciesPageCompetency): string { + return String(competency.competency.id); + } + + /** + * @inheritdoc + */ + async load(): Promise { + if (this.dirty || !this.courseCompetencies) { + await this.loadCourseCompetencies(); + } + + await super.load(); + } + + /** + * Invalidate course cache. + */ + async invalidateCache(): Promise { + await CoreUtils.ignoreErrors(AddonCompetency.invalidateCourseCompetencies(this.COURSE_ID, this.USER_ID)); + } + + /** + * @inheritdoc + */ + protected async loadPageItems(): Promise<{ items: AddonCompetencyDataForCourseCompetenciesPageCompetency[] }> { + if (!this.courseCompetencies) { + throw new Error('Can\'t load competencies without course data'); + } + + return { items: this.courseCompetencies.competencies }; + } + + /** + * Load competencies. + */ + private async loadCourseCompetencies(): Promise { + [this.courseCompetencies, this.user] = await Promise.all([ + AddonCompetency.getCourseCompetencies(this.COURSE_ID, this.USER_ID), + AddonCompetencyHelper.getProfile(this.USER_ID), + ]); + } + +} diff --git a/src/addons/competency/classes/competency-plan-competencies-source.ts b/src/addons/competency/classes/competency-plan-competencies-source.ts new file mode 100644 index 000000000..a674f4c1e --- /dev/null +++ b/src/addons/competency/classes/competency-plan-competencies-source.ts @@ -0,0 +1,88 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source'; +import { CoreUserProfile } from '@features/user/services/user'; +import { CoreUtils } from '@services/utils/utils'; +import { + AddonCompetency, + AddonCompetencyDataForPlanPageCompetency, + AddonCompetencyDataForPlanPageWSResponse, +} from '../services/competency'; +import { AddonCompetencyHelper } from '../services/competency-helper'; + +/** + * Provides a collection of plan competencies. + */ +export class AddonCompetencyPlanCompetenciesSource extends CoreRoutedItemsManagerSource { + + readonly PLAN_ID: number; + + plan?: AddonCompetencyDataForPlanPageWSResponse; + user?: CoreUserProfile; + + constructor(planId: number) { + super(); + + this.PLAN_ID = planId; + } + + /** + * @inheritdoc + */ + getItemPath(competency: AddonCompetencyDataForPlanPageCompetency): string { + return String(competency.competency.id); + } + + /** + * @inheritdoc + */ + async load(): Promise { + if (this.dirty || !this.plan) { + await this.loadLearningPlan(); + } + + await super.load(); + } + + /** + * Invalidate plan cache. + */ + async invalidateCache(): Promise { + await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(this.PLAN_ID)); + } + + /** + * @inheritdoc + */ + protected async loadPageItems(): Promise<{ items: AddonCompetencyDataForPlanPageCompetency[] }> { + if (!this.plan) { + throw new Error('Can\'t load competencies without plan!'); + } + + return { items: this.plan.competencies }; + } + + /** + * Load learning plan. + */ + private async loadLearningPlan(): Promise { + this.plan = await AddonCompetency.getLearningPlan(this.PLAN_ID); + this.plan.plan.statusname = AddonCompetencyHelper.getPlanStatusName(this.plan.plan.status); + + // Get the user profile image. + this.user = await AddonCompetencyHelper.getProfile(this.plan.plan.userid); + } + +} diff --git a/src/addons/competency/classes/competency-plans-source.ts b/src/addons/competency/classes/competency-plans-source.ts new file mode 100644 index 000000000..471db5ba5 --- /dev/null +++ b/src/addons/competency/classes/competency-plans-source.ts @@ -0,0 +1,97 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Params } from '@angular/router'; +import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source'; +import { ADDON_COMPETENCY_COMPETENCIES_PAGE } from '../competency.module'; +import { AddonCompetency, AddonCompetencyPlan, AddonCompetencyProvider } from '../services/competency'; +import { AddonCompetencyHelper } from '../services/competency-helper'; + +/** + * Provides a collection of learning plans. + */ +export class AddonCompetencyPlansSource extends CoreRoutedItemsManagerSource { + + /** + * @inheritdoc + */ + static getSourceId(userId?: number): string { + return userId ? String(userId) : 'current-user'; + } + + readonly USER_ID?: number; + + constructor(userId?: number) { + super(); + + this.USER_ID = userId; + } + + /** + * @inheritdoc + */ + getItemPath(plan: AddonCompetencyPlanFormatted): string { + return `${plan.id}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`; + } + + /** + * @inheritdoc + */ + getItemQueryParams(): Params { + if (this.USER_ID) { + return { userId: this.USER_ID }; + } + + return {}; + } + + /** + * Invalidate learning plans cache. + */ + async invalidateCache(): Promise { + await AddonCompetency.invalidateLearningPlans(this.USER_ID); + } + + /** + * @inheritdoc + */ + protected async loadPageItems(): Promise<{ items: AddonCompetencyPlanFormatted[] }> { + const plans = await AddonCompetency.getLearningPlans(this.USER_ID); + + plans.forEach((plan: AddonCompetencyPlanFormatted) => { + plan.statusname = AddonCompetencyHelper.getPlanStatusName(plan.status); + switch (plan.status) { + case AddonCompetencyProvider.STATUS_ACTIVE: + plan.statuscolor = 'success'; + break; + case AddonCompetencyProvider.STATUS_COMPLETE: + plan.statuscolor = 'danger'; + break; + default: + plan.statuscolor = 'warning'; + break; + } + }); + + return { items: plans }; + } + +} + +/** + * Competency plan with some calculated data. + */ +export type AddonCompetencyPlanFormatted = AddonCompetencyPlan & { + statuscolor?: string; // Calculated in the app. Color of the plan's status. +}; diff --git a/src/addons/competency/competency-course-lazy.module.ts b/src/addons/competency/competency-course-contents-lazy.module.ts similarity index 95% rename from src/addons/competency/competency-course-lazy.module.ts rename to src/addons/competency/competency-course-contents-lazy.module.ts index 860401684..f132f614b 100644 --- a/src/addons/competency/competency-course-lazy.module.ts +++ b/src/addons/competency/competency-course-contents-lazy.module.ts @@ -15,8 +15,8 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { AddonCompetencyCourseCompetenciesPageModule } from './pages/coursecompetencies/coursecompetencies.module'; import { AddonCompetencyCourseCompetenciesPage } from './pages/coursecompetencies/coursecompetencies.page'; +import { AddonCompetencyCourseCompetenciesPageModule } from './pages/coursecompetencies/coursecompetencies.module'; const routes: Routes = [ { @@ -31,4 +31,4 @@ const routes: Routes = [ AddonCompetencyCourseCompetenciesPageModule, ], }) -export class AddonCompetencyCourseLazyModule {} +export class AddonCompetencyCourseContentsLazyModule {} diff --git a/src/addons/competency/competency-course-details-lazy.module.ts b/src/addons/competency/competency-course-details-lazy.module.ts new file mode 100644 index 000000000..4d9bf9ea7 --- /dev/null +++ b/src/addons/competency/competency-course-details-lazy.module.ts @@ -0,0 +1,72 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; + +import { AddonCompetencyCompetencyPage } from './pages/competency/competency.page'; +import { AddonCompetencyCompetencySummaryPage } from './pages/competencysummary/competencysummary.page'; +import { ADDON_COMPETENCY_SUMMARY_PAGE } from './competency.module'; +import { AddonCompetencyCompetencyPageModule } from './pages/competency/competency.module'; +import { AddonCompetencyCompetencySummaryPageModule } from './pages/competencysummary/competencysummary.module'; +import { AddonCompetencyCourseCompetenciesPage } from './pages/coursecompetencies/coursecompetencies.page'; +import { AddonCompetencyCourseCompetenciesPageModule } from './pages/coursecompetencies/coursecompetencies.module'; +import { AddonCompetencyCompetenciesPage } from './pages/competencies/competencies.page'; +import { conditionalRoutes } from '@/app/app-routing.module'; +import { CoreScreen } from '@services/screen'; +import { AddonCompetencyCompetenciesPageModule } from './pages/competencies/competencies.module'; + +const mobileRoutes: Routes = [ + { + path: '', + component: AddonCompetencyCourseCompetenciesPage, + }, + { + path: ':competencyId', + component: AddonCompetencyCompetencyPage, + }, +]; + +const tabletRoutes: Routes = [ + { + path: '', + component: AddonCompetencyCompetenciesPage, + children: [ + { + path: ':competencyId', + component: AddonCompetencyCompetencyPage, + }, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.isTablet), + { + path: `:competencyId/${ADDON_COMPETENCY_SUMMARY_PAGE}`, + component: AddonCompetencyCompetencySummaryPage, + }, +]; + +@NgModule({ + imports: [ + RouterModule.forChild(routes), + AddonCompetencyCourseCompetenciesPageModule, + AddonCompetencyCompetenciesPageModule, + AddonCompetencyCompetencyPageModule, + AddonCompetencyCompetencySummaryPageModule, + ], +}) +export class AddonCompetencyCourseDetailsLazyModule {} diff --git a/src/addons/competency/competency-lazy.module.ts b/src/addons/competency/competency-learning-plans-lazy.module.ts similarity index 62% rename from src/addons/competency/competency-lazy.module.ts rename to src/addons/competency/competency-learning-plans-lazy.module.ts index 65be44eb5..79dcab799 100644 --- a/src/addons/competency/competency-lazy.module.ts +++ b/src/addons/competency/competency-learning-plans-lazy.module.ts @@ -20,51 +20,43 @@ import { CoreScreen } from '@services/screen'; import { CoreSharedModule } from '@/core/shared.module'; import { AddonCompetencyPlanPage } from './pages/plan/plan'; import { AddonCompetencyPlanListPage } from './pages/planlist/planlist'; -import { AddonCompetencyCompetenciesPage } from './pages/competencies/competencies'; -import { AddonCompetencyCompetencyPage } from './pages/competency/competency'; -import { AddonCompetencyCompetencySummaryPage } from './pages/competencysummary/competencysummary'; -import { AddonCompetencyCourseCompetenciesPage } from './pages/coursecompetencies/coursecompetencies.page'; -import { AddonCompetencyCourseCompetenciesPageModule } from './pages/coursecompetencies/coursecompetencies.module'; -import { AddonCompetencyMainMenuHandlerService } from './services/handlers/mainmenu'; +import { AddonCompetencyCompetencyPage } from './pages/competency/competency.page'; +import { AddonCompetencyCompetencySummaryPage } from './pages/competencysummary/competencysummary.page'; +import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_SUMMARY_PAGE } from './competency.module'; +import { AddonCompetencyCompetencyPageModule } from './pages/competency/competency.module'; +import { AddonCompetencyCompetencySummaryPageModule } from './pages/competencysummary/competencysummary.module'; +import { AddonCompetencyCompetenciesPage } from './pages/competencies/competencies.page'; +import { AddonCompetencyCompetenciesPageModule } from './pages/competencies/competencies.module'; const mobileRoutes: Routes = [ { path: '', pathMatch: 'full', - data: { - mainMenuTabRoot: AddonCompetencyMainMenuHandlerService.PAGE_NAME, - }, component: AddonCompetencyPlanListPage, }, { - path: 'competencies', - component: AddonCompetencyCompetenciesPage, - }, - { - path: 'competencies/:competencyId', - component: AddonCompetencyCompetencyPage, - }, - { - path: 'course/:courseId', - component: AddonCompetencyCourseCompetenciesPage, - }, - { - path: 'summary/:competencyId', - component: AddonCompetencyCompetencySummaryPage, - }, - { - path: ':planId', + path: `:planId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`, component: AddonCompetencyPlanPage, }, + { + path: `:planId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}/:competencyId`, + component: AddonCompetencyCompetencyPage, + }, ]; const tabletRoutes: Routes = [ { - path: 'summary/:competencyId', - component: AddonCompetencyCompetencySummaryPage, + path: '', + component: AddonCompetencyPlanListPage, + children: [ + { + path: `:planId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`, + component: AddonCompetencyPlanPage, + }, + ], }, { - path: 'competencies', + path: `:planId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`, component: AddonCompetencyCompetenciesPage, children: [ { @@ -73,43 +65,28 @@ const tabletRoutes: Routes = [ }, ], }, - { - path: 'course/:courseId', - component: AddonCompetencyCourseCompetenciesPage, - }, - { - path: '', - data: { - mainMenuTabRoot: AddonCompetencyMainMenuHandlerService.PAGE_NAME, - }, - component: AddonCompetencyPlanListPage, - children: [ - { - path: ':planId', - component: AddonCompetencyPlanPage, - }, - - ], - }, ]; const routes: Routes = [ ...conditionalRoutes(mobileRoutes, () => CoreScreen.isMobile), ...conditionalRoutes(tabletRoutes, () => CoreScreen.isTablet), + { + path: `:planId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}/:competencyId/${ADDON_COMPETENCY_SUMMARY_PAGE}`, + component: AddonCompetencyCompetencySummaryPage, + }, ]; @NgModule({ imports: [ RouterModule.forChild(routes), CoreSharedModule, - AddonCompetencyCourseCompetenciesPageModule, + AddonCompetencyCompetenciesPageModule, + AddonCompetencyCompetencyPageModule, + AddonCompetencyCompetencySummaryPageModule, ], declarations: [ AddonCompetencyPlanPage, AddonCompetencyPlanListPage, - AddonCompetencyCompetenciesPage, - AddonCompetencyCompetencyPage, - AddonCompetencyCompetencySummaryPage, ], }) -export class AddonCompetencyLazyModule {} +export class AddonCompetencyLearningPlansLazyModule {} diff --git a/src/addons/competency/competency.module.ts b/src/addons/competency/competency.module.ts index e8a96e9e8..b55e996c8 100644 --- a/src/addons/competency/competency.module.ts +++ b/src/addons/competency/competency.module.ts @@ -15,14 +15,12 @@ import { APP_INITIALIZER, NgModule, Type } from '@angular/core'; import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate'; import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; -import { CoreMainMenuDelegate } from '@features/mainmenu/services/mainmenu-delegate'; import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate'; import { CoreUserDelegate } from '@features/user/services/user-delegate'; import { AddonCompetencyProvider } from './services/competency'; import { AddonCompetencyHelperProvider } from './services/competency-helper'; import { AddonCompetencyCompetencyLinkHandler } from './services/handlers/competency-link'; import { AddonCompetencyCourseOptionHandler } from './services/handlers/course-option'; -import { AddonCompetencyMainMenuHandler, AddonCompetencyMainMenuHandlerService } from './services/handlers/mainmenu'; import { AddonCompetencyPlanLinkHandler } from './services/handlers/plan-link'; import { AddonCompetencyPlansLinkHandler } from './services/handlers/plans-link'; import { AddonCompetencyPushClickHandler } from './services/handlers/push-click'; @@ -32,6 +30,8 @@ import { Routes } from '@angular/router'; import { CoreMainMenuRoutingModule } from '@features/mainmenu/mainmenu-routing.module'; import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module'; import { CoreCourseIndexRoutingModule } from '@features/course/pages/index/index-routing.module'; +import { COURSE_PAGE_NAME } from '@features/course/course.module'; +import { PARTICIPANTS_PAGE_NAME } from '@features/user/user.module'; // List of providers (without handlers). export const ADDON_COMPETENCY_SERVICES: Type[] = [ @@ -39,24 +39,35 @@ export const ADDON_COMPETENCY_SERVICES: Type[] = [ AddonCompetencyHelperProvider, ]; +export const ADDON_COMPETENCY_LEARNING_PLANS_PAGE = 'learning-plans'; +export const ADDON_COMPETENCY_COMPETENCIES_PAGE = 'competencies'; +export const ADDON_COMPETENCY_SUMMARY_PAGE = 'summary'; + const mainMenuChildrenRoutes: Routes = [ { - path: AddonCompetencyMainMenuHandlerService.PAGE_NAME, - loadChildren: () => import('./competency-lazy.module').then(m => m.AddonCompetencyLazyModule), + path: ADDON_COMPETENCY_LEARNING_PLANS_PAGE, + loadChildren: () => import('./competency-learning-plans-lazy.module').then(m => m.AddonCompetencyLearningPlansLazyModule), + }, + { + path: `${COURSE_PAGE_NAME}/:courseId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`, + loadChildren: () => import('./competency-course-details-lazy.module').then(m => m.AddonCompetencyCourseDetailsLazyModule), + }, + { + path: `${COURSE_PAGE_NAME}/:courseId/${PARTICIPANTS_PAGE_NAME}/:userId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`, + loadChildren: () => import('./competency-course-details-lazy.module').then(m => m.AddonCompetencyCourseDetailsLazyModule), }, ]; const courseIndexRoutes: Routes = [ { - path: AddonCompetencyMainMenuHandlerService.PAGE_NAME, - loadChildren: () => import('@addons/competency/competency-course-lazy.module').then(m => m.AddonCompetencyCourseLazyModule), + path: ADDON_COMPETENCY_COMPETENCIES_PAGE, + loadChildren: () => import('./competency-course-contents-lazy.module').then(m => m.AddonCompetencyCourseContentsLazyModule), }, ]; @NgModule({ imports: [ CoreMainMenuTabRoutingModule.forChild(mainMenuChildrenRoutes), - CoreMainMenuRoutingModule.forChild({ children: mainMenuChildrenRoutes }), CoreCourseIndexRoutingModule.forChild({ children: courseIndexRoutes }), ], exports: [CoreMainMenuRoutingModule], @@ -64,13 +75,11 @@ const courseIndexRoutes: Routes = [ { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => async () => { + useValue: () => { CoreContentLinksDelegate.registerHandler(AddonCompetencyCompetencyLinkHandler.instance); CoreContentLinksDelegate.registerHandler(AddonCompetencyPlanLinkHandler.instance); CoreContentLinksDelegate.registerHandler(AddonCompetencyPlansLinkHandler.instance); CoreContentLinksDelegate.registerHandler(AddonCompetencyUserCompetencyLinkHandler.instance); - CoreMainMenuDelegate.registerHandler(AddonCompetencyMainMenuHandler.instance); CoreUserDelegate.registerHandler(AddonCompetencyUserHandler.instance); CoreCourseOptionsDelegate.registerHandler(AddonCompetencyCourseOptionHandler.instance); CorePushNotificationsDelegate.registerClickHandler(AddonCompetencyPushClickHandler.instance); diff --git a/src/addons/competency/pages/competencies/competencies.html b/src/addons/competency/pages/competencies/competencies.html index c2b651541..911270667 100644 --- a/src/addons/competency/pages/competencies/competencies.html +++ b/src/addons/competency/pages/competencies/competencies.html @@ -3,7 +3,9 @@ -

{{ title }}

+ +

{{ title }}

+
diff --git a/src/addons/competency/pages/competencies/competencies.module.ts b/src/addons/competency/pages/competencies/competencies.module.ts new file mode 100644 index 000000000..107a73c21 --- /dev/null +++ b/src/addons/competency/pages/competencies/competencies.module.ts @@ -0,0 +1,28 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from '@angular/core'; + +import { CoreSharedModule } from '@/core/shared.module'; +import { AddonCompetencyCompetenciesPage } from './competencies.page'; + +@NgModule({ + imports: [ + CoreSharedModule, + ], + declarations: [ + AddonCompetencyCompetenciesPage, + ], +}) +export class AddonCompetencyCompetenciesPageModule {} diff --git a/src/addons/competency/pages/competencies/competencies.page.ts b/src/addons/competency/pages/competencies/competencies.page.ts new file mode 100644 index 000000000..0841df662 --- /dev/null +++ b/src/addons/competency/pages/competencies/competencies.page.ts @@ -0,0 +1,125 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { AfterViewInit, Component, OnDestroy, ViewChild } from '@angular/core'; +import { IonRefresher } from '@ionic/angular'; +import { CoreDomUtils } from '@services/utils/dom'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; +import { + AddonCompetencyDataForPlanPageCompetency, + AddonCompetencyDataForCourseCompetenciesPageCompetency, +} from '../../services/competency'; +import { Translate } from '@singletons'; +import { CoreNavigator } from '@services/navigator'; +import { CoreError } from '@classes/errors/error'; +import { AddonCompetencyPlanCompetenciesSource } from '@addons/competency/classes/competency-plan-competencies-source'; +import { AddonCompetencyCourseCompetenciesSource } from '@addons/competency/classes/competency-course-competencies-source'; +import { CoreListItemsManager } from '@classes/items-management/list-items-manager'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; + +/** + * Page that displays the list of competencies of a learning plan. + */ +@Component({ + selector: 'page-addon-competency-competencies', + templateUrl: 'competencies.html', +}) +export class AddonCompetencyCompetenciesPage implements AfterViewInit, OnDestroy { + + @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; + + competencies: CoreListItemsManager< + AddonCompetencyDataForPlanPageCompetency | AddonCompetencyDataForCourseCompetenciesPageCompetency, + AddonCompetencyPlanCompetenciesSource | AddonCompetencyCourseCompetenciesSource + >; + + title = ''; + + constructor() { + const planId = CoreNavigator.getRouteNumberParam('planId'); + + if (!planId) { + const courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + const userId = CoreNavigator.getRouteNumberParam('userId'); + const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonCompetencyCourseCompetenciesSource, + [courseId, userId], + ); + + this.competencies = new CoreListItemsManager(source, AddonCompetencyCompetenciesPage); + + return; + } + + const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource(AddonCompetencyPlanCompetenciesSource, [planId]); + + this.competencies = new CoreListItemsManager(source, AddonCompetencyCompetenciesPage); + } + + /** + * @inheritdoc + */ + async ngAfterViewInit(): Promise { + await this.fetchCompetencies(); + + this.competencies.start(this.splitView); + } + + /** + * Fetches the competencies and updates the view. + * + * @return Promise resolved when done. + */ + protected async fetchCompetencies(): Promise { + try { + const source = this.competencies.getSource(); + + await this.competencies.load(); + + if (source instanceof AddonCompetencyPlanCompetenciesSource) { + if (!source.plan || source.plan && source.plan.competencycount <= 0) { + throw new CoreError(Translate.instant('addon.competency.errornocompetenciesfound')); + } + + this.title = source.plan.plan.name; + } else { + this.title = Translate.instant('addon.competency.coursecompetencies'); + } + } catch (error) { + CoreDomUtils.showErrorModalDefault(error, 'Error getting competencies data.'); + } + } + + /** + * Refreshes the competencies. + * + * @param refresher Refresher. + */ + async refreshCompetencies(refresher?: IonRefresher): Promise { + await this.competencies.getSource().invalidateCache(); + + this.competencies.getSource().setDirty(true); + this.fetchCompetencies().finally(() => { + refresher?.complete(); + }); + } + + /** + * @inheritdoc + */ + ngOnDestroy(): void { + this.competencies.destroy(); + } + +} diff --git a/src/addons/competency/pages/competencies/competencies.ts b/src/addons/competency/pages/competencies/competencies.ts deleted file mode 100644 index 821e9db57..000000000 --- a/src/addons/competency/pages/competencies/competencies.ts +++ /dev/null @@ -1,165 +0,0 @@ -// (C) Copyright 2015 Moodle Pty Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { AfterViewInit, Component, OnDestroy, ViewChild } from '@angular/core'; -import { IonRefresher } from '@ionic/angular'; -import { CoreDomUtils } from '@services/utils/dom'; -import { CoreSplitViewComponent } from '@components/split-view/split-view'; -import { - AddonCompetencyDataForPlanPageCompetency, AddonCompetencyDataForCourseCompetenciesPageCompetency, AddonCompetency, -} from '../../services/competency'; -import { Params, ActivatedRoute } from '@angular/router'; -import { CorePageItemsListManager } from '@classes/page-items-list-manager'; -import { Translate } from '@singletons'; -import { CoreNavigator } from '@services/navigator'; -import { CoreError } from '@classes/errors/error'; - -/** - * Page that displays the list of competencies of a learning plan. - */ -@Component({ - selector: 'page-addon-competency-competencies', - templateUrl: 'competencies.html', -}) -export class AddonCompetencyCompetenciesPage implements AfterViewInit, OnDestroy { - - @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; - - protected planId?: number; - protected courseId?: number; - protected userId?: number; - - competenciesLoaded = false; - competencies: AddonCompetencyListManager; - title = ''; - - constructor(protected route: ActivatedRoute) { - this.planId = CoreNavigator.getRouteNumberParam('planId', { route }); - if (!this.planId) { - this.courseId = CoreNavigator.getRouteNumberParam('courseId', { route }); - this.userId = CoreNavigator.getRouteNumberParam('userId', { route }); - } - - this.competencies = - new AddonCompetencyListManager(AddonCompetencyCompetenciesPage, this.planId, this.courseId, this.userId); - } - - /** - * @inheritdoc - */ - async ngAfterViewInit(): Promise { - await this.fetchCompetencies(); - - this.competencies.start(this.splitView); - } - - /** - * Fetches the competencies and updates the view. - * - * @return Promise resolved when done. - */ - protected async fetchCompetencies(): Promise { - try { - if (this.planId) { - - const response = await AddonCompetency.getLearningPlan(this.planId); - - if (response.competencycount <= 0) { - throw new CoreError(Translate.instant('addon.competency.errornocompetenciesfound')); - } - - this.title = response.plan.name; - this.userId = response.plan.userid; - - this.competencies.setItems(response.competencies); - } else if (this.courseId) { - const response = await AddonCompetency.getCourseCompetencies(this.courseId, this.userId); - this.title = Translate.instant('addon.competency.coursecompetencies'); - - this.competencies.setItems(response.competencies); - } else { - throw null; - } - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'Error getting competencies data.'); - } - } - - /** - * Refreshes the competencies. - * - * @param refresher Refresher. - */ - async refreshCompetencies(refresher?: IonRefresher): Promise { - try { - if (this.planId) { - await AddonCompetency.invalidateLearningPlan(this.planId); - } else { - await AddonCompetency.invalidateCourseCompetencies(this.courseId!, this.userId); - } - - } finally { - this.fetchCompetencies().finally(() => { - refresher?.complete(); - }); - } - } - - /** - * @inheritdoc - */ - ngOnDestroy(): void { - this.competencies.destroy(); - } - -} - -type AddonCompetencyDataForPlanPageCompetencyFormatted = - AddonCompetencyDataForPlanPageCompetency | AddonCompetencyDataForCourseCompetenciesPageCompetency; - -/** - * Helper class to manage competencies list. - */ -class AddonCompetencyListManager extends CorePageItemsListManager { - - planId?: number; - courseId?: number; - userId?: number; - - constructor(pageComponent: unknown, planId?: number, courseId?: number, userId?: number) { - super(pageComponent); - this.planId = planId; - this.courseId = courseId; - this.userId = userId; - } - - /** - * @inheritdoc - */ - protected getItemPath(competency: AddonCompetencyDataForPlanPageCompetencyFormatted): string { - return String(competency.competency.id); - } - - /** - * @inheritdoc - */ - protected getItemQueryParams(): Params { - if (this.planId) { - return { planId: this.planId }; - } else { - return { courseId: this.courseId, userId: this.userId }; - } - } - -} diff --git a/src/addons/competency/pages/competency/competency.html b/src/addons/competency/pages/competency/competency.html index 0406897e2..f8a03e245 100644 --- a/src/addons/competency/pages/competency/competency.html +++ b/src/addons/competency/pages/competency/competency.html @@ -3,12 +3,14 @@ -

- {{ competency.competency.competency.shortname }} {{ competency.competency.competency.idnumber }} -

+ +

+ {{ competency.competency.competency.shortname }} {{ competency.competency.competency.idnumber }} +

+
- + @@ -16,7 +18,9 @@ -

{{ user.fullname }}

+ +

{{ user.fullname }}

+
@@ -32,11 +36,7 @@

{{ 'addon.competency.path' | translate }}

- + {{ competency.competency.comppath.framework.name }} @@ -77,8 +77,8 @@

- + + @@ -122,7 +122,7 @@ - +

{{ evidence.actionuser.fullname }}

{{ evidence.timemodified * 1000 | coreFormatDate }}

@@ -130,7 +130,9 @@
-

{{ evidence.gradename }}

+

+ {{ evidence.gradename }} +

{{ evidence.description }}

{{ evidence.note }}
diff --git a/src/addons/competency/pages/competency/competency.module.ts b/src/addons/competency/pages/competency/competency.module.ts new file mode 100644 index 000000000..3b09be305 --- /dev/null +++ b/src/addons/competency/pages/competency/competency.module.ts @@ -0,0 +1,28 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from '@angular/core'; + +import { CoreSharedModule } from '@/core/shared.module'; +import { AddonCompetencyCompetencyPage } from './competency.page'; + +@NgModule({ + imports: [ + CoreSharedModule, + ], + declarations: [ + AddonCompetencyCompetencyPage, + ], +}) +export class AddonCompetencyCompetencyPageModule {} diff --git a/src/addons/competency/pages/competency/competency.page.ts b/src/addons/competency/pages/competency/competency.page.ts new file mode 100644 index 000000000..763d63ede --- /dev/null +++ b/src/addons/competency/pages/competency/competency.page.ts @@ -0,0 +1,309 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { AddonCompetencyHelper } from '@addons/competency/services/competency-helper'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { CoreCourseModuleSummary } from '@features/course/services/course'; +import { CoreUserSummary } from '@features/user/services/user'; +import { CoreSites } from '@services/sites'; +import { CoreDomUtils } from '@services/utils/dom'; +import { Translate } from '@singletons'; +import { + AddonCompetencyDataForUserCompetencySummaryWSResponse, + AddonCompetencyUserCompetencyPlan, + AddonCompetencyUserCompetency, + AddonCompetencyUserCompetencyCourse, + AddonCompetency, + AddonCompetencyDataForPlanPageCompetency, + AddonCompetencyDataForCourseCompetenciesPageCompetency, +} from '@addons/competency/services/competency'; +import { CoreNavigator } from '@services/navigator'; +import { IonRefresher } from '@ionic/angular'; +import { ContextLevel } from '@/core/constants'; +import { CoreUtils } from '@services/utils/utils'; +import { ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/competency.module'; +import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; +import { AddonCompetencyPlanCompetenciesSource } from '@addons/competency/classes/competency-plan-competencies-source'; +import { ActivatedRouteSnapshot } from '@angular/router'; +import { AddonCompetencyCourseCompetenciesSource } from '@addons/competency/classes/competency-course-competencies-source'; + +/** + * Page that displays the competency information. + */ +@Component({ + selector: 'page-addon-competency-competency', + templateUrl: 'competency.html', +}) +export class AddonCompetencyCompetencyPage implements OnInit, OnDestroy { + + competencyLoaded = false; + competencies!: AddonCompetencyCompetenciesSwipeManager; + planStatus?: number; + coursemodules?: CoreCourseModuleSummary[]; + user?: CoreUserSummary; + competency?: AddonCompetencyDataForUserCompetencySummaryWSResponse; + userCompetency?: AddonCompetencyUserCompetencyPlan | AddonCompetencyUserCompetency | AddonCompetencyUserCompetencyCourse; + contextLevel?: string; + contextInstanceId?: number; + + protected fetchSuccess = false; + + constructor() { + try { + const planId = CoreNavigator.getRouteNumberParam('planId'); + + if (!planId) { + const courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + const userId = CoreNavigator.getRouteNumberParam('userId'); + const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonCompetencyCourseCompetenciesSource, + [courseId, userId], + ); + + this.competencies = new AddonCompetencyCompetenciesSwipeManager(source); + + return; + } + + const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource(AddonCompetencyPlanCompetenciesSource, [planId]); + + this.competencies = new AddonCompetencyCompetenciesSwipeManager(source); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } + } + + get competencyFrameworkUrl(): string | undefined { + if (!this.competency) { + return; + } + + const { pluginbaseurl, framework, pagecontextid } = this.competency.competency.comppath; + + return `${pluginbaseurl}/competencies.php?competencyframeworkid=${framework.id}&pagecontextid=${pagecontextid}`; + } + + get courseId(): number | undefined { + const source = this.competencies.getSource(); + + if (!(source instanceof AddonCompetencyCourseCompetenciesSource)) { + return; + } + + return source.COURSE_ID; + } + + /** + * @inheritdoc + */ + async ngOnInit(): Promise { + try { + const source = this.competencies.getSource(); + + await source.reload(); + await this.competencies.start(); + await this.fetchCompetency(); + } finally { + this.competencyLoaded = true; + } + } + + /** + * @inheritdoc + */ + ngOnDestroy(): void { + this.competencies.destroy(); + } + + /** + * Fetches the competency and updates the view. + * + * @return Promise resolved when done. + */ + protected async fetchCompetency(): Promise { + try { + const source = this.competencies.getSource(); + + this.competency = source instanceof AddonCompetencyPlanCompetenciesSource + ? await this.fetchCompetencySummaryFromPlan(source) + : await this.fetchCompetencySummaryFromCourse(source); + + if (this.competency.user.id != CoreSites.getCurrentSiteUserId()) { + // Get the user profile from the returned object. + this.user = this.competency.user; + } + + this.competency.evidence.forEach((evidence) => { + if (evidence.descidentifier) { + const key = 'addon.competency.' + evidence.descidentifier; + evidence.description = Translate.instant(key, { $a: evidence.desca }); + } + }); + + if (!this.fetchSuccess) { + this.fetchSuccess = true; + const name = this.competency.competency.competency.shortname; + + if (source instanceof AddonCompetencyPlanCompetenciesSource) { + this.planStatus && await CoreUtils.ignoreErrors( + AddonCompetency.logCompetencyInPlanView( + source.PLAN_ID, + this.requireCompetencyId(), + this.planStatus, + name, + source.user?.id, + ), + ); + } else { + await CoreUtils.ignoreErrors( + AddonCompetency.logCompetencyInCourseView( + source.COURSE_ID, + this.requireCompetencyId(), + name, + source.USER_ID, + ), + ); + } + } + } catch (error) { + CoreDomUtils.showErrorModalDefault(error, 'Error getting competency data.'); + } + } + + /** + * Refreshes the competency. + * + * @param refresher Refresher. + */ + async refreshCompetency(refresher: IonRefresher): Promise { + const source = this.competencies.getSource(); + + await CoreUtils.ignoreErrors( + source instanceof AddonCompetencyPlanCompetenciesSource + ? AddonCompetency.invalidateCompetencyInPlan(source.PLAN_ID, this.requireCompetencyId()) + : AddonCompetency.invalidateCompetencyInCourse(source.COURSE_ID, this.requireCompetencyId(), source.USER_ID), + ); + + this.fetchCompetency().finally(() => { + refresher?.complete(); + }); + } + + /** + * Opens the summary of a competency. + * + * @param competencyId + */ + openCompetencySummary(competencyId: number): void { + CoreNavigator.navigate( + `../${competencyId}/${ADDON_COMPETENCY_SUMMARY_PAGE}`, + { + params: { contextLevel: this.contextLevel, contextInstanceId: this.contextInstanceId }, + }, + ); + } + + /** + * Get competency id or fail. + * + * @returns Competency id. + */ + private requireCompetencyId(): number { + const selectedItem = this.competencies.getSelectedItem(); + + if (!selectedItem) { + throw new Error('Failed to get competency id from selected item'); + } + + return selectedItem.competency.id; + } + + /** + * Fetch competency summary from a plan source. + * + * @param source Plan competencies source. + * @returns Competency summary. + */ + private async fetchCompetencySummaryFromPlan( + source: AddonCompetencyPlanCompetenciesSource, + ): Promise { + const competency = await AddonCompetency.getCompetencyInPlan( + source.PLAN_ID, + this.requireCompetencyId(), + ); + + this.planStatus = competency.plan.status; + + if (competency.usercompetencysummary.usercompetency) { + competency.usercompetencysummary.usercompetency.statusname = + AddonCompetencyHelper.getCompetencyStatusName(competency.usercompetencysummary.usercompetency.status); + } + + this.contextLevel = ContextLevel.USER; + this.contextInstanceId = source.user?.id || competency.usercompetencysummary.user.id; + this.userCompetency = competency.usercompetencysummary.usercompetencyplan + || competency.usercompetencysummary.usercompetency; + + return competency.usercompetencysummary; + } + + /** + * Fetch competency summary from a course source. + * + * @param source Course competencies source. + * @returns Competency summary. + */ + private async fetchCompetencySummaryFromCourse( + source: AddonCompetencyCourseCompetenciesSource, + ): Promise { + const competency = await AddonCompetency.getCompetencyInCourse( + source.COURSE_ID, + this.requireCompetencyId(), + source.USER_ID, + ); + + this.coursemodules = competency.coursemodules; + + this.contextLevel = ContextLevel.COURSE; + this.contextInstanceId = source.COURSE_ID; + this.userCompetency = competency.usercompetencysummary.usercompetencycourse + || competency.usercompetencysummary.usercompetency; + + return competency.usercompetencysummary; + } + +} + +/** + * Helper to manage swiping within a collection of competencies. + */ +class AddonCompetencyCompetenciesSwipeManager + extends CoreSwipeNavigationItemsManager< + AddonCompetencyDataForPlanPageCompetency | AddonCompetencyDataForCourseCompetenciesPageCompetency, + AddonCompetencyPlanCompetenciesSource | AddonCompetencyCourseCompetenciesSource + > { + + /** + * @inheritdoc + */ + protected getSelectedItemPathFromRoute(route: ActivatedRouteSnapshot): string | null { + return route.params.competencyId; + } + +} diff --git a/src/addons/competency/pages/competency/competency.ts b/src/addons/competency/pages/competency/competency.ts deleted file mode 100644 index e4ebe432e..000000000 --- a/src/addons/competency/pages/competency/competency.ts +++ /dev/null @@ -1,186 +0,0 @@ -// (C) Copyright 2015 Moodle Pty Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { AddonCompetencyHelper } from '@addons/competency/services/competency-helper'; -import { Component, OnInit } from '@angular/core'; -import { CoreCourseModuleSummary } from '@features/course/services/course'; -import { CoreUserSummary } from '@features/user/services/user'; -import { CoreSites } from '@services/sites'; -import { CoreDomUtils } from '@services/utils/dom'; -import { Translate } from '@singletons'; -import { - AddonCompetencyDataForUserCompetencySummaryWSResponse, - AddonCompetencyUserCompetencyPlan, - AddonCompetencyUserCompetency, - AddonCompetencyUserCompetencyCourse, - AddonCompetency, - AddonCompetencyDataForUserCompetencySummaryInPlanWSResponse, - AddonCompetencyDataForUserCompetencySummaryInCourseWSResponse, -} from '@addons/competency/services/competency'; -import { CoreNavigator } from '@services/navigator'; -import { IonRefresher } from '@ionic/angular'; -import { ContextLevel } from '@/core/constants'; -import { CoreUtils } from '@services/utils/utils'; -import { AddonCompetencyMainMenuHandlerService } from '@addons/competency/services/handlers/mainmenu'; - -/** - * Page that displays the competency information. - */ -@Component({ - selector: 'page-addon-competency-competency', - templateUrl: 'competency.html', -}) -export class AddonCompetencyCompetencyPage implements OnInit { - - competencyLoaded = false; - competencyId!: number; - planId?: number; - courseId?: number; - userId?: number; - planStatus?: number; - coursemodules?: CoreCourseModuleSummary[]; - user?: CoreUserSummary; - competency?: AddonCompetencyDataForUserCompetencySummaryWSResponse; - userCompetency?: AddonCompetencyUserCompetencyPlan | AddonCompetencyUserCompetency | AddonCompetencyUserCompetencyCourse; - contextLevel?: string; - contextInstanceId?: number; - - /** - * @inheritdoc - */ - async ngOnInit(): Promise { - this.competencyId = CoreNavigator.getRouteNumberParam('competencyId')!; - this.planId = CoreNavigator.getRouteNumberParam('planId'); - if (!this.planId) { - this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; - this.userId = CoreNavigator.getRouteNumberParam('userId'); - } - - try { - await this.fetchCompetency(); - - const name = this.competency && this.competency.competency && this.competency.competency.competency && - this.competency.competency.competency.shortname; - - if (this.planId) { - CoreUtils.ignoreErrors(AddonCompetency.logCompetencyInPlanView( - this.planId, - this.competencyId, - this.planStatus!, - name, - this.userId, - )); - } else { - CoreUtils.ignoreErrors( - AddonCompetency.logCompetencyInCourseView(this.courseId!, this.competencyId, name, this.userId), - ); - } - } finally { - this.competencyLoaded = true; - } - } - - /** - * Fetches the competency and updates the view. - * - * @return Promise resolved when done. - */ - protected async fetchCompetency(): Promise { - - try { - let competency: AddonCompetencyDataForUserCompetencySummaryInPlanWSResponse | - AddonCompetencyDataForUserCompetencySummaryInCourseWSResponse; - - if (this.planId) { - this.planStatus = undefined; - - competency = await AddonCompetency.getCompetencyInPlan(this.planId, this.competencyId); - } else if (this.courseId) { - competency = await AddonCompetency.getCompetencyInCourse(this.courseId, this.competencyId, this.userId); - } else { - throw null; - } - - // Calculate the context. - if (this.courseId) { - this.contextLevel = ContextLevel.COURSE; - this.contextInstanceId = this.courseId; - } else { - this.contextLevel = ContextLevel.USER; - this.contextInstanceId = this.userId || competency.usercompetencysummary.user.id; - } - - this.competency = competency.usercompetencysummary; - this.userCompetency = this.competency.usercompetencyplan || this.competency.usercompetency; - - if ('plan' in competency) { - this.planStatus = competency.plan.status; - this.competency.usercompetency!.statusname = - AddonCompetencyHelper.getCompetencyStatusName(this.competency.usercompetency!.status); - } else { - this.userCompetency = this.competency.usercompetencycourse; - this.coursemodules = competency.coursemodules; - } - - if (this.competency.user.id != CoreSites.getCurrentSiteUserId()) { - // Get the user profile from the returned object. - this.user = this.competency.user; - } - - this.competency.evidence.forEach((evidence) => { - if (evidence.descidentifier) { - const key = 'addon.competency.' + evidence.descidentifier; - evidence.description = Translate.instant(key, { $a: evidence.desca }); - } - }); - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'Error getting competency data.'); - } - } - - /** - * Refreshes the competency. - * - * @param refresher Refresher. - */ - async refreshCompetency(refresher: IonRefresher): Promise { - try { - if (this.planId) { - await AddonCompetency.invalidateCompetencyInPlan(this.planId, this.competencyId); - } else { - await AddonCompetency.invalidateCompetencyInCourse(this.courseId!, this.competencyId); - } - - } finally { - this.fetchCompetency().finally(() => { - refresher?.complete(); - }); - } - } - - /** - * Opens the summary of a competency. - * - * @param competencyId - */ - openCompetencySummary(competencyId: number): void { - CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/summary/' + competencyId, - { - params: { contextLevel: this.contextLevel, contextInstanceId: this.contextInstanceId }, - }, - ); - } - -} diff --git a/src/addons/competency/pages/competencysummary/competencysummary.html b/src/addons/competency/pages/competencysummary/competencysummary.html index 664344804..57d59228e 100644 --- a/src/addons/competency/pages/competencysummary/competencysummary.html +++ b/src/addons/competency/pages/competencysummary/competencysummary.html @@ -3,12 +3,14 @@ -

- {{ competency.competency.shortname }} {{ competency.competency.idnumber }} -

+ +

+ {{ competency.competency.shortname }} {{ competency.competency.idnumber }} +

+
- + diff --git a/src/addons/competency/pages/competencysummary/competencysummary.module.ts b/src/addons/competency/pages/competencysummary/competencysummary.module.ts new file mode 100644 index 000000000..d09a75ec0 --- /dev/null +++ b/src/addons/competency/pages/competencysummary/competencysummary.module.ts @@ -0,0 +1,28 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from '@angular/core'; + +import { CoreSharedModule } from '@/core/shared.module'; +import { AddonCompetencyCompetencySummaryPage } from './competencysummary.page'; + +@NgModule({ + imports: [ + CoreSharedModule, + ], + declarations: [ + AddonCompetencyCompetencySummaryPage, + ], +}) +export class AddonCompetencyCompetencySummaryPageModule {} diff --git a/src/addons/competency/pages/competencysummary/competencysummary.ts b/src/addons/competency/pages/competencysummary/competencysummary.page.ts similarity index 73% rename from src/addons/competency/pages/competencysummary/competencysummary.ts rename to src/addons/competency/pages/competencysummary/competencysummary.page.ts index 451d85553..b6fe06664 100644 --- a/src/addons/competency/pages/competencysummary/competencysummary.ts +++ b/src/addons/competency/pages/competencysummary/competencysummary.page.ts @@ -19,7 +19,7 @@ import { IonRefresher } from '@ionic/angular'; import { CoreNavigator } from '@services/navigator'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreUtils } from '@services/utils/utils'; -import { AddonCompetencyMainMenuHandlerService } from '@addons/competency/services/handlers/mainmenu'; +import { ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/competency.module'; /** * Page that displays the competency summary. @@ -36,19 +36,26 @@ export class AddonCompetencyCompetencySummaryPage implements OnInit { contextLevel?: ContextLevel; contextInstanceId?: number; + protected fetchSuccess = false; // Whether a fetch was finished successfully. + /** * @inheritdoc */ async ngOnInit(): Promise { - this.competencyId = CoreNavigator.getRouteNumberParam('competencyId')!; - this.contextLevel = CoreNavigator.getRouteParam('contextLevel'); - this.contextInstanceId = CoreNavigator.getRouteNumberParam('contextInstanceId'); + try { + this.competencyId = CoreNavigator.getRequiredRouteNumberParam('competencyId'); + this.contextLevel = CoreNavigator.getRouteParam('contextLevel'); + this.contextInstanceId = CoreNavigator.getRouteNumberParam('contextInstanceId'); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } try { await this.fetchCompetency(); - const name = this.competency!.competency && this.competency!.competency.shortname; - - CoreUtils.ignoreErrors(AddonCompetency.logCompetencyView(this.competencyId, name)); } finally { this.competencyLoaded = true; } @@ -62,13 +69,18 @@ export class AddonCompetencyCompetencySummaryPage implements OnInit { protected async fetchCompetency(): Promise { try { const result = await AddonCompetency.getCompetencySummary(this.competencyId); - if (!this.contextLevel || typeof this.contextInstanceId == 'undefined') { + if (!this.contextLevel || this.contextInstanceId === undefined) { // Context not specified, use user context. this.contextLevel = ContextLevel.USER; - this.contextInstanceId = result.usercompetency!.userid; + this.contextInstanceId = result.usercompetency?.userid; } this.competency = result.competency; + + if (!this.fetchSuccess) { + this.fetchSuccess = true; + CoreUtils.ignoreErrors(AddonCompetency.logCompetencyView(this.competencyId, this.competency.competency.shortname)); + } } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'Error getting competency summary data.'); } @@ -93,8 +105,8 @@ export class AddonCompetencyCompetencySummaryPage implements OnInit { * @param competencyId */ openCompetencySummary(competencyId: number): void { - CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/summary/' + competencyId, + CoreNavigator.navigate( + `../../${competencyId}/${ADDON_COMPETENCY_SUMMARY_PAGE}`, { params: { contextLevel: this.contextLevel, contextInstanceId: this.contextInstanceId }, }, diff --git a/src/addons/competency/pages/coursecompetencies/coursecompetencies.html b/src/addons/competency/pages/coursecompetencies/coursecompetencies.html index de2b0bb59..daea95879 100644 --- a/src/addons/competency/pages/coursecompetencies/coursecompetencies.html +++ b/src/addons/competency/pages/coursecompetencies/coursecompetencies.html @@ -3,39 +3,41 @@ -

{{ 'addon.competency.coursecompetencies' | translate }}

+ +

{{ 'addon.competency.coursecompetencies' | translate }}

+
- - + + - - - - + + + + {{ 'addon.competency.coursecompetencyratingsarepushedtouserplans' | translate }} - + {{ 'addon.competency.coursecompetencyratingsarenotpushedtouserplans' | translate }} - + {{ 'addon.competency.xcompetenciesproficientoutofyincourse' | translate: {$a: - {x: competencies.statistics.proficientcompetencycount, y: competencies.statistics.competencycount} } }} + {x: courseCompetencies.statistics.proficientcompetencycount, y: courseCompetencies.statistics.competencycount} } }} - + *ngIf="courseCompetencies.statistics.canmanagecoursecompetencies && courseCompetencies.statistics.leastproficientcount > 0">

{{ 'addon.competency.competenciesmostoftennotproficientincourse' | translate }}

-

+

@@ -44,22 +46,24 @@ -

+

{{ 'addon.competency.coursecompetencies' | translate }}

- + -

{{ user.fullname }}

+ +

{{ user.fullname }}

+
- + -
- - + +

@@ -81,10 +85,8 @@

{{ 'addon.competency.path' | translate }}

- + {{ competency.comppath.framework.name }} @@ -101,9 +103,9 @@

-
+

{{ 'addon.competency.uponcoursecompletion' | translate }}

- + {{ ruleoutcome.text }}
@@ -112,10 +114,10 @@

{{ 'addon.competency.noactivities' | translate }}

- - + + + @@ -131,8 +133,8 @@ - - + +
diff --git a/src/addons/competency/pages/coursecompetencies/coursecompetencies.page.ts b/src/addons/competency/pages/coursecompetencies/coursecompetencies.page.ts index 58c91bd56..79924d2a1 100644 --- a/src/addons/competency/pages/coursecompetencies/coursecompetencies.page.ts +++ b/src/addons/competency/pages/coursecompetencies/coursecompetencies.page.ts @@ -12,15 +12,20 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit } from '@angular/core'; -import { AddonCompetencyDataForCourseCompetenciesPageWSResponse, AddonCompetency } from '@addons/competency/services/competency'; -import { AddonCompetencyHelper } from '@addons/competency/services/competency-helper'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { + AddonCompetencyDataForCourseCompetenciesPageWSResponse, + AddonCompetencyDataForCourseCompetenciesPageCompetency, +} from '@addons/competency/services/competency'; import { CoreUserProfile } from '@features/user/services/user'; import { IonRefresher } from '@ionic/angular'; import { CoreNavigator } from '@services/navigator'; import { CoreDomUtils } from '@services/utils/dom'; -import { AddonCompetencyMainMenuHandlerService } from '@addons/competency/services/handlers/mainmenu'; import { ContextLevel } from '@/core/constants'; +import { ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/competency.module'; +import { CoreListItemsManager } from '@classes/items-management/list-items-manager'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; +import { AddonCompetencyCourseCompetenciesSource } from '@addons/competency/classes/competency-course-competencies-source'; /** * Page that displays the list of competencies of a course. @@ -29,25 +34,74 @@ import { ContextLevel } from '@/core/constants'; selector: 'page-addon-competency-coursecompetencies', templateUrl: 'coursecompetencies.html', }) -export class AddonCompetencyCourseCompetenciesPage implements OnInit { +export class AddonCompetencyCourseCompetenciesPage implements OnInit, OnDestroy { - competenciesLoaded = false; - competencies?: AddonCompetencyDataForCourseCompetenciesPageWSResponse; - user?: CoreUserProfile; - courseId!: number; + competencies!: CoreListItemsManager< + AddonCompetencyDataForCourseCompetenciesPageCompetency, + AddonCompetencyCourseCompetenciesSource + >; - protected userId!: number; + constructor() { + try { + const courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + const userId = CoreNavigator.getRouteNumberParam('userId'); + const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonCompetencyCourseCompetenciesSource, + [courseId, userId], + ); + + this.competencies = new CoreListItemsManager(source, AddonCompetencyCourseCompetenciesPage); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } + } + + get courseCompetencies(): AddonCompetencyDataForCourseCompetenciesPageWSResponse | undefined { + return this.competencies.getSource().courseCompetencies; + } + + get courseId(): number { + return this.competencies.getSource().COURSE_ID; + } + + get user(): CoreUserProfile | undefined { + return this.competencies.getSource().user; + } + + get showLeastProficientCompetencies(): boolean { + return !!this.courseCompetencies?.statistics.canmanagecoursecompetencies + && this.courseCompetencies?.statistics.leastproficientcount > 0; + } /** - * View loaded. + * @inheritdoc */ - ngOnInit(): void { - this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; - this.userId = CoreNavigator.getRouteNumberParam('userId')!; + async ngOnInit(): Promise { + await this.fetchCourseCompetencies(); + await this.competencies.start(); + } - this.fetchCourseCompetencies().finally(() => { - this.competenciesLoaded = true; - }); + /** + * @inheritdoc + */ + ngOnDestroy(): void { + this.competencies.destroy(); + } + + /** + * Get competency framework url. + * + * @param competency Competency. + * @returns Competency framework url. + */ + getCompetencyFrameworkUrl(competency: AddonCompetencyDataForCourseCompetenciesPageCompetency): string { + const { pluginbaseurl, framework, pagecontextid } = competency.comppath; + + return `${pluginbaseurl}/competencies.php?competencyframeworkid=${framework.id}&pagecontextid=${pagecontextid}`; } /** @@ -57,40 +111,27 @@ export class AddonCompetencyCourseCompetenciesPage implements OnInit { */ protected async fetchCourseCompetencies(): Promise { try { - this.competencies = await AddonCompetency.getCourseCompetencies(this.courseId, this.userId); - - // Get the user profile image. - this.user = await AddonCompetencyHelper.getProfile(this.userId); + await this.competencies.getSource().reload(); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'Error getting course competencies data.'); } } - /** - * Opens a competency. - * - * @param competencyId - */ - openCompetency(competencyId: number): void { - CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/competencies/' + competencyId, - { - params: { courseId: this.courseId, userId: this.userId }, - }, - ); - } - /** * Opens the summary of a competency. * * @param competencyId */ openCompetencySummary(competencyId: number): void { - CoreNavigator.navigateToSitePath('/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/summary/' + competencyId, { - params: { - contextLevel: ContextLevel.COURSE, - contextInstanceId: this.courseId, - } }); + CoreNavigator.navigateToSitePath( + `./${competencyId}/${ADDON_COMPETENCY_SUMMARY_PAGE}`, + { + params: { + contextLevel: ContextLevel.COURSE, + contextInstanceId: this.courseId, + }, + }, + ); } /** @@ -98,11 +139,11 @@ export class AddonCompetencyCourseCompetenciesPage implements OnInit { * * @param refresher Refresher. */ - refreshCourseCompetencies(refresher?: IonRefresher): void { - AddonCompetency.invalidateCourseCompetencies(this.courseId, this.userId).finally(() => { - this.fetchCourseCompetencies().finally(() => { - refresher?.complete(); - }); + async refreshCourseCompetencies(refresher?: IonRefresher): Promise { + await this.competencies.getSource().invalidateCache(); + + this.fetchCourseCompetencies().finally(() => { + refresher?.complete(); }); } diff --git a/src/addons/competency/pages/plan/plan.html b/src/addons/competency/pages/plan/plan.html index edebcf7ba..055972527 100644 --- a/src/addons/competency/pages/plan/plan.html +++ b/src/addons/competency/pages/plan/plan.html @@ -3,14 +3,16 @@ -

{{plan.plan.name}}

+ +

{{plan.plan.name}}

+
- - + + - + @@ -18,42 +20,41 @@

{{ user.fullname }}

-
+
- +

- +

- +

{{ 'addon.competency.status' | translate }}

{{ plan.plan.statusname }}

- +

{{ 'addon.competency.duedate' | translate }}

{{ plan.plan.duedate * 1000 | coreFormatDate }}

- +

{{ 'addon.competency.template' | translate }}

{{ plan.plan.template.shortname }}

- +

{{ 'addon.competency.progress' | translate }}

{{ 'addon.competency.xcompetenciesproficientoutofy' | translate: - {$a: {x: plan.proficientcompetencycount, y: plan.competencycount} } }} + {$a: {x: plan.proficientcompetencycount, y: plan.competencycount} } }}

{{ 'addon.competency.nocompetencies' | translate }}

-

{{competency.competency.shortname}} {{competency.competency.idnumber}}

- {{ competency.usercompetencyplan.gradename }} - + {{ competency.usercompetencyplan.gradename }} + {{ competency.usercompetency.gradename }} diff --git a/src/addons/competency/pages/plan/plan.ts b/src/addons/competency/pages/plan/plan.ts index 71fedb68a..ee1c9a11f 100644 --- a/src/addons/competency/pages/plan/plan.ts +++ b/src/addons/competency/pages/plan/plan.ts @@ -12,14 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { CoreDomUtils } from '@services/utils/dom'; -import { AddonCompetencyDataForPlanPageWSResponse, AddonCompetency } from '../../services/competency'; -import { AddonCompetencyHelper } from '../../services/competency-helper'; +import { AddonCompetencyDataForPlanPageCompetency, AddonCompetencyDataForPlanPageWSResponse } from '../../services/competency'; import { CoreNavigator } from '@services/navigator'; import { CoreUserProfile } from '@features/user/services/user'; import { IonRefresher } from '@ionic/angular'; -import { AddonCompetencyMainMenuHandlerService } from '@addons/competency/services/handlers/mainmenu'; +import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; +import { AddonCompetencyPlansSource } from '@addons/competency/classes/competency-plans-source'; +import { CoreListItemsManager } from '@classes/items-management/list-items-manager'; +import { AddonCompetencyPlanCompetenciesSource } from '@addons/competency/classes/competency-plan-competencies-source'; /** * Page that displays a learning plan. @@ -28,22 +31,58 @@ import { AddonCompetencyMainMenuHandlerService } from '@addons/competency/servic selector: 'page-addon-competency-plan', templateUrl: 'plan.html', }) -export class AddonCompetencyPlanPage implements OnInit { +export class AddonCompetencyPlanPage implements OnInit, OnDestroy { - protected planId!: number; - loaded = false; - plan?: AddonCompetencyDataForPlanPageWSResponse; - user?: CoreUserProfile; + plans!: CoreSwipeNavigationItemsManager; + competencies!: CoreListItemsManager; + + constructor() { + try { + const planId = CoreNavigator.getRequiredRouteNumberParam('planId'); + const userId = CoreNavigator.getRouteNumberParam('userId'); + const plansSource = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonCompetencyPlansSource, + [userId], + ); + const competenciesSource = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonCompetencyPlanCompetenciesSource, + [planId], + ); + + this.competencies = new CoreListItemsManager(competenciesSource, AddonCompetencyPlanPage); + this.plans = new CoreSwipeNavigationItemsManager(plansSource); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } + } + + get plan(): AddonCompetencyDataForPlanPageWSResponse | undefined { + return this.competencies.getSource().plan; + } + + get user(): CoreUserProfile | undefined { + return this.competencies.getSource().user; + } /** * @inheritdoc */ - ngOnInit(): void { - this.planId = CoreNavigator.getRouteNumberParam('planId')!; + async ngOnInit(): Promise { + await this.fetchLearningPlan(); + await this.plans.start(); + await this.competencies.start(); + } - this.fetchLearningPlan().finally(() => { - this.loaded = true; - }); + /** + * @inheritdoc + */ + ngOnDestroy(): void { + this.plans.destroy(); + this.competencies.destroy(); } /** @@ -53,40 +92,22 @@ export class AddonCompetencyPlanPage implements OnInit { */ protected async fetchLearningPlan(): Promise { try { - const plan = await AddonCompetency.getLearningPlan(this.planId); - plan.plan.statusname = AddonCompetencyHelper.getPlanStatusName(plan.plan.status); - - // Get the user profile image. - this.user = await AddonCompetencyHelper.getProfile(plan.plan.userid); - - this.plan = plan; + await this.competencies.getSource().reload(); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'Error getting learning plan data.'); } } - /** - * Navigates to a particular competency. - * - * @param competencyId - */ - openCompetency(competencyId: number): void { - CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/competencies/' + competencyId, - { params: { planId: this.planId } }, - ); - } - /** * Refreshes the learning plan. * * @param refresher Refresher. */ - refreshLearningPlan(refresher: IonRefresher): void { - AddonCompetency.invalidateLearningPlan(this.planId).finally(() => { - this.fetchLearningPlan().finally(() => { - refresher?.complete(); - }); + async refreshLearningPlan(refresher: IonRefresher): Promise { + await this.competencies.getSource().invalidateCache(); + + this.fetchLearningPlan().finally(() => { + refresher?.complete(); }); } diff --git a/src/addons/competency/pages/planlist/planlist.html b/src/addons/competency/pages/planlist/planlist.html index 1b037fe48..214120779 100644 --- a/src/addons/competency/pages/planlist/planlist.html +++ b/src/addons/competency/pages/planlist/planlist.html @@ -3,7 +3,9 @@ -

{{ 'addon.competency.userplans' | translate }}

+ +

{{ 'addon.competency.userplans' | translate }}

+
@@ -16,8 +18,8 @@ - +

{{ plan.name }}

@@ -30,4 +32,4 @@ - + diff --git a/src/addons/competency/pages/planlist/planlist.ts b/src/addons/competency/pages/planlist/planlist.ts index 4e414fde7..1cec25f8c 100644 --- a/src/addons/competency/pages/planlist/planlist.ts +++ b/src/addons/competency/pages/planlist/planlist.ts @@ -12,14 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, OnDestroy, ViewChild } from '@angular/core'; import { IonRefresher } from '@ionic/angular'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; -import { AddonCompetencyProvider, AddonCompetencyPlan, AddonCompetency } from '../../services/competency'; -import { AddonCompetencyHelper } from '../../services/competency-helper'; import { CoreNavigator } from '@services/navigator'; -import { CorePageItemsListManager } from '@classes/page-items-list-manager'; +import { AddonCompetencyPlanFormatted, AddonCompetencyPlansSource } from '@addons/competency/classes/competency-plans-source'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; +import { CoreListItemsManager } from '@classes/items-management/list-items-manager'; /** * Page that displays the list of learning plans. @@ -28,22 +28,17 @@ import { CorePageItemsListManager } from '@classes/page-items-list-manager'; selector: 'page-addon-competency-planlist', templateUrl: 'planlist.html', }) -export class AddonCompetencyPlanListPage implements OnInit, AfterViewInit, OnDestroy { +export class AddonCompetencyPlanListPage implements AfterViewInit, OnDestroy { @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; - protected userId?: number; - plans: AddonCompetencyPlanListManager; + plans: CoreListItemsManager; constructor() { - this.plans = new AddonCompetencyPlanListManager(AddonCompetencyPlanListPage); - } + const userId = CoreNavigator.getRouteNumberParam('userId'); + const source = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource(AddonCompetencyPlansSource, [userId]); - /** - * @inheritdoc - */ - ngOnInit(): void { - this.userId = CoreNavigator.getRouteNumberParam('userId'); + this.plans = new CoreListItemsManager(source, AddonCompetencyPlanListPage); } /** @@ -62,23 +57,7 @@ export class AddonCompetencyPlanListPage implements OnInit, AfterViewInit, OnDes */ protected async fetchLearningPlans(): Promise { try { - const plans = await AddonCompetency.getLearningPlans(this.userId); - plans.forEach((plan: AddonCompetencyPlanFormatted) => { - plan.statusname = AddonCompetencyHelper.getPlanStatusName(plan.status); - switch (plan.status) { - case AddonCompetencyProvider.STATUS_ACTIVE: - plan.statuscolor = 'success'; - break; - case AddonCompetencyProvider.STATUS_COMPLETE: - plan.statuscolor = 'danger'; - break; - default: - plan.statuscolor = 'warning'; - break; - } - }); - this.plans.setItems(plans); - + await this.plans.load(); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'Error getting learning plans data.'); } @@ -89,11 +68,12 @@ export class AddonCompetencyPlanListPage implements OnInit, AfterViewInit, OnDes * * @param refresher Refresher. */ - refreshLearningPlans(refresher: IonRefresher): void { - AddonCompetency.invalidateLearningPlans(this.userId).finally(() => { - this.fetchLearningPlans().finally(() => { - refresher?.complete(); - }); + async refreshLearningPlans(refresher: IonRefresher): Promise { + await this.plans.getSource().invalidateCache(); + + this.plans.getSource().setDirty(true); + this.fetchLearningPlans().finally(() => { + refresher?.complete(); }); } @@ -105,28 +85,3 @@ export class AddonCompetencyPlanListPage implements OnInit, AfterViewInit, OnDes } } - -/** - * Competency plan with some calculated data. - */ -type AddonCompetencyPlanFormatted = AddonCompetencyPlan & { - statuscolor?: string; // Calculated in the app. Color of the plan's status. -}; - -/** - * Helper class to manage plan list. - */ -class AddonCompetencyPlanListManager extends CorePageItemsListManager { - - constructor(pageComponent: unknown) { - super(pageComponent); - } - - /** - * @inheritdoc - */ - protected getItemPath(plan: AddonCompetencyPlanFormatted): string { - return String(plan.id); - } - -} diff --git a/src/addons/competency/services/handlers/competency-link.ts b/src/addons/competency/services/handlers/competency-link.ts index dbbdd1df6..c1ae3bfc5 100644 --- a/src/addons/competency/services/handlers/competency-link.ts +++ b/src/addons/competency/services/handlers/competency-link.ts @@ -12,13 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/competency.module'; import { Injectable } from '@angular/core'; import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; +import { COURSE_PAGE_NAME } from '@features/course/course.module'; import { CoreNavigator } from '@services/navigator'; import { makeSingleton } from '@singletons'; import { AddonCompetency } from '../competency'; -import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; /** * Handler to treat links to a competency in a plan or in a course. @@ -28,6 +29,7 @@ export class AddonCompetencyCompetencyLinkHandlerService extends CoreContentLink name = 'AddonCompetencyCompetencyLinkHandler'; pattern = /\/admin\/tool\/lp\/(user_competency_in_course|user_competency_in_plan)\.php/; + patternMatchStart = false; /** * @inheritdoc @@ -37,17 +39,29 @@ export class AddonCompetencyCompetencyLinkHandlerService extends CoreContentLink return [{ action: (siteId: string): void => { - const pageParams = { - planId: params.planid, - courseId: courseId, - userId: params.userid, - }; + if (courseId) { + CoreNavigator.navigateToSitePath( + `${COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`, + { + params: { userId: params.userid }, + siteId, + }, + ); - CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/competencies/' + params.competencyid, - { params: pageParams, siteId }, - ); + return; + } + if (params.planid) { + CoreNavigator.navigateToSitePath( + `${ADDON_COMPETENCY_LEARNING_PLANS_PAGE}/competencies/${params.planid}`, + { + params: { userId: params.userid }, + siteId, + }, + ); + + return; + } }, }]; } diff --git a/src/addons/competency/services/handlers/course-option.ts b/src/addons/competency/services/handlers/course-option.ts index e5f1e5364..1020fcf09 100644 --- a/src/addons/competency/services/handlers/course-option.ts +++ b/src/addons/competency/services/handlers/course-option.ts @@ -25,7 +25,7 @@ import { CoreCourseUserAdminOrNavOptionIndexed } from '@features/courses/service import { CoreEnrolledCourseDataWithExtraInfoAndOptions } from '@features/courses/services/courses-helper'; import { CoreFilterHelper } from '@features/filter/services/filter-helper'; import { ContextLevel } from '@/core/constants'; -import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; +import { ADDON_COMPETENCY_COMPETENCIES_PAGE } from '@addons/competency/competency.module'; /** * Course nav handler. @@ -55,7 +55,7 @@ export class AddonCompetencyCourseOptionHandlerService implements CoreCourseOpti return false; // Not enabled for guests. } - if (navOptions && typeof navOptions.competencies != 'undefined') { + if (navOptions && navOptions.competencies !== undefined) { return navOptions.competencies; } @@ -75,7 +75,7 @@ export class AddonCompetencyCourseOptionHandlerService implements CoreCourseOpti return { title: 'addon.competency.competencies', class: 'addon-competency-course-handler', - page: AddonCompetencyMainMenuHandlerService.PAGE_NAME, + page: ADDON_COMPETENCY_COMPETENCIES_PAGE, }; } @@ -83,7 +83,7 @@ export class AddonCompetencyCourseOptionHandlerService implements CoreCourseOpti * @inheritdoc */ async invalidateEnabledForCourse(courseId: number, navOptions?: CoreCourseUserAdminOrNavOptionIndexed): Promise { - if (navOptions && typeof navOptions.competencies != 'undefined') { + if (navOptions && navOptions.competencies !== undefined) { // No need to invalidate anything. return; } diff --git a/src/addons/competency/services/handlers/mainmenu.ts b/src/addons/competency/services/handlers/mainmenu.ts deleted file mode 100644 index 8c4130b83..000000000 --- a/src/addons/competency/services/handlers/mainmenu.ts +++ /dev/null @@ -1,54 +0,0 @@ -// (C) Copyright 2015 Moodle Pty Ltd. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import { Injectable } from '@angular/core'; -import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu/services/mainmenu-delegate'; -import { makeSingleton } from '@singletons'; -import { AddonCompetency } from '../competency'; - -/** - * Handler to inject an option into main menu. - */ -@Injectable( { providedIn: 'root' }) -export class AddonCompetencyMainMenuHandlerService implements CoreMainMenuHandler { - - static readonly PAGE_NAME = 'competency'; - - name = 'AddonCompetency'; - priority = 500; - - /** - * @inheritdoc - */ - async isEnabled(): Promise { - // Check the user has at least one learn plan available. - const plans = await AddonCompetency.getLearningPlans(); - - return plans.length > 0; - } - - /** - * @inheritdoc - */ - getDisplayData(): CoreMainMenuHandlerData { - return { - icon: 'fas-route', - title: 'addon.competency.myplans', - page: AddonCompetencyMainMenuHandlerService.PAGE_NAME, - class: 'addon-competency-handler', - }; - } - -} -export const AddonCompetencyMainMenuHandler = makeSingleton(AddonCompetencyMainMenuHandlerService); diff --git a/src/addons/competency/services/handlers/plan-link.ts b/src/addons/competency/services/handlers/plan-link.ts index ca4ab179b..01aa234e3 100644 --- a/src/addons/competency/services/handlers/plan-link.ts +++ b/src/addons/competency/services/handlers/plan-link.ts @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/competency.module'; import { Injectable } from '@angular/core'; import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; import { CoreNavigator } from '@services/navigator'; import { makeSingleton } from '@singletons'; import { AddonCompetency } from '../competency'; -import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; /** * Handler to treat links to a plan. @@ -28,6 +28,7 @@ export class AddonCompetencyPlanLinkHandlerService extends CoreContentLinksHandl name = 'AddonCompetencyPlanLinkHandler'; pattern = /\/admin\/tool\/lp\/plan\.php.*([?&]id=\d+)/; + patternMatchStart = false; /** * @inheritdoc @@ -36,7 +37,7 @@ export class AddonCompetencyPlanLinkHandlerService extends CoreContentLinksHandl return [{ action: (siteId: string): void => { CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/' + params.id, + `${ADDON_COMPETENCY_LEARNING_PLANS_PAGE}/${params.id}`, { siteId }, ); }, diff --git a/src/addons/competency/services/handlers/plans-link.ts b/src/addons/competency/services/handlers/plans-link.ts index e7d377f61..b88e76723 100644 --- a/src/addons/competency/services/handlers/plans-link.ts +++ b/src/addons/competency/services/handlers/plans-link.ts @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/competency.module'; import { Injectable } from '@angular/core'; import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; import { CoreNavigator } from '@services/navigator'; import { makeSingleton } from '@singletons'; import { AddonCompetency } from '../competency'; -import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; /** * Handler to treat links to user plans. @@ -28,6 +28,7 @@ export class AddonCompetencyPlansLinkHandlerService extends CoreContentLinksHand name = 'AddonCompetencyPlansLinkHandler'; pattern = /\/admin\/tool\/lp\/plans\.php/; + patternMatchStart = false; /** * @inheritdoc @@ -36,7 +37,7 @@ export class AddonCompetencyPlansLinkHandlerService extends CoreContentLinksHand return [{ action: (siteId: string): void => { CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME, + ADDON_COMPETENCY_LEARNING_PLANS_PAGE, { params: { userId: params.userid }, siteId }, ); diff --git a/src/addons/competency/services/handlers/push-click.ts b/src/addons/competency/services/handlers/push-click.ts index 7966bbf66..8172821e2 100644 --- a/src/addons/competency/services/handlers/push-click.ts +++ b/src/addons/competency/services/handlers/push-click.ts @@ -12,7 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/competency.module'; import { Injectable } from '@angular/core'; +import { COURSE_PAGE_NAME } from '@features/course/course.module'; import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate'; import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications'; import { CoreNavigator } from '@services/navigator'; @@ -20,7 +22,6 @@ import { CoreUrlUtils } from '@services/utils/url'; import { CoreUtils } from '@services/utils/utils'; import { makeSingleton } from '@singletons'; import { AddonCompetency } from '../competency'; -import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; /** * Handler for competencies push notifications clicks. @@ -56,7 +57,7 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(planId, notification.site)); - await CoreNavigator.navigateToSitePath('/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/' + planId, { + await CoreNavigator.navigateToSitePath(`${ADDON_COMPETENCY_LEARNING_PLANS_PAGE}/${planId}`, { siteId: notification.site, }); @@ -71,15 +72,30 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat const userId = Number(contextUrlParams.userid); await CoreUtils.ignoreErrors(AddonCompetency.invalidateCompetencyInPlan(planId, competencyId, notification.site)); - await CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/competencies/' + competencyId, - { - params: { planId, courseId, userId }, - siteId: notification.site, - }, - ); - return; + if (courseId) { + await CoreNavigator.navigateToSitePath( + `${COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}/${competencyId}`, + { + params: { userId }, + siteId: notification.site, + }, + ); + + return; + } + + if (planId) { + await CoreNavigator.navigateToSitePath( + `${ADDON_COMPETENCY_LEARNING_PLANS_PAGE}/competencies/${planId}/${competencyId}`, + { + params: { userId }, + siteId: notification.site, + }, + ); + + return; + } } // Open the list of plans. @@ -87,7 +103,7 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlans(userId, notification.site)); - await CoreNavigator.navigateToSitePath('/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME, { + await CoreNavigator.navigateToSitePath(ADDON_COMPETENCY_LEARNING_PLANS_PAGE, { params: { userId }, siteId: notification.site, }); diff --git a/src/addons/competency/services/handlers/user-competency-link.ts b/src/addons/competency/services/handlers/user-competency-link.ts index 7a1380f3a..d6ddc5210 100644 --- a/src/addons/competency/services/handlers/user-competency-link.ts +++ b/src/addons/competency/services/handlers/user-competency-link.ts @@ -12,13 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/competency.module'; import { Injectable } from '@angular/core'; import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; import { CoreNavigator } from '@services/navigator'; import { makeSingleton } from '@singletons'; import { AddonCompetency } from '../competency'; -import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; /** * Handler to treat links to a usr competency. @@ -28,19 +28,18 @@ export class AddonCompetencyUserCompetencyLinkHandlerService extends CoreContent name = 'AddonCompetencyUserCompetencyLinkHandler'; pattern = /\/admin\/tool\/lp\/user_competency\.php.*([?&]id=\d+)/; + patternMatchStart = false; /** * @inheritdoc */ getActions(siteIds: string[], url: string, params: Record): CoreContentLinksAction[] { - return [{ action: (siteId: string): void => { CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/summary/' + params.id, + `${ADDON_COMPETENCY_COMPETENCIES_PAGE}/${params.id}/${ADDON_COMPETENCY_SUMMARY_PAGE}`, { siteId }, ); - }, }]; } diff --git a/src/addons/competency/services/handlers/user.ts b/src/addons/competency/services/handlers/user.ts index 1500085ee..dbae1b0a8 100644 --- a/src/addons/competency/services/handlers/user.ts +++ b/src/addons/competency/services/handlers/user.ts @@ -12,13 +12,21 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/competency.module'; import { Injectable } from '@angular/core'; +import { COURSE_PAGE_NAME } from '@features/course/course.module'; import { CoreUserProfile } from '@features/user/services/user'; -import { CoreUserProfileHandler, CoreUserDelegateService, CoreUserProfileHandlerData } from '@features/user/services/user-delegate'; +import { + CoreUserProfileHandler, + CoreUserDelegateService, + CoreUserProfileHandlerData, + CoreUserDelegateContext, +} from '@features/user/services/user-delegate'; +import { PARTICIPANTS_PAGE_NAME } from '@features/user/user.module'; import { CoreNavigator } from '@services/navigator'; +import { CoreSites } from '@services/sites'; import { makeSingleton } from '@singletons'; import { AddonCompetency } from '../competency'; -import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; /** * Profile competencies handler. @@ -26,8 +34,8 @@ import { AddonCompetencyMainMenuHandlerService } from './mainmenu'; @Injectable( { providedIn: 'root' }) export class AddonCompetencyUserHandlerService implements CoreUserProfileHandler { - name = 'AddonCompetency:learningPlan'; - priority = 900; + name = 'AddonCompetency'; // This name doesn't match any disabled feature, they'll be checked in isEnabledForContext. + priority = 100; type = CoreUserDelegateService.TYPE_NEW_PAGE; cacheEnabled = true; @@ -41,10 +49,32 @@ export class AddonCompetencyUserHandlerService implements CoreUserProfileHandler /** * @inheritdoc */ - async isEnabledForUser(user: CoreUserProfile, courseId?: number): Promise { + async isEnabledForContext(context: CoreUserDelegateContext): Promise { + // Check if feature is disabled. + const currentSite = CoreSites.getCurrentSite(); + if (!currentSite) { + return false; + } + + if (context === CoreUserDelegateContext.USER_MENU) { + // This option used to belong to main menu, check the original disabled feature value. + if (currentSite.isFeatureDisabled('CoreMainMenuDelegate_AddonCompetency')) { + return false; + } + } else if (currentSite.isFeatureDisabled('CoreUserDelegate_AddonCompetency:learningPlan')) { + return false; + } + + return true; + } + + /** + * @inheritdoc + */ + async isEnabledForUser(user: CoreUserProfile, context: CoreUserDelegateContext, contextId: number): Promise { try { - if (courseId) { - return AddonCompetency.canViewUserCompetenciesInCourse(courseId, user.id); + if (context === CoreUserDelegateContext.COURSE) { + return await AddonCompetency.canViewUserCompetenciesInCourse(contextId, user.id); } else { const plans = await AddonCompetency.getLearningPlans(user.id); @@ -59,25 +89,8 @@ export class AddonCompetencyUserHandlerService implements CoreUserProfileHandler /** * @inheritdoc */ - getDisplayData(user: CoreUserProfile, courseId: number): CoreUserProfileHandlerData { - if (courseId) { - return { - icon: 'fas-award', - title: 'addon.competency.competencies', - class: 'addon-competency-handler', - action: (event, user, courseId): void => { - event.preventDefault(); - event.stopPropagation(); - CoreNavigator.navigateToSitePath( - '/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME + '/course/' + courseId, - { - params: { userId: user.id }, - }, - ); - - }, - }; - } else { + getDisplayData(user: CoreUserProfile, context: CoreUserDelegateContext): CoreUserProfileHandlerData { + if (context !== CoreUserDelegateContext.COURSE) { return { icon: 'fas-route', title: 'addon.competency.learningplans', @@ -85,12 +98,25 @@ export class AddonCompetencyUserHandlerService implements CoreUserProfileHandler action: (event, user): void => { event.preventDefault(); event.stopPropagation(); - CoreNavigator.navigateToSitePath('/' + AddonCompetencyMainMenuHandlerService.PAGE_NAME, { + CoreNavigator.navigateToSitePath(ADDON_COMPETENCY_LEARNING_PLANS_PAGE, { params: { userId: user.id }, }); }, }; } + + return { + icon: 'fas-award', + title: 'addon.competency.competencies', + class: 'addon-competency-handler', + action: (event, user, context, contextId): void => { + event.preventDefault(); + event.stopPropagation(); + CoreNavigator.navigateToSitePath( + [COURSE_PAGE_NAME, contextId, PARTICIPANTS_PAGE_NAME, user.id, ADDON_COMPETENCY_COMPETENCIES_PAGE].join('/'), + ); + }, + }; } } diff --git a/src/addons/coursecompletion/coursecompletion.module.ts b/src/addons/coursecompletion/coursecompletion.module.ts index 024980c8b..63fea73a7 100644 --- a/src/addons/coursecompletion/coursecompletion.module.ts +++ b/src/addons/coursecompletion/coursecompletion.module.ts @@ -42,8 +42,7 @@ const routes: Routes = [ { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => async () => { + useValue: () => { CoreUserDelegate.registerHandler(AddonCourseCompletionUserHandler.instance); CoreCourseOptionsDelegate.registerHandler(AddonCourseCompletionCourseOptionHandler.instance); }, diff --git a/src/addons/coursecompletion/pages/report/report.html b/src/addons/coursecompletion/pages/report/report.html index bc71b97f4..4c29301db 100644 --- a/src/addons/coursecompletion/pages/report/report.html +++ b/src/addons/coursecompletion/pages/report/report.html @@ -3,7 +3,9 @@ -

{{ 'addon.coursecompletion.coursecompletion' | translate }}

+ +

{{ 'addon.coursecompletion.coursecompletion' | translate }}

+
@@ -28,14 +30,18 @@
-

{{ 'addon.coursecompletion.requiredcriteria' | translate }}

+ +

{{ 'addon.coursecompletion.requiredcriteria' | translate }}

+

-

+

+ +

{{ criteria.status }}
@@ -73,7 +79,9 @@
-

{{ 'addon.coursecompletion.manualselfcompletion' | translate }}

+ +

{{ 'addon.coursecompletion.manualselfcompletion' | translate }}

+
diff --git a/src/addons/coursecompletion/pages/report/report.ts b/src/addons/coursecompletion/pages/report/report.ts index 5cda867eb..027d0480e 100644 --- a/src/addons/coursecompletion/pages/report/report.ts +++ b/src/addons/coursecompletion/pages/report/report.ts @@ -44,11 +44,15 @@ export class AddonCourseCompletionReportPage implements OnInit { * @inheritdoc */ ngOnInit(): void { - this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; - this.userId = CoreNavigator.getRouteNumberParam('userId') || CoreSites.getCurrentSiteUserId(); + try { + this.courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + this.userId = CoreNavigator.getRouteNumberParam('userId') || CoreSites.getCurrentSiteUserId(); + } catch (error) { + CoreDomUtils.showErrorModal(error); - if (!this.userId) { - this.userId = CoreSites.getCurrentSiteUserId(); + CoreNavigator.back(); + + return; } this.fetchCompletion().finally(() => { diff --git a/src/addons/coursecompletion/services/coursecompletion.ts b/src/addons/coursecompletion/services/coursecompletion.ts index 21898f3c6..0fa9d22ec 100644 --- a/src/addons/coursecompletion/services/coursecompletion.ts +++ b/src/addons/coursecompletion/services/coursecompletion.ts @@ -172,12 +172,12 @@ export class AddonCourseCompletionProvider { const course = await CoreCourses.getUserCourse(courseId, preferCache); if (course) { - if (typeof course.enablecompletion != 'undefined' && !course.enablecompletion) { + if (course.enablecompletion !== undefined && !course.enablecompletion) { // Completion not enabled for the course. return false; } - if (typeof course.completionhascriteria != 'undefined' && !course.completionhascriteria) { + if (course.completionhascriteria !== undefined && !course.completionhascriteria) { // No criteria, cannot view completion. return false; } @@ -206,7 +206,7 @@ export class AddonCourseCompletionProvider { // If the site is returning the completionhascriteria then the user can view his own completion. // We already checked the value in isPluginViewEnabledForCourse. - if (course && typeof course.completionhascriteria != 'undefined') { + if (course && course.completionhascriteria !== undefined) { return true; } } diff --git a/src/addons/coursecompletion/services/handlers/user.ts b/src/addons/coursecompletion/services/handlers/user.ts index 172073c60..bfd75dfaa 100644 --- a/src/addons/coursecompletion/services/handlers/user.ts +++ b/src/addons/coursecompletion/services/handlers/user.ts @@ -14,7 +14,12 @@ import { Injectable } from '@angular/core'; import { CoreUserProfile } from '@features/user/services/user'; -import { CoreUserProfileHandler, CoreUserDelegateService, CoreUserProfileHandlerData } from '@features/user/services/user-delegate'; +import { + CoreUserProfileHandler, + CoreUserDelegateService, + CoreUserProfileHandlerData, + CoreUserDelegateContext, +} from '@features/user/services/user-delegate'; import { CoreNavigator } from '@services/navigator'; import { makeSingleton } from '@singletons'; import { AddonCourseCompletion } from '../coursecompletion'; @@ -25,9 +30,9 @@ import { AddonCourseCompletion } from '../coursecompletion'; @Injectable({ providedIn: 'root' }) export class AddonCourseCompletionUserHandlerService implements CoreUserProfileHandler { - name = 'AddonCourseCompletion'; + name = 'AddonCourseCompletion:viewCompletion'; type = CoreUserDelegateService.TYPE_NEW_PAGE; - priority = 200; + priority = 350; cacheEnabled = true; /** @@ -40,15 +45,19 @@ export class AddonCourseCompletionUserHandlerService implements CoreUserProfileH /** * @inheritdoc */ - async isEnabledForCourse(courseId?: number): Promise { + async isEnabledForContext(context: CoreUserDelegateContext, courseId: number): Promise { + if (context !== CoreUserDelegateContext.COURSE) { + return false; + } + return AddonCourseCompletion.isPluginViewEnabledForCourse(courseId); } /** * @inheritdoc */ - async isEnabledForUser(user: CoreUserProfile, courseId?: number): Promise { - return await AddonCourseCompletion.isPluginViewEnabledForUser(courseId!, user.id); + async isEnabledForUser(user: CoreUserProfile, context: CoreUserDelegateContext, contextId: number): Promise { + return await AddonCourseCompletion.isPluginViewEnabledForUser(contextId, user.id); } /** @@ -59,11 +68,11 @@ export class AddonCourseCompletionUserHandlerService implements CoreUserProfileH icon: 'fas-tasks', title: 'addon.coursecompletion.coursecompletion', class: 'addon-coursecompletion-handler', - action: (event, user, courseId): void => { + action: (event, user, context, contextId): void => { event.preventDefault(); event.stopPropagation(); CoreNavigator.navigateToSitePath('/coursecompletion', { - params: { courseId, userId: user.id }, + params: { courseId: contextId, userId: user.id }, }); }, }; diff --git a/src/addons/filter/activitynames/activitynames.module.ts b/src/addons/filter/activitynames/activitynames.module.ts index 1aa7ac805..48c4b1e43 100644 --- a/src/addons/filter/activitynames/activitynames.module.ts +++ b/src/addons/filter/activitynames/activitynames.module.ts @@ -26,8 +26,7 @@ import { AddonFilterActivityNamesHandler } from './services/handlers/activitynam { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterActivityNamesHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterActivityNamesHandler.instance), }, ], }) diff --git a/src/addons/filter/algebra/algebra.module.ts b/src/addons/filter/algebra/algebra.module.ts index 8fe37b21d..bf961e966 100644 --- a/src/addons/filter/algebra/algebra.module.ts +++ b/src/addons/filter/algebra/algebra.module.ts @@ -26,8 +26,7 @@ import { AddonFilterAlgebraHandler } from './services/handlers/algebra'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterAlgebraHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterAlgebraHandler.instance), }, ], }) diff --git a/src/addons/filter/censor/censor.module.ts b/src/addons/filter/censor/censor.module.ts index bdb741ab7..05672bae4 100644 --- a/src/addons/filter/censor/censor.module.ts +++ b/src/addons/filter/censor/censor.module.ts @@ -26,8 +26,7 @@ import { AddonFilterCensorHandler } from './services/handlers/censor'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterCensorHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterCensorHandler.instance), }, ], }) diff --git a/src/addons/filter/data/data.module.ts b/src/addons/filter/data/data.module.ts index fe88960d0..6da1a0b2c 100644 --- a/src/addons/filter/data/data.module.ts +++ b/src/addons/filter/data/data.module.ts @@ -26,8 +26,7 @@ import { AddonFilterDataHandler } from './services/handlers/data'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterDataHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterDataHandler.instance), }, ], }) diff --git a/src/addons/filter/displayh5p/displayh5p.module.ts b/src/addons/filter/displayh5p/displayh5p.module.ts index d40923144..ab5df85c4 100644 --- a/src/addons/filter/displayh5p/displayh5p.module.ts +++ b/src/addons/filter/displayh5p/displayh5p.module.ts @@ -26,8 +26,7 @@ import { AddonFilterDisplayH5PHandler } from './services/handlers/displayh5p'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterDisplayH5PHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterDisplayH5PHandler.instance), }, ], }) diff --git a/src/addons/filter/displayh5p/services/handlers/displayh5p.ts b/src/addons/filter/displayh5p/services/handlers/displayh5p.ts index 8134fac47..c2b11d7f7 100644 --- a/src/addons/filter/displayh5p/services/handlers/displayh5p.ts +++ b/src/addons/filter/displayh5p/services/handlers/displayh5p.ts @@ -18,6 +18,8 @@ import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/def import { CoreFilterFilter, CoreFilterFormatTextOptions } from '@features/filter/services/filter'; import { makeSingleton } from '@singletons'; import { CoreH5PPlayerComponent } from '@features/h5p/components/h5p-player/h5p-player'; +import { CoreUrlUtils } from '@services/utils/url'; +import { CoreH5PHelper } from '@features/h5p/classes/helper'; /** * Handler to support the Display H5P filter. @@ -63,6 +65,24 @@ export class AddonFilterDisplayH5PHandlerService extends CoreFilterDefaultHandle iframe.parentElement?.replaceChild(placeholder, iframe); }); + // Handle H5P iframes embedded using the embed HTML code. + const embeddedH5PIframes = Array.from(this.template.content.querySelectorAll('iframe.h5p-player')); + + embeddedH5PIframes.forEach((iframe) => { + // Add the preventredirect param to allow authenticating if auto-login fails. + iframe.src = CoreUrlUtils.addParamsToUrl(iframe.src, { preventredirect: false }); + + // Add resizer script so the H5P has the right height. + CoreH5PHelper.addResizerScript(); + + // If the iframe has a small height, add some minimum initial height so it's seen if auto-login fails. + const styleHeight = Number(iframe.style.height); + const height = Number(iframe.getAttribute('height')); + if ((!height || height < 400) && (!styleHeight || styleHeight < 400)) { + iframe.style.height = '400px'; + } + }); + return this.template.innerHTML; } diff --git a/src/addons/filter/emailprotect/emailprotect.module.ts b/src/addons/filter/emailprotect/emailprotect.module.ts index 3793c4219..b25597acc 100644 --- a/src/addons/filter/emailprotect/emailprotect.module.ts +++ b/src/addons/filter/emailprotect/emailprotect.module.ts @@ -26,8 +26,7 @@ import { AddonFilterEmailProtectHandler } from './services/handlers/emailprotect { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterEmailProtectHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterEmailProtectHandler.instance), }, ], }) diff --git a/src/addons/filter/emoticon/emoticon.module.ts b/src/addons/filter/emoticon/emoticon.module.ts index 1e925074e..a0d562e87 100644 --- a/src/addons/filter/emoticon/emoticon.module.ts +++ b/src/addons/filter/emoticon/emoticon.module.ts @@ -26,8 +26,7 @@ import { AddonFilterEmoticonHandler } from './services/handlers/emoticon'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterEmoticonHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterEmoticonHandler.instance), }, ], }) diff --git a/src/addons/filter/glossary/glossary.module.ts b/src/addons/filter/glossary/glossary.module.ts index 6464e2c84..8061c73cf 100644 --- a/src/addons/filter/glossary/glossary.module.ts +++ b/src/addons/filter/glossary/glossary.module.ts @@ -26,8 +26,7 @@ import { AddonFilterGlossaryHandler } from './services/handlers/glossary'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterGlossaryHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterGlossaryHandler.instance), }, ], }) diff --git a/src/addons/filter/mathjaxloader/mathjaxloader.module.ts b/src/addons/filter/mathjaxloader/mathjaxloader.module.ts index 0f3aa5b60..fdabf6056 100644 --- a/src/addons/filter/mathjaxloader/mathjaxloader.module.ts +++ b/src/addons/filter/mathjaxloader/mathjaxloader.module.ts @@ -26,8 +26,7 @@ import { AddonFilterMathJaxLoaderHandler } from './services/handlers/mathjaxload { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => async () => { + useValue: async () => { CoreFilterDelegate.registerHandler(AddonFilterMathJaxLoaderHandler.instance); await AddonFilterMathJaxLoaderHandler.initialize(); diff --git a/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts b/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts index a0aab60bf..ad398a11d 100644 --- a/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts +++ b/src/addons/filter/mathjaxloader/services/handlers/mathjaxloader.ts @@ -86,7 +86,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan // Update MathJax locale if app language changes. CoreEvents.on(CoreEvents.LANGUAGE_CHANGED, (lang: string) => { - if (typeof this.window.MathJax == 'undefined') { + if (this.window.MathJax === undefined) { return; } @@ -190,7 +190,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan protected insertSpan(text: string, start: number, end: number): string { return CoreTextUtils.substrReplace( text, - '' + text.substr(start, end - start + 1) + '', + '' + text.substring(start, end + 1) + '', start, end - start + 1, ); @@ -223,7 +223,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan if (!this._configured) { const lang = this._lang; - if (typeof that.window.MathJax != 'undefined') { + if (that.window.MathJax !== undefined) { that.window.MathJax.Hub.Queue(() => { that.window.MathJax.Localization.setLocale(lang); }); @@ -238,7 +238,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan this._setLocale(); } - if (typeof that.window.MathJax != 'undefined') { + if (that.window.MathJax !== undefined) { const processDelay = that.window.MathJax.Hub.processSectionDelay; // Set the process section delay to 0 when updating the formula. that.window.MathJax.Hub.processSectionDelay = 0; @@ -265,7 +265,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan */ protected fixUseUrls(node: Element): void { Array.from(node.querySelectorAll('use')).forEach((useElem) => { - useElem.setAttribute('href', useElem.href.baseVal.substr(useElem.href.baseVal.indexOf('#'))); + useElem.setAttribute('href', useElem.href.baseVal.substring(useElem.href.baseVal.indexOf('#'))); }); } diff --git a/src/addons/filter/mediaplugin/mediaplugin.module.ts b/src/addons/filter/mediaplugin/mediaplugin.module.ts index a72670098..1977bd08d 100644 --- a/src/addons/filter/mediaplugin/mediaplugin.module.ts +++ b/src/addons/filter/mediaplugin/mediaplugin.module.ts @@ -26,8 +26,7 @@ import { AddonFilterMediaPluginHandler } from './services/handlers/mediaplugin'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterMediaPluginHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterMediaPluginHandler.instance), }, ], }) diff --git a/src/addons/filter/mediaplugin/services/handlers/mediaplugin.ts b/src/addons/filter/mediaplugin/services/handlers/mediaplugin.ts index ad08e3186..509451927 100644 --- a/src/addons/filter/mediaplugin/services/handlers/mediaplugin.ts +++ b/src/addons/filter/mediaplugin/services/handlers/mediaplugin.ts @@ -15,7 +15,6 @@ import { Injectable } from '@angular/core'; import { CoreFilterDefaultHandler } from '@features/filter/services/handlers/default-filter'; -import { CoreFilterFilter, CoreFilterFormatTextOptions } from '@features/filter/services/filter'; import { CoreTextUtils } from '@services/utils/text'; import { CoreUrlUtils } from '@services/utils/url'; import { makeSingleton } from '@singletons'; @@ -32,19 +31,10 @@ export class AddonFilterMediaPluginHandlerService extends CoreFilterDefaultHandl protected template = document.createElement('template'); // A template element to convert HTML to element. /** - * Filter some text. - * - * @param text The text to filter. - * @param filter The filter. - * @param options Options passed to the filters. - * @param siteId Site ID. If not defined, current site. - * @return Filtered text (or promise resolved with the filtered text). + * @inheritdoc */ filter( text: string, - filter: CoreFilterFilter, // eslint-disable-line @typescript-eslint/no-unused-vars - options: CoreFilterFormatTextOptions, // eslint-disable-line @typescript-eslint/no-unused-vars - siteId?: string, // eslint-disable-line @typescript-eslint/no-unused-vars ): string | Promise { this.template.innerHTML = text; @@ -60,7 +50,7 @@ export class AddonFilterMediaPluginHandlerService extends CoreFilterDefaultHandl /** * Treat video filters. Currently only treating youtube video using video JS. * - * @param el Video element. + * @param video Video element. */ protected treatVideoFilters(video: HTMLElement): void { // Treat Video JS Youtube video links and translate them to iframes. diff --git a/src/addons/filter/multilang/multilang.module.ts b/src/addons/filter/multilang/multilang.module.ts index 7ffab28b7..9e4ebda2d 100644 --- a/src/addons/filter/multilang/multilang.module.ts +++ b/src/addons/filter/multilang/multilang.module.ts @@ -26,8 +26,7 @@ import { AddonFilterMultilangHandler } from './services/handlers/multilang'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterMultilangHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterMultilangHandler.instance), }, ], }) diff --git a/src/addons/filter/multilang/services/handlers/multilang.ts b/src/addons/filter/multilang/services/handlers/multilang.ts index 6824e5d4a..518f12f1d 100644 --- a/src/addons/filter/multilang/services/handlers/multilang.ts +++ b/src/addons/filter/multilang/services/handlers/multilang.ts @@ -40,8 +40,8 @@ export class AddonFilterMultilangHandlerService extends CoreFilterDefaultHandler */ async filter( text: string, - filter: CoreFilterFilter, // eslint-disable-line @typescript-eslint/no-unused-vars - options: CoreFilterFormatTextOptions, // eslint-disable-line @typescript-eslint/no-unused-vars + filter?: CoreFilterFilter, // eslint-disable-line @typescript-eslint/no-unused-vars + options?: CoreFilterFormatTextOptions, // eslint-disable-line @typescript-eslint/no-unused-vars siteId?: string, // eslint-disable-line @typescript-eslint/no-unused-vars ): Promise { let language = await CoreLang.getCurrentLanguage(); diff --git a/src/addons/filter/tex/tex.module.ts b/src/addons/filter/tex/tex.module.ts index 414d3fdc5..94e031fc5 100644 --- a/src/addons/filter/tex/tex.module.ts +++ b/src/addons/filter/tex/tex.module.ts @@ -26,8 +26,7 @@ import { AddonFilterTexHandler } from './services/handlers/tex'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterTexHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterTexHandler.instance), }, ], }) diff --git a/src/addons/filter/tidy/tidy.module.ts b/src/addons/filter/tidy/tidy.module.ts index cf1045f1e..3cfedb6d1 100644 --- a/src/addons/filter/tidy/tidy.module.ts +++ b/src/addons/filter/tidy/tidy.module.ts @@ -26,8 +26,7 @@ import { AddonFilterTidyHandler } from './services/handlers/tidy'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterTidyHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterTidyHandler.instance), }, ], }) diff --git a/src/addons/filter/urltolink/urltolink.module.ts b/src/addons/filter/urltolink/urltolink.module.ts index 48230c7dd..e5ee0667b 100644 --- a/src/addons/filter/urltolink/urltolink.module.ts +++ b/src/addons/filter/urltolink/urltolink.module.ts @@ -26,8 +26,7 @@ import { AddonFilterUrlToLinkHandler } from './services/handlers/urltolink'; { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => CoreFilterDelegate.registerHandler(AddonFilterUrlToLinkHandler.instance), + useValue: () => CoreFilterDelegate.registerHandler(AddonFilterUrlToLinkHandler.instance), }, ], }) diff --git a/src/addons/messageoutput/airnotifier/airnotifier.module.ts b/src/addons/messageoutput/airnotifier/airnotifier.module.ts index 99c4b1849..65fc244d6 100644 --- a/src/addons/messageoutput/airnotifier/airnotifier.module.ts +++ b/src/addons/messageoutput/airnotifier/airnotifier.module.ts @@ -21,6 +21,7 @@ import { AddonMessageOutputAirnotifierHandler, AddonMessageOutputAirnotifierHandlerService, } from './services/handlers/messageoutput'; +import { AddonMessageOutputAirnotifier } from './services/airnotifier'; const routes: Routes = [ { @@ -39,9 +40,9 @@ const routes: Routes = [ { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { AddonMessageOutputDelegate.registerHandler(AddonMessageOutputAirnotifierHandler.instance); + AddonMessageOutputAirnotifier.initialize(); }, }, ], diff --git a/src/addons/messageoutput/airnotifier/lang.json b/src/addons/messageoutput/airnotifier/lang.json index a6f460bbb..9d542a3c3 100644 --- a/src/addons/messageoutput/airnotifier/lang.json +++ b/src/addons/messageoutput/airnotifier/lang.json @@ -1,3 +1,4 @@ { - "processorsettingsdesc": "Configure devices" -} \ No newline at end of file + "processorsettingsdesc": "Configure devices", + "pushdisabledwarning": "Your users are not receiving any notification from this site on their mobile devices. Enable mobile notifications in the Notification settings page." +} diff --git a/src/addons/messageoutput/airnotifier/pages/devices/devices.html b/src/addons/messageoutput/airnotifier/pages/devices/devices.html index 02ea186de..255e061b5 100644 --- a/src/addons/messageoutput/airnotifier/pages/devices/devices.html +++ b/src/addons/messageoutput/airnotifier/pages/devices/devices.html @@ -3,7 +3,9 @@ -

{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}

+ +

{{ 'addon.messageoutput_airnotifier.processorsettingsdesc' | translate }}

+
@@ -21,10 +23,7 @@

{{ device.platform }} {{ device.version }}

- +
diff --git a/src/addons/messageoutput/airnotifier/services/airnotifier.ts b/src/addons/messageoutput/airnotifier/services/airnotifier.ts index d52f8edf2..86c498b18 100644 --- a/src/addons/messageoutput/airnotifier/services/airnotifier.ts +++ b/src/addons/messageoutput/airnotifier/services/airnotifier.ts @@ -14,14 +14,17 @@ import { Injectable } from '@angular/core'; -import { CoreSites } from '@services/sites'; +import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; import { CoreWSExternalWarning } from '@services/ws'; import { CoreConstants } from '@/core/constants'; import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreError } from '@classes/errors/error'; import { CoreWSError } from '@classes/errors/wserror'; -import { makeSingleton } from '@singletons'; +import { makeSingleton, Translate } from '@singletons'; import { CoreEvents, CoreEventSiteData } from '@singletons/events'; +import { CoreDomUtils } from '@services/utils/dom'; +import { CoreUtils } from '@services/utils/utils'; +import { CoreText } from '@singletons/text'; const ROOT_CACHE_KEY = 'mmaMessageOutputAirnotifier:'; @@ -31,11 +34,18 @@ const ROOT_CACHE_KEY = 'mmaMessageOutputAirnotifier:'; @Injectable({ providedIn: 'root' }) export class AddonMessageOutputAirnotifierProvider { - constructor() { + /** + * Initialize. + */ + initialize(): void { CoreEvents.on(CoreEvents.DEVICE_REGISTERED_IN_MOODLE, async (data: CoreEventSiteData) => { // Get user devices to make Moodle send the devices data to Airnotifier. this.getUserDevices(true, data.siteId); }); + + CoreEvents.on(CoreEvents.LOGIN, (data) => { + this.warnPushDisabledForAdmin(data.siteId); + }); } /** @@ -71,6 +81,35 @@ export class AddonMessageOutputAirnotifierProvider { throw new CoreError('Error enabling device'); } + /** + * Get the cache key for the is system configured call. + * + * @return Cache key. + */ + protected getSystemConfiguredCacheKey(): string { + return ROOT_CACHE_KEY + 'isAirnotifierConfigured'; + } + + /** + * Check if airnotifier is configured. + * + * @param options Options. + * @return Promise resolved with boolean: whether it's configured. + */ + async isSystemConfigured(options: CoreSitesCommonWSOptions = {}): Promise { + const site = await CoreSites.getSite(options.siteId); + + const preSets: CoreSiteWSPreSets = { + cacheKey: this.getSystemConfiguredCacheKey(), + updateFrequency: CoreSite.FREQUENCY_RARELY, + ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. + }; + + const result = await site.read('message_airnotifier_is_system_configured', {}, preSets); + + return result === 1; + } + /** * Get the cache key for the get user devices call. * @@ -126,14 +165,77 @@ export class AddonMessageOutputAirnotifierProvider { } /** - * Returns whether or not the plugin is enabled for the current site. + * Is user is an admin and push are disabled, notify him. * - * @return True if enabled, false otherwise. - * @since 3.2 + * @param siteId Site ID. + * @return Promise resolved when done. */ - isEnabled(): boolean { - return CoreSites.wsAvailableInCurrentSite('message_airnotifier_enable_device') && - CoreSites.wsAvailableInCurrentSite('message_airnotifier_get_user_devices'); + protected async warnPushDisabledForAdmin(siteId?: string): Promise { + if (!siteId) { + return; + } + + try { + const site = await CoreSites.getSite(siteId); + + if (!site.getInfo()?.userissiteadmin) { + // Not an admin or we don't know, stop. + return; + } + + // Check if the admin already asked not to be reminded. + const dontAsk = await site.getLocalSiteConfig('AddonMessageOutputAirnotifierDontRemindDisabled', 0); + if (dontAsk) { + return; + } + + // Check if airnotifier is configured. + const isConfigured = await this.isSystemConfigured({ + readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, + siteId, + }); + + if (isConfigured) { + return; + } + + // Warn the admin. + const dontShowAgain = await CoreDomUtils.showPrompt( + Translate.instant('addon.messageoutput_airnotifier.pushdisabledwarning'), + undefined, + Translate.instant('core.dontshowagain'), + 'checkbox', + [ + { + text: Translate.instant('core.ok'), + }, + { + text: Translate.instant('core.goto', { $a: Translate.instant('core.settings.settings') }), + handler: (data, resolve) => { + resolve(data[0]); + + const url = CoreText.concatenatePaths( + site.getURL(), + site.isVersionGreaterEqualThan('3.11') ? + 'message/output/airnotifier/checkconfiguration.php' : + 'admin/message.php', + ); + + // Don't try auto-login, admins cannot use it. + CoreUtils.openInBrowser(url, { + showBrowserWarning: false, + }); + }, + }, + ], + ); + + if (dontShowAgain) { + await site.setLocalSiteConfig('AddonMessageOutputAirnotifierDontRemindDisabled', 1); + } + } catch { + // Ignore errors. + } } } diff --git a/src/addons/messageoutput/airnotifier/services/handlers/messageoutput.ts b/src/addons/messageoutput/airnotifier/services/handlers/messageoutput.ts index 792a4322c..f83f8945c 100644 --- a/src/addons/messageoutput/airnotifier/services/handlers/messageoutput.ts +++ b/src/addons/messageoutput/airnotifier/services/handlers/messageoutput.ts @@ -15,7 +15,6 @@ import { Injectable } from '@angular/core'; import { AddonMessageOutputHandler, AddonMessageOutputHandlerData } from '@addons/messageoutput/services/messageoutput-delegate'; -import { AddonMessageOutputAirnotifierProvider } from '../airnotifier'; import { makeSingleton } from '@singletons'; /** @@ -29,15 +28,13 @@ export class AddonMessageOutputAirnotifierHandlerService implements AddonMessage name = 'AddonMessageOutputAirnotifier'; processorName = 'airnotifier'; - constructor(private airnotifierProvider: AddonMessageOutputAirnotifierProvider) {} - /** * Whether or not the module is enabled for the site. * * @return True if enabled, false otherwise. */ async isEnabled(): Promise { - return this.airnotifierProvider.isEnabled(); + return true; } /** diff --git a/src/addons/messages/components/conversation-info/conversation-info.html b/src/addons/messages/components/conversation-info/conversation-info.html index 8a311ea57..c72e7b344 100644 --- a/src/addons/messages/components/conversation-info/conversation-info.html +++ b/src/addons/messages/components/conversation-info/conversation-info.html @@ -1,6 +1,8 @@ -

{{ 'addon.messages.groupinfo' | translate }}

+ +

{{ 'addon.messages.groupinfo' | translate }}

+
@@ -18,7 +20,7 @@
+ onError="this.src='assets/img/group-avatar.svg'">

@@ -32,8 +34,8 @@ - + diff --git a/src/addons/messages/guards/index.ts b/src/addons/messages/guards/index.ts index 8d09ab80b..9f2d0385f 100644 --- a/src/addons/messages/guards/index.ts +++ b/src/addons/messages/guards/index.ts @@ -13,7 +13,7 @@ // limitations under the License. import { Injectable } from '@angular/core'; -import { CanActivate, UrlTree } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivate, UrlTree } from '@angular/router'; import { Router } from '@singletons'; import { AddonMessagesMainMenuHandlerService } from '../services/handlers/mainmenu'; import { AddonMessages } from '../services/messages'; @@ -27,18 +27,22 @@ export class AddonMessagesIndexGuard implements CanActivate { /** * @inheritdoc */ - canActivate(): UrlTree { - return this.guard(); + canActivate(route: ActivatedRouteSnapshot): UrlTree { + return this.guard(route); } /** * Check if there is a pending redirect and trigger it. */ - private guard(): UrlTree { + private guard(route: ActivatedRouteSnapshot): UrlTree { const enabled = AddonMessages.isGroupMessagingEnabled(); const path = `/main/${AddonMessagesMainMenuHandlerService.PAGE_NAME}/` + ( enabled ? 'group-conversations' : 'index'); - return Router.parseUrl(path); + const newRoute = Router.parseUrl(path); + + newRoute.queryParams = route.queryParams; + + return newRoute; } } diff --git a/src/addons/messages/messages-common.scss b/src/addons/messages/messages-common.scss index 8b480f462..255a9a156 100644 --- a/src/addons/messages/messages-common.scss +++ b/src/addons/messages/messages-common.scss @@ -1,3 +1,5 @@ +@import "~theme/globals"; + :host { .addon-messages-conversation-item, .addon-message-discussion { @@ -12,7 +14,7 @@ } ion-icon { - margin-left: 2px; + @include margin-horizontal(2px, null); } } @@ -20,7 +22,7 @@ display: flex; flex-direction: column; align-self: flex-start; - margin-left: 2px; + @include margin-horizontal(2px, null); ion-badge, ion-icon { margin-top: 3px; @@ -40,7 +42,7 @@ .addon-message-last-message-user { white-space: nowrap; color: var(--ion-text-color); - margin-right: 2px; + @include margin-horizontal(null, 2px); } .addon-message-last-message-text { @@ -62,18 +64,3 @@ margin-right: 16px; } } - -:host-context([dir=rtl]) { - .addon-messages-conversation-item, - .addon-message-discussion { - .item-heading ion-icon { - margin-right: 2px; - margin-left: 0; - } - - .addon-message-last-message-user { - margin-left: 2px; - margin-right: 0; - } - } -} diff --git a/src/addons/messages/messages-lazy.module.ts b/src/addons/messages/messages-lazy.module.ts index ae0d95b6c..47a4d5d15 100644 --- a/src/addons/messages/messages-lazy.module.ts +++ b/src/addons/messages/messages-lazy.module.ts @@ -27,12 +27,12 @@ export const AddonMessagesDiscussionRoute: Route = { function buildRoutes(injector: Injector): Routes { return [ { - path: 'index', // 3.5 or lower. + path: 'index', // 3.5. loadChildren: () => import('./pages/discussions-35/discussions.module').then(m => m.AddonMessagesDiscussions35PageModule), }, { - path: 'contacts-35', // 3.5 or lower. + path: 'contacts-35', // 3.5. loadChildren: () => import('./pages/contacts-35/contacts.module').then(m => m.AddonMessagesContacts35PageModule), }, { @@ -52,7 +52,7 @@ function buildRoutes(injector: Injector): Routes { .then(m => m.AddonMessagesContactsPageModule), }, { - path: 'preferences', + path: 'message-settings', loadChildren: () => import('./pages/settings/settings.module').then(m => m.AddonMessagesSettingsPageModule), }, ...buildTabMainRoutes(injector, { diff --git a/src/addons/messages/messages.module.ts b/src/addons/messages/messages.module.ts index 251b053e9..5616c65e6 100644 --- a/src/addons/messages/messages.module.ts +++ b/src/addons/messages/messages.module.ts @@ -73,8 +73,7 @@ const preferencesRoutes: Routes = [ { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { // Register handlers. CoreMainMenuDelegate.registerHandler(AddonMessagesMainMenuHandler.instance); CoreCronDelegate.register(AddonMessagesMainMenuHandler.instance); diff --git a/src/addons/messages/pages/contacts-35/contacts.html b/src/addons/messages/pages/contacts-35/contacts.html index d929dd496..285f07231 100644 --- a/src/addons/messages/pages/contacts-35/contacts.html +++ b/src/addons/messages/pages/contacts-35/contacts.html @@ -3,11 +3,10 @@ -

{{ 'addon.messages.contacts' | translate }}

+ +

{{ 'addon.messages.contacts' | translate }}

+
- - @@ -17,9 +16,8 @@ - + -

{{ 'addon.messages.type_' + contactType | translate }}

- {{ contacts[contactType].length }} + +

{{ 'addon.messages.type_' + contactType | translate }}

+
+ + {{ contacts[contactType].length }} +
-

{{ contact.fullname }}

+ +

{{ contact.fullname }}

+
diff --git a/src/addons/messages/pages/contacts/contacts.html b/src/addons/messages/pages/contacts/contacts.html index dcdd35ab1..0715dea69 100644 --- a/src/addons/messages/pages/contacts/contacts.html +++ b/src/addons/messages/pages/contacts/contacts.html @@ -3,14 +3,13 @@ -

{{ 'addon.messages.contacts' | translate }}

+ +

{{ 'addon.messages.contacts' | translate }}

+
- - @@ -25,12 +24,12 @@ - + - +

@@ -48,8 +47,8 @@ [message]="'addon.messages.nocontactsgetstarted' | translate"> - + @@ -63,7 +62,7 @@ - + @@ -80,8 +79,8 @@ - + diff --git a/src/addons/messages/pages/discussion/discussion.html b/src/addons/messages/pages/discussion/discussion.html index 346fe8573..bb9cc05ff 100644 --- a/src/addons/messages/pages/discussion/discussion.html +++ b/src/addons/messages/pages/discussion/discussion.html @@ -3,64 +3,62 @@ -

- - - - - - - - -

+ +

+ + + + + + + + +

+
+ [content]="'addon.messages.info' | translate" (action)="viewInfo()" iconAction="fas-info-circle"> - + [content]="'addon.messages.groupinfo' | translate" (action)="viewInfo()" iconAction="fas-info-circle"> + + + - - - + + + + [hidden]="isSelf || !otherMember || otherMember.iscontact || requestContactSent || requestContactReceived" [priority]="100" + [content]="'addon.messages.addtoyourcontacts' | translate" (action)="createContactRequest()" [iconAction]="addRemoveIcon"> + + [content]="'addon.messages.removefromyourcontacts' | translate" (action)="removeContact()" [iconAction]="addRemoveIcon" + [iconSlash]="true"> - - + + @@ -72,15 +70,13 @@

{{ title }}

- +

{{ message.timecreated | coreFormatDate: "strftimedayshort" }}

- + {{ 'addon.messages.newmessages' | translate }} @@ -93,8 +89,7 @@
-
@@ -105,10 +100,10 @@

-

+

-

+
{{ message.timecreated | coreFormatDate: "strftimetime" }} @@ -134,12 +129,12 @@ [attr.aria-label]="'addon.messages.newmessages' | translate"> {{ 'addon.messages.newmessages' | translate }} - {{ newMessages }} + {{ newMessages }}
- - + +

{{ 'addon.messages.unabletomessage' | translate }}

@@ -163,7 +158,7 @@ {{ 'addon.messages.acceptandaddcontact' | translate }} - + {{ 'addon.messages.decline' | translate }}
diff --git a/src/addons/messages/pages/discussion/discussion.page.ts b/src/addons/messages/pages/discussion/discussion.page.ts index cb683d327..a7be06c6e 100644 --- a/src/addons/messages/pages/discussion/discussion.page.ts +++ b/src/addons/messages/pages/discussion/discussion.page.ts @@ -45,6 +45,7 @@ import { CoreIonLoadingElement } from '@classes/ion-loading'; import { ActivatedRoute } from '@angular/router'; import { AddonMessagesConversationInfoComponent } from '../../components/conversation-info/conversation-info'; import { CoreConstants } from '@/core/constants'; +import { CoreDom } from '@singletons/dom'; /** * Page that displays a message discussion page. @@ -71,7 +72,6 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView protected keepMessageMap: {[hash: string]: boolean} = {}; protected syncObserver: CoreEventObserver; protected oldContentHeight = 0; - protected keyboardObserver: CoreEventObserver; protected scrollBottom = true; protected viewDestroyed = false; protected memberInfoObserver: CoreEventObserver; @@ -148,12 +148,6 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView }, this.siteId, ); - - // Recalculate footer position when keyboard is shown or hidden. - this.keyboardObserver = CoreEvents.on(CoreEvents.KEYBOARD_CHANGE, () => { - // @todo probably not needed. - // this.content.resize(); - }); } /** @@ -212,7 +206,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView message.useridfrom; let added = false; - if (typeof this.keepMessageMap[message.hash] === 'undefined') { + if (this.keepMessageMap[message.hash] === undefined) { // Message not added to the list. Add it now. this.messages.push(message); added = message.useridfrom != this.currentUserId; @@ -451,13 +445,9 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView return; } - // Don't use domUtils.getScrollHeight because it gives an outdated value after receiving a new message. - const scrollHeight = this.scrollElement ? this.scrollElement.scrollHeight : 0; - // Check if we are at the bottom to scroll it after render. // Use a 5px error margin because in iOS there is 1px difference for some reason. - this.scrollBottom = Math.abs(scrollHeight - (this.scrollElement?.scrollTop || 0) - - (this.scrollElement?.clientHeight || 0)) < 5; + this.scrollBottom = CoreDom.scrollIsBottom(this.scrollElement, 5); if (this.messagesBeingSent > 0) { // Ignore polling due to a race condition. @@ -502,17 +492,11 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView /** * Set the new message badge number and set scroll listener if needed. * - * @param addMessages NUmber of messages still to be read. + * @param addMessages Number of messages still to be read. */ protected setNewMessagesBadge(addMessages: number): void { if (this.newMessages == 0 && addMessages > 0) { - // Setup scrolling. - this.content!.scrollEvents = true; - this.scrollFunction(); - } else if (this.newMessages > 0 && addMessages == 0) { - // Remove scrolling. - this.content!.scrollEvents = false; } this.newMessages = addMessages; @@ -522,39 +506,39 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView * The scroll was moved. Update new messages count. */ scrollFunction(): void { - if (this.newMessages > 0) { - const scrollBottom = (this.scrollElement?.scrollTop || 0) + (this.scrollElement?.clientHeight || 0); - const scrollHeight = (this.scrollElement?.scrollHeight || 0); - if (scrollBottom > scrollHeight - 40) { - // At the bottom, reset. - this.setNewMessagesBadge(0); + if (this.newMessages == 0) { + return; + } - return; + if (CoreDom.scrollIsBottom(this.scrollElement, 40)) { + // At the bottom, reset. + this.setNewMessagesBadge(0); + + return; + } + + const scrollElRect = this.scrollElement?.getBoundingClientRect(); + const scrollBottomPos = (scrollElRect && scrollElRect.bottom) || 0; + + if (scrollBottomPos == 0) { + return; + } + + const messages = Array.from(this.hostElement.querySelectorAll('.addon-message-not-mine')) + .slice(-this.newMessages) + .reverse(); + + const newMessagesUnread = messages.findIndex((message) => { + const elementRect = message.getBoundingClientRect(); + if (!elementRect) { + return false; } - const scrollElRect = this.scrollElement?.getBoundingClientRect(); - const scrollBottomPos = (scrollElRect && scrollElRect.bottom) || 0; + return elementRect.bottom <= scrollBottomPos; + }); - if (scrollBottomPos == 0) { - return; - } - - const messages = Array.from(this.hostElement.querySelectorAll('.addon-message-not-mine')) - .slice(-this.newMessages) - .reverse(); - - const newMessagesUnread = messages.findIndex((message) => { - const elementRect = message.getBoundingClientRect(); - if (!elementRect) { - return false; - } - - return elementRect.bottom <= scrollBottomPos; - }); - - if (newMessagesUnread > 0 && newMessagesUnread < this.newMessages) { - this.setNewMessagesBadge(newMessagesUnread); - } + if (newMessagesUnread > 0 && newMessagesUnread < this.newMessages) { + this.setNewMessagesBadge(newMessagesUnread); } } @@ -754,58 +738,37 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView */ protected async markMessagesAsRead(forceMark: boolean): Promise { let readChanged = false; + let messageUnreadFound = false; - if (AddonMessages.isMarkAllMessagesReadEnabled()) { - let messageUnreadFound = false; - - // Mark all messages at a time if there is any unread message. - if (forceMark) { - messageUnreadFound = true; - } else if (this.groupMessagingEnabled) { - messageUnreadFound = !!((this.conversation?.unreadcount && this.conversation?.unreadcount > 0) && - (this.conversationId && this.conversationId > 0)); - } else { - // If an unread message is found, mark all messages as read. - messageUnreadFound = this.messages.some((message) => - message.useridfrom != this.currentUserId && ('read' in message && !message.read)); - } - - if (messageUnreadFound) { - this.setUnreadLabelPosition(); - - if (this.groupMessagingEnabled) { - await AddonMessages.markAllConversationMessagesRead(this.conversationId!); - } else { - await AddonMessages.markAllMessagesRead(this.userId); - - // Mark all messages as read. - this.messages.forEach((message) => { - if ('read' in message) { - message.read = true; - } - }); - } - - readChanged = true; - } + // Mark all messages at a time if there is any unread message. + if (forceMark) { + messageUnreadFound = true; + } else if (this.groupMessagingEnabled) { + messageUnreadFound = !!((this.conversation?.unreadcount && this.conversation?.unreadcount > 0) && + (this.conversationId && this.conversationId > 0)); } else { + // If an unread message is found, mark all messages as read. + messageUnreadFound = this.messages.some((message) => + message.useridfrom != this.currentUserId && ('read' in message && !message.read)); + } + + if (messageUnreadFound) { this.setUnreadLabelPosition(); - const promises: Promise[] = []; - // Mark each message as read one by one. - this.messages.forEach((message) => { - // If the message is unread, call AddonMessages.markMessageRead. - if (message.useridfrom != this.currentUserId && 'read' in message && !message.read) { - promises.push(AddonMessages.markMessageRead(message.id).then(() => { - readChanged = true; + if (this.groupMessagingEnabled) { + await AddonMessages.markAllConversationMessagesRead(this.conversationId!); + } else { + await AddonMessages.markAllMessagesRead(this.userId); + + // Mark all messages as read. + this.messages.forEach((message) => { + if ('read' in message) { message.read = true; + } + }); + } - return; - })); - } - }); - - await Promise.all(promises); + readChanged = true; } if (readChanged) { @@ -1126,8 +1089,8 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView // Leave time for the view to be rendered. await CoreUtils.nextTicks(5); - if (!this.viewDestroyed) { - this.content!.scrollToBottom(0); + if (!this.viewDestroyed && this.content) { + this.content.scrollToBottom(0); } if (force) { @@ -1141,9 +1104,9 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView */ scrollToFirstUnreadMessage(): void { if (this.newMessages > 0) { - const messages = Array.from(this.hostElement.querySelectorAll('.addon-message-not-mine')); + const messages = Array.from(this.hostElement.querySelectorAll('.addon-message-not-mine')); - CoreDomUtils.scrollToElement(this.content!, messages[messages.length - this.newMessages]); + CoreDom.scrollToElement(messages[messages.length - this.newMessages]); } } @@ -1291,13 +1254,6 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView return !nextMessage || nextMessage.useridfrom != message.useridfrom || !!nextMessage.showDate; } - /** - * Toggles delete state. - */ - toggleDelete(): void { - this.showDelete = !this.showDelete; - } - /** * View info. If it's an individual conversation, go to the user profile. * If it's a group conversation, view info about the group. @@ -1312,7 +1268,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView }, }); - if (typeof userId != 'undefined') { + if (userId !== undefined) { const splitViewLoaded = CoreNavigator.isCurrentPathInTablet('**/messages/**/discussion'); // Open user conversation. @@ -1701,7 +1657,6 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView // Unset again, just in case. this.unsetPolling(); this.syncObserver?.off(); - this.keyboardObserver?.off(); this.memberInfoObserver?.off(); this.viewDestroyed = true; } diff --git a/src/addons/messages/pages/discussion/discussion.scss b/src/addons/messages/pages/discussion/discussion.scss index 1469d3b7c..f3a030dc3 100644 --- a/src/addons/messages/pages/discussion/discussion.scss +++ b/src/addons/messages/pages/discussion/discussion.scss @@ -4,13 +4,13 @@ :host { .addon-messages-unreadfrom { - color: var(--ion-color-primary); + color: var(--primary); background-color: transparent; margin-top: 6px; margin-left: auto; margin-right: auto; ion-icon { - color: var(--ion-color-primary); + color: var(--primary); background-color: transparent; } } @@ -19,43 +19,36 @@ padding-bottom: 0; } - ion-fab ion-fab-button { - &::part(native) { - contain: unset; - overflow: visible; - } - - .core-discussion-messages-badge { - position: absolute; - border-radius: 50%; - color: var(--addon-messages-discussion-badge-text); - background-color: var(--addon-messages-discussion-badge); - display: block; - line-height: 20px; - height: 20px; - width: 20px; - @include position(-6px, -6px, null, null); - } + ion-fab .core-discussion-messages-badge { + position: absolute; + color: var(--addon-messages-discussion-badge-text); + background-color: var(--addon-messages-discussion-badge); + display: block; + @include position(0, 0, null, null); } - ion-header ion-toolbar h1 { - display: flex; - align-items: center; + ion-header ion-toolbar ion-title { padding: 0; - .core-bar-button-image { - @include margin-horizontal(null, 6px); - } + h1 { + display: flex; + align-items: center; + padding: 0; - core-format-text { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - flex-shrink: 1; - } + .core-bar-button-image { + @include margin-horizontal(null, 6px); + } - ion-icon { - @include margin-horizontal(6px, null); + core-format-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex-shrink: 1; + } + + ion-icon { + @include margin-horizontal(6px, null); + } } } } diff --git a/src/addons/messages/pages/discussions-35/discussions.html b/src/addons/messages/pages/discussions-35/discussions.html index ed02b96d8..63fa5426d 100644 --- a/src/addons/messages/pages/discussions-35/discussions.html +++ b/src/addons/messages/pages/discussions-35/discussions.html @@ -3,11 +3,11 @@ -

{{ 'addon.messages.messages' | translate }}

+ +

{{ 'addon.messages.messages' | translate }}

+
- - + @@ -17,9 +17,9 @@ - + @@ -28,7 +28,9 @@ -

{{ 'addon.messages.contacts' | translate }}

+ +

{{ 'addon.messages.contacts' | translate }}

+
@@ -36,7 +38,9 @@

{{ 'core.searchresults' | translate }}

- {{ search.results.length }} + + {{ search.results.length }} +

{{ result.fullname }}

-

+

+ +

@@ -69,8 +75,8 @@

- +

diff --git a/src/addons/messages/pages/discussions-35/discussions.module.ts b/src/addons/messages/pages/discussions-35/discussions.module.ts index 15ec2604e..f26263d62 100644 --- a/src/addons/messages/pages/discussions-35/discussions.module.ts +++ b/src/addons/messages/pages/discussions-35/discussions.module.ts @@ -23,6 +23,7 @@ import { CoreSearchComponentsModule } from '@features/search/components/componen import { AddonMessagesDiscussions35Page } from './discussions.page'; import { AddonMessagesMainMenuHandlerService } from '@addons/messages/services/handlers/mainmenu'; +import { CoreMainMenuComponentsModule } from '@features/mainmenu/components/components.module'; const mobileRoutes: Routes = [ { @@ -58,6 +59,7 @@ const routes: Routes = [ RouterModule.forChild(routes), CoreSharedModule, CoreSearchComponentsModule, + CoreMainMenuComponentsModule, ], declarations: [ AddonMessagesDiscussions35Page, diff --git a/src/addons/messages/pages/discussions-35/discussions.page.ts b/src/addons/messages/pages/discussions-35/discussions.page.ts index ee8c821e7..58d52fd6e 100644 --- a/src/addons/messages/pages/discussions-35/discussions.page.ts +++ b/src/addons/messages/pages/discussions-35/discussions.page.ts @@ -32,6 +32,7 @@ import { Translate, Platform } from '@singletons'; import { IonRefresher } from '@ionic/angular'; import { CoreNavigator } from '@services/navigator'; import { CoreScreen } from '@services/screen'; +import { CoreMainMenuDeepLinkManager } from '@features/mainmenu/classes/deep-link-manager'; /** * Page that displays the list of discussions. @@ -56,7 +57,6 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { discussionUserId?: number; search = { - enabled: false, showResults: false, results: [], loading: '', @@ -78,7 +78,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { if (data.userId && this.discussions) { const discussion = this.discussions.find((disc) => disc.message!.user == data.userId); - if (typeof discussion == 'undefined') { + if (discussion === undefined) { this.loaded = false; this.refreshData().finally(() => { this.loaded = true; @@ -100,7 +100,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { if (data.userId && this.discussions) { const discussion = this.discussions.find((disc) => disc.message!.user == data.userId); - if (typeof discussion != 'undefined') { + if (discussion !== undefined) { // A discussion has been read reset counter. discussion.unread = false; @@ -142,12 +142,17 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { this.discussionUserId = CoreNavigator.getRouteNumberParam('userId', { params }) ?? this.discussionUserId; }); + const deepLinkManager = new CoreMainMenuDeepLinkManager(); + await this.fetchData(); if (!this.discussionUserId && this.discussions.length > 0 && CoreScreen.isTablet) { // Take first and load it. - this.gotoDiscussion(this.discussions[0].message!.user); + await this.gotoDiscussion(this.discussions[0].message!.user); } + + // Treat deep link now that the conversation route has been loaded if needed. + deepLinkManager.treatLink(); } /** @@ -179,7 +184,6 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { */ protected async fetchData(): Promise { this.loadingMessage = this.loadingMessages; - this.search.enabled = AddonMessages.isSearchMessagesEnabled(); const promises: Promise[] = []; @@ -249,7 +253,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { * @param messageId Message to scroll after loading the discussion. Used when searching. * @param onlyWithSplitView Only go to Discussion if split view is on. */ - gotoDiscussion(discussionUserId: number, messageId?: number): void { + async gotoDiscussion(discussionUserId: number, messageId?: number): Promise { this.discussionUserId = discussionUserId; const params: Params = { @@ -263,7 +267,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { const splitViewLoaded = CoreNavigator.isCurrentPathInTablet('**/messages/index/discussion'); const path = (splitViewLoaded ? '../' : '') + 'discussion'; - CoreNavigator.navigate(path, { params }); + await CoreNavigator.navigate(path, { params }); } /** diff --git a/src/addons/messages/pages/group-conversations/group-conversations.html b/src/addons/messages/pages/group-conversations/group-conversations.html index d1b7a587e..71f57c29d 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.html +++ b/src/addons/messages/pages/group-conversations/group-conversations.html @@ -3,7 +3,9 @@ -

{{ 'addon.messages.messages' | translate }}

+ +

{{ 'addon.messages.messages' | translate }}

+
@@ -11,9 +13,7 @@ - - + @@ -27,28 +27,25 @@ -

{{ 'addon.messages.contacts' | translate }}

+ +

{{ 'addon.messages.contacts' | translate }}

+
{{ 'addon.messages.pendingcontactrequests' | translate:{$a: contactRequestsCount} }}
- -
- + + + - - - -

{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})

+ + + +

{{ 'addon.messages.groupconversations' | translate }} ({{ group.count }})

+
{{ 'addon.messages.unreadconversations' | translate:{$a: group.unread} }} @@ -97,27 +93,24 @@ -

{{ 'addon.messages.nogroupconversations' | translate }}

+ +

{{ 'addon.messages.nogroupconversations' | translate }}

+
- + + + - -
- + + + @@ -149,28 +146,29 @@ + (click)="gotoConversation(conversation.id, conversation.userid)" + [attr.aria-current]="((conversation.id && + conversation.id == selectedConversationId) || (conversation.userid && conversation.userid == selectedUserId)) ? 'page': 'false'" + id="addon-message-conversation-{{ conversation.id ? conversation.id : 'user-' + conversation.userid }}" + [attr.aria-label]="conversation.name"> + onError="this.src='assets/img/group-avatar.svg'"> - +

- - + + + +

@@ -182,16 +180,17 @@
-

+

+ +

{{ 'addon.messages.you' | translate }} {{ conversation.members[0].fullname + ':' }} - +

diff --git a/src/addons/messages/pages/group-conversations/group-conversations.module.ts b/src/addons/messages/pages/group-conversations/group-conversations.module.ts index a4390583e..8fbcc9bae 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.module.ts +++ b/src/addons/messages/pages/group-conversations/group-conversations.module.ts @@ -22,6 +22,7 @@ import { CoreSharedModule } from '@/core/shared.module'; import { AddonMessagesGroupConversationsPage } from './group-conversations.page'; import { AddonMessagesMainMenuHandlerService } from '@addons/messages/services/handlers/mainmenu'; +import { CoreMainMenuComponentsModule } from '@features/mainmenu/components/components.module'; const mobileRoutes: Routes = [ { @@ -56,6 +57,7 @@ const routes: Routes = [ imports: [ RouterModule.forChild(routes), CoreSharedModule, + CoreMainMenuComponentsModule, ], declarations: [ AddonMessagesGroupConversationsPage, diff --git a/src/addons/messages/pages/group-conversations/group-conversations.page.ts b/src/addons/messages/pages/group-conversations/group-conversations.page.ts index f4d884458..73ff7d7e1 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.page.ts +++ b/src/addons/messages/pages/group-conversations/group-conversations.page.ts @@ -36,6 +36,7 @@ import { ActivatedRoute, Params } from '@angular/router'; import { CoreUtils } from '@services/utils/utils'; import { CoreNavigator } from '@services/navigator'; import { CoreScreen } from '@services/screen'; +import { CoreMainMenuDeepLinkManager } from '@features/mainmenu/classes/deep-link-manager'; /** * Page that displays the list of conversations, including group conversations. @@ -118,7 +119,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { // Search the conversation to update. const conversation = this.findConversation(data.conversationId, data.userId, expandedOption); - if (typeof conversation == 'undefined') { + if (conversation === undefined) { // Probably a new conversation, refresh the list. this.loaded = false; this.refreshData().finally(() => { @@ -152,7 +153,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { if (data.conversationId) { const conversation = this.findConversation(data.conversationId); - if (typeof conversation != 'undefined') { + if (conversation !== undefined) { // A conversation has been read reset counter. conversation.unreadcount = 0; @@ -270,7 +271,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { async ngOnInit(): Promise { this.route.queryParams.subscribe(async (params) => { // When a child page loads this callback is triggered too. - const conversationId =CoreNavigator.getRouteNumberParam('conversationId', { params }); + const conversationId = CoreNavigator.getRouteNumberParam('conversationId', { params }); const userId = CoreNavigator.getRouteNumberParam('userId', { params }); if (conversationId || userId) { // Update the selected ones. @@ -279,6 +280,8 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { } }); + const deepLinkManager = new CoreMainMenuDeepLinkManager(); + await this.fetchData(); if (!this.selectedConversationId && !this.selectedUserId && CoreScreen.isTablet) { @@ -290,10 +293,13 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { conversation = expandedOption.conversations[0]; if (conversation) { - this.gotoConversation(conversation.id); + await this.gotoConversation(conversation.id); } } } + + // Treat deep link now that the conversation route has been loaded if needed. + deepLinkManager.treatLink(); } /** @@ -318,7 +324,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { await Promise.all(promises); // The expanded status hasn't been initialized. Do it now. - if (typeof this.favourites.expanded == 'undefined' && (this.selectedConversationId || this.selectedUserId)) { + if (this.favourites.expanded === undefined && (this.selectedConversationId || this.selectedUserId)) { // A certain conversation should be opened. // We don't know which option it belongs to, so we need to fetch the data for all of them. const promises: Promise[] = []; @@ -355,7 +361,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { * @return Promise resolved when done. */ protected async fetchDataForExpandedOption(): Promise { - if (typeof this.favourites.expanded == 'undefined') { + if (this.favourites.expanded === undefined) { // Calculate which option should be expanded initially. this.favourites.expanded = this.favourites.count != 0 && !this.group.unread && !this.individual.unread; this.group.expanded = !this.favourites.expanded && this.group.count != 0 && !this.individual.unread; @@ -507,7 +513,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { * @param userId User of the conversation. Only if there is no conversationId. * @param messageId Message to scroll after loading the discussion. Used when searching. */ - gotoConversation(conversationId?: number, userId?: number, messageId?: number): void { + async gotoConversation(conversationId?: number, userId?: number, messageId?: number): Promise { this.selectedConversationId = conversationId; this.selectedUserId = userId; @@ -524,14 +530,15 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { const splitViewLoaded = CoreNavigator.isCurrentPathInTablet('**/messages/group-conversations/discussion'); const path = (splitViewLoaded ? '../' : '') + 'discussion'; - CoreNavigator.navigate(path, { params }); + + await CoreNavigator.navigate(path, { params }); } /** * Navigate to message settings. */ gotoSettings(): void { - CoreNavigator.navigateToSitePath('../preferences'); + CoreNavigator.navigateToSitePath('../message-settings'); } /** @@ -572,7 +579,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { if (conversation) { // Check if it's the last message. Offline messages are considered more recent than sent messages. - if (typeof conversation.lastmessage === 'undefined' || conversation.lastmessage === null || + if (conversation.lastmessage === undefined || conversation.lastmessage === null || !conversation.lastmessagepending || (conversation.lastmessagedate || 0) <= message.timecreated / 1000) { this.addLastOfflineMessage(conversation, message); diff --git a/src/addons/messages/pages/search/search.html b/src/addons/messages/pages/search/search.html index 51889a600..133b5c5ae 100644 --- a/src/addons/messages/pages/search/search.html +++ b/src/addons/messages/pages/search/search.html @@ -3,11 +3,10 @@ -

{{ 'addon.messages.searchcombined' | translate }}

+ +

{{ 'addon.messages.searchcombined' | translate }}

+
- - @@ -26,8 +25,7 @@ [error]="messages.loadMoreError"> -
@@ -38,20 +36,20 @@ -

{{ item.titleString | translate }}

+ +

{{ item.titleString | translate }}

+
+ (click)="openConversation(result)" [attr.aria-current]="result == selectedResult ? 'page' : 'false'" detail="true" button>

- +

@@ -61,9 +59,8 @@ {{ 'addon.messages.you' | translate }} - +

@@ -71,7 +68,7 @@
- + {{ 'core.loadmore' | translate }}
diff --git a/src/addons/messages/pages/settings/settings.html b/src/addons/messages/pages/settings/settings.html index 9a1721a24..ef1d86892 100644 --- a/src/addons/messages/pages/settings/settings.html +++ b/src/addons/messages/pages/settings/settings.html @@ -3,7 +3,9 @@ -

{{ 'addon.messages.messages' | translate }}

+ +

{{ 'addon.messages.messages' | translate }}

+
@@ -14,15 +16,17 @@ - {{ 'addon.messages.blocknoncontacts' | translate }} - - + {{ 'addon.messages.blocknoncontacts' | translate }} + + -

{{ 'addon.messages.contactableprivacy' | translate }}

+ +

{{ 'addon.messages.contactableprivacy' | translate }}

+
{{ 'addon.messages.contactableprivacy_onlycontacts' | translate }} @@ -42,109 +46,22 @@ -
- - - - - -

{{ notification.displayname }}

-
- -

{{ 'core.settings.loggedin' | translate }}

-
- -

{{ 'core.settings.loggedoff' | translate }}

-
-
-

{{ 'addon.notifications.notificationpreferences' | translate }}

-
-
- - - - - {{ processor.displayname }} - - - - - {{ processor.lockedmessage }} - - - - {{ 'core.settings.disabled' | translate }} - - - - - - - - {{ processor.displayname }} - - - - - -
- {{'core.settings.locked' | translate }} -
-
- - {{ 'core.settings.disabled' | translate }} -
-
- - - {{ processor.displayname }} - - - - {{ 'core.settings.' + state | translate }} - - - - - {{'core.settings.locked' | translate }} - - - - {{ 'core.settings.disabled' | translate }} - - -
-
-
-
+ + + + + +
-

{{ 'core.settings.general' | translate }}

+ + +

{{ 'core.settings.general' | translate }}

+
+

{{ 'addon.messages.useentertosend' | translate }}

@@ -155,3 +72,77 @@
+ + + + + + + + +

{{ notification.displayname }}

+
+
+
+ + + + +

{{ processor.displayname }}

+
+
+ + + {{ 'core.settings.' + state | translate }} + + + + + + + + {{'core.settings.forced' | translate }} + + + {{'core.settings.disallowed' | translate }} + + + {{ 'core.settings.disabled' | translate }} + +
+
+
+
+
+ + + + + + + +

{{ 'addon.notifications.notificationpreferences' | translate }}

+
+
+ + + + {{ processor.displayname }} + + + + + + + + {{ processor.lockedmessage }} + + + {{ 'core.settings.disabled' | translate }} + + +
+
+
diff --git a/src/addons/messages/pages/settings/settings.page.ts b/src/addons/messages/pages/settings/settings.page.ts index b986e55b3..06b4902b1 100644 --- a/src/addons/messages/pages/settings/settings.page.ts +++ b/src/addons/messages/pages/settings/settings.page.ts @@ -27,6 +27,7 @@ import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreConstants } from '@/core/constants'; import { IonRefresher } from '@ionic/angular'; +import { AddonNotificationsPreferencesNotificationProcessorState } from '@addons/notifications/services/notifications'; /** * Page that displays the messages settings page. @@ -50,14 +51,16 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy { groupMessagingEnabled = false; sendOnEnter = false; + protected loggedInOffLegacyMode = false; protected previousContactableValue?: number | boolean; constructor() { - const currentSite = CoreSites.getCurrentSite(); - this.advancedContactable = !!currentSite?.isVersionGreaterEqualThan('3.6'); - this.allowSiteMessaging = !!currentSite?.canUseAdvancedFeature('messagingallusers'); + const currentSite = CoreSites.getRequiredCurrentSite(); + this.advancedContactable = !!currentSite.isVersionGreaterEqualThan('3.6'); + this.allowSiteMessaging = !!currentSite.canUseAdvancedFeature('messagingallusers'); this.groupMessagingEnabled = AddonMessages.isGroupMessagingEnabled(); + this.loggedInOffLegacyMode = !currentSite.isVersionGreaterEqualThan('4.0'); this.asyncInit(); } @@ -90,13 +93,16 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy { component.notifications = component.notifications.filter((notification) => notification.preferencekey == AddonMessagesProvider.NOTIFICATION_PREFERENCES_KEY); - component.notifications.forEach((notification) => { - notification.processors.forEach( - (processor: AddonMessagesMessagePreferencesNotificationProcessorFormatted) => { - processor.checked = processor.loggedin.checked || processor.loggedoff.checked; - }, - ); - }); + if (this.loggedInOffLegacyMode) { + // Load enabled from loggedin / loggedoff values. + component.notifications.forEach((notification) => { + notification.processors.forEach( + (processor) => { + processor.enabled = processor.loggedin.checked || processor.loggedoff.checked; + }, + ); + }); + } } } @@ -165,74 +171,70 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy { } /** - * Change the value of a certain preference. + * Change the value of a certain preference. Versions 3.6 onwards. * * @param notification Notification object. - * @param state State name, ['loggedin', 'loggedoff']. * @param processor Notification processor. */ async changePreference( notification: AddonMessagesMessagePreferencesNotificationFormatted, - state: string, - processor: AddonMessagesMessagePreferencesNotificationProcessorFormatted, + processor: AddonMessagesMessagePreferencesNotificationProcessor, ): Promise { + // Update both states at the same time. + let value = notification.processors + .filter((processor) => processor.enabled) + .map((processor) => processor.name) + .join(','); - const valueArray: string[] = []; - let value = 'none'; + if (value == '') { + value = 'none'; + } - if (this.groupMessagingEnabled) { - // Update both states at the same time. - const promises: Promise[] = []; - - notification.processors.forEach((processor: AddonMessagesMessagePreferencesNotificationProcessorFormatted) => { - if (processor.checked) { - valueArray.push(processor.name); - } - }); - - if (value.length > 0) { - value = valueArray.join(','); - } - - notification.updating = true; + notification.updating = true; + const promises: Promise[] = []; + if (this.loggedInOffLegacyMode) { promises.push(CoreUser.updateUserPreference(notification.preferencekey + '_loggedin', value)); promises.push(CoreUser.updateUserPreference(notification.preferencekey + '_loggedoff', value)); - - try { - await Promise.all(promises); - // Update the preferences since they were modified. - this.updatePreferencesAfterDelay(); - } catch (error) { - // Show error and revert change. - CoreDomUtils.showErrorModal(error); - processor.checked = !processor.checked; - } finally { - notification.updating = false; - } - - return; + } else { + promises.push(CoreUser.updateUserPreference(notification.preferencekey + '_enabled', value)); } + try { + await Promise.all(promises); + // Update the preferences since they were modified. + this.updatePreferencesAfterDelay(); + } catch (error) { + // Show error and revert change. + CoreDomUtils.showErrorModal(error); + processor.enabled = !processor.enabled; + } finally { + notification.updating = false; + } + } + + /** + * Change the value of a certain preference. Only on version 3.5. + * + * @param notification Notification object. + * @param processor Notification processor. + * @param state State name, ['loggedin', 'loggedoff']. + */ + async changePreferenceLegacy( + notification: AddonMessagesMessagePreferencesNotificationFormatted, + processor: AddonMessagesMessagePreferencesNotificationProcessor, + state: 'loggedin' | 'loggedoff', + ): Promise { // Update only the specified state. - const processorState = processor[state]; + const processorState: AddonNotificationsPreferencesNotificationProcessorState = processor[state]; const preferenceName = notification.preferencekey + '_' + processorState.name; - notification.processors.forEach((processor) => { - if (processor[state].checked) { - valueArray.push(processor.name); - } - }); + const value = notification.processors + .filter((processor) => processor[state].checked) + .map((processor) => processor.name) + .join(','); - if (value.length > 0) { - value = valueArray.join(','); - } - - if (!notification.updating) { - notification.updating = {}; - } - - notification.updating[state] = true; + notification['updating'+state] = true; try { await CoreUser.updateUserPreference(preferenceName, value); // Update the preferences since they were modified. @@ -242,7 +244,7 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy { CoreDomUtils.showErrorModal(error); processorState.checked = !processorState.checked; } finally { - notification.updating[state] = false; + notification['updating'+state] = false; } } @@ -288,12 +290,7 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy { * Message preferences notification with some caclulated data. */ type AddonMessagesMessagePreferencesNotificationFormatted = AddonMessagesMessagePreferencesNotification & { - updating?: boolean | {[state: string]: boolean}; // Calculated in the app. Whether the notification is being updated. -}; - -/** - * Message preferences notification processor with some caclulated data. - */ -type AddonMessagesMessagePreferencesNotificationProcessorFormatted = AddonMessagesMessagePreferencesNotificationProcessor & { - checked?: boolean; // Calculated in the app. Whether the processor is checked either for loggedin or loggedoff. + updating?: boolean; // Calculated in the app. Whether the notification is being updated. + updatingloggedin?: boolean; // Calculated in the app. Whether the notification is being updated. + updatingloggedoff?: boolean; // Calculated in the app. Whether the notification is being updated. }; diff --git a/src/addons/messages/services/handlers/discussion-link.ts b/src/addons/messages/services/handlers/discussion-link.ts index b0fae3fce..2eb03cdec 100644 --- a/src/addons/messages/services/handlers/discussion-link.ts +++ b/src/addons/messages/services/handlers/discussion-link.ts @@ -69,12 +69,12 @@ export class AddonMessagesDiscussionLinkHandlerService extends CoreContentLinksH return false; } - if (typeof params.id == 'undefined' && typeof params.user2 == 'undefined') { + if (params.id === undefined && params.user2 === undefined) { // Other user not defined, cannot treat the URL. return false; } - if (typeof params.user1 != 'undefined') { + if (params.user1 !== undefined) { // Check if user1 is the current user, since the app only supports current user. const site = await CoreSites.getSite(siteId); diff --git a/src/addons/messages/services/handlers/mainmenu.ts b/src/addons/messages/services/handlers/mainmenu.ts index 45349eef3..5df64592f 100644 --- a/src/addons/messages/services/handlers/mainmenu.ts +++ b/src/addons/messages/services/handlers/mainmenu.ts @@ -23,11 +23,11 @@ import { CoreSites } from '@services/sites'; import { CoreEvents } from '@singletons/events'; import { CoreUtils } from '@services/utils/utils'; import { - CorePushNotifications, CorePushNotificationsNotificationBasicData, } from '@features/pushnotifications/services/pushnotifications'; import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate'; import { makeSingleton } from '@singletons'; +import { CoreMainMenuProvider } from '@features/mainmenu/services/mainmenu'; /** * Handler to inject an option into main menu. @@ -38,14 +38,14 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler, static readonly PAGE_NAME = 'messages'; name = 'AddonMessages'; - priority = 800; + priority = 700; protected handler: CoreMainMenuHandlerToDisplay = { icon: 'fas-comments', title: 'addon.messages.messages', page: AddonMessagesMainMenuHandlerService.PAGE_NAME, class: 'addon-messages-handler', - showBadge: true, // Do not check isMessageCountEnabled because we'll use fallback it not enabled. + showBadge: true, badge: '', badgeA11yText: 'addon.messages.unreadconversations', loading: true, @@ -54,18 +54,21 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler, protected unreadCount = 0; protected contactRequestsCount = 0; protected orMore = false; + protected badgeCount?: number; constructor() { CoreEvents.on(AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT, (data) => { this.unreadCount = data.favourites + data.individual + data.group + data.self; this.orMore = !!data.orMore; - this.updateBadge(data.siteId!); + + data.siteId && this.updateBadge(data.siteId); }); CoreEvents.on(AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT, (data) => { this.contactRequestsCount = data.count; - this.updateBadge(data.siteId!); + + data.siteId && this.updateBadge(data.siteId); }); // Reset info on logout. @@ -90,7 +93,7 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler, ); // Register Badge counter. - CorePushNotificationsDelegate.registerCounterHandler('AddonMessages'); + CorePushNotificationsDelegate.registerCounterHandler(AddonMessagesMainMenuHandlerService.name); } /** @@ -123,27 +126,28 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler, * @return Resolve when done. */ async refreshBadge(siteId?: string, unreadOnly?: boolean): Promise { - siteId = siteId || CoreSites.getCurrentSiteId(); - if (!siteId) { + const badgeSiteId = siteId || CoreSites.getCurrentSiteId(); + + if (!badgeSiteId) { return; } const promises: Promise[] = []; - promises.push(AddonMessages.refreshUnreadConversationCounts(siteId).catch(() => { + promises.push(AddonMessages.refreshUnreadConversationCounts(badgeSiteId).catch(() => { this.unreadCount = 0; this.orMore = false; })); // Refresh the number of contact requests in 3.6+ sites. if (!unreadOnly && AddonMessages.isGroupMessagingEnabled()) { - promises.push(AddonMessages.refreshContactRequestsCount(siteId).catch(() => { + promises.push(AddonMessages.refreshContactRequestsCount(badgeSiteId).catch(() => { this.contactRequestsCount = 0; })); } await Promise.all(promises).finally(() => { - this.updateBadge(siteId!); + this.updateBadge(badgeSiteId); this.handler.loading = false; }); } @@ -155,6 +159,13 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler, */ updateBadge(siteId: string): void { const totalCount = this.unreadCount + (this.contactRequestsCount || 0); + + if (this.badgeCount === totalCount) { + return; + } + + this.badgeCount = totalCount; + if (totalCount > 0) { this.handler.badge = totalCount + (this.orMore ? '+' : ''); } else { @@ -162,7 +173,14 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler, } // Update push notifications badge. - CorePushNotifications.updateAddonCounter('AddonMessages', totalCount, siteId); + CoreEvents.trigger( + CoreMainMenuProvider.MAIN_MENU_HANDLER_BADGE_UPDATED, + { + handler: AddonMessagesMainMenuHandlerService.name, + value: totalCount, + }, + siteId, + ); } /** @@ -199,8 +217,7 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler, * @return True if is a sync process, false otherwise. */ isSync(): boolean { - // This is done to use only wifi if using the fallback function. - return !AddonMessages.isMessageCountEnabled() && !AddonMessages.isGroupMessagingEnabled(); + return false; } /** diff --git a/src/addons/messages/services/handlers/settings.ts b/src/addons/messages/services/handlers/settings.ts index 40f29b1e2..9f5662d61 100644 --- a/src/addons/messages/services/handlers/settings.ts +++ b/src/addons/messages/services/handlers/settings.ts @@ -34,9 +34,7 @@ export class AddonMessagesSettingsHandlerService implements CoreSettingsHandler * @return Whether or not the handler is enabled on a site level. */ async isEnabled(): Promise { - const messagingEnabled = await AddonMessages.isPluginEnabled(); - - return messagingEnabled && AddonMessages.isMessagePreferencesEnabled(); + return await AddonMessages.isPluginEnabled(); } /** diff --git a/src/addons/messages/services/handlers/user-send-message.ts b/src/addons/messages/services/handlers/user-send-message.ts index 548d69d51..0e9d12f8d 100644 --- a/src/addons/messages/services/handlers/user-send-message.ts +++ b/src/addons/messages/services/handlers/user-send-message.ts @@ -32,9 +32,7 @@ export class AddonMessagesSendMessageUserHandlerService implements CoreUserProfi type = CoreUserDelegateService.TYPE_COMMUNICATION; /** - * Check if handler is enabled. - * - * @return Promise resolved with true if enabled, rejected or resolved with false otherwise. + * @inheritdoc */ isEnabled(): Promise { return AddonMessages.isPluginEnabled(); @@ -43,18 +41,15 @@ export class AddonMessagesSendMessageUserHandlerService implements CoreUserProfi /** * @inheritdoc */ - async isEnabledForCourse(): Promise { + async isEnabledForContext(): Promise { return !!CoreSites.getCurrentSite(); } /** - * Check if handler is enabled for this user in this context. - * - * @param user User to check. - * @return Promise resolved with true if enabled, resolved with false otherwise. + * @inheritdoc */ async isEnabledForUser(user: CoreUserProfile): Promise { - const currentSite = CoreSites.getCurrentSite()!; + const currentSite = CoreSites.getRequiredCurrentSite(); // From 3.7 you can send messages to yourself. return user.id != CoreSites.getCurrentSiteUserId() || currentSite.isVersionGreaterEqualThan('3.7'); diff --git a/src/addons/messages/services/messages-sync.ts b/src/addons/messages/services/messages-sync.ts index 9a29b9f7d..64edaf6df 100644 --- a/src/addons/messages/services/messages-sync.ts +++ b/src/addons/messages/services/messages-sync.ts @@ -107,7 +107,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider { promises.push(this.syncDiscussion(conversationId, undefined, siteId).then((result) => { - if (typeof result == 'undefined') { + if (result === undefined) { return; } @@ -120,7 +120,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider { promises.push(this.syncDiscussion(undefined, userId, siteId).then((result) => { - if (typeof result == 'undefined') { + if (result === undefined) { return; } @@ -147,9 +147,10 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider { - if (typeof discussions[userId] === 'undefined') { + if (discussions[userId] === undefined) { discussions[userId] = { fullname: userFullname, profileimageurl: '', @@ -1259,7 +1260,7 @@ export class AddonMessagesProvider { // Extract the most recent message. Pending messages are considered more recent than messages already sent. const discMessage = discussions[userId].message; - if (typeof discMessage === 'undefined' || (!discMessage.pending && message.pending) || + if (discMessage === undefined || (!discMessage.pending && message.pending) || (discMessage.pending == message.pending && (discMessage.timecreated < message.timecreated || (discMessage.timecreated == message.timecreated && discMessage.id < messageId)))) { @@ -1567,9 +1568,8 @@ export class AddonMessagesProvider { self: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_SELF] || 0, }; - } else if (this.isMessageCountEnabled()) { - // @since 3.2 - const params: { useridto: number } = { + } else { + const params: AddonMessageGetUnreadConversationsCountWSParams = { useridto: site.getUserId(), }; const preSets: CoreSiteWSPreSets = { @@ -1577,37 +1577,11 @@ export class AddonMessagesProvider { typeExpected: 'number', }; - const count: number = await site.read('core_message_get_unread_conversations_count', params, preSets); + const count = await site.read('core_message_get_unread_conversations_count', params, preSets); counts = { favourites: 0, individual: count, group: 0, self: 0 }; - } else { - // Fallback call. - const params: AddonMessagesGetMessagesWSParams = { - read: false, - limitfrom: 0, - limitnum: AddonMessagesProvider.LIMIT_MESSAGES + 1, - useridto: site.getUserId(), - useridfrom: 0, - }; - - const response = await this.getMessages(params, {}, siteId); - - // Count the discussions by filtering same senders. - const discussions = {}; - response.messages.forEach((message) => { - discussions[message.useridto] = 1; - }); - - const count = Object.keys(discussions).length; - - counts = { - favourites: 0, - individual: count, - group: 0, - self: 0, - orMore: count > AddonMessagesProvider.LIMIT_MESSAGES, - }; } + // Notify the new counts so all views are updated. CoreEvents.trigger(AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT, counts, site.id); @@ -1936,8 +1910,7 @@ export class AddonMessagesProvider { // @since 3.6 return site.invalidateWsCacheForKey(this.getCacheKeyForUnreadConversationCounts()); - } else if (this.isMessageCountEnabled()) { - // @since 3.2 + } else { return site.invalidateWsCacheForKey(this.getCacheKeyForMessageCount(site.getUserId())); } } @@ -2016,37 +1989,6 @@ export class AddonMessagesProvider { } } - /** - * Returns whether or not we can mark all messages as read. - * - * @return If related WS is available on current site. - * @since 3.2 - */ - isMarkAllMessagesReadEnabled(): boolean { - return CoreSites.wsAvailableInCurrentSite('core_message_mark_all_conversation_messages_as_read') || - CoreSites.wsAvailableInCurrentSite('core_message_mark_all_messages_as_read'); - } - - /** - * Returns whether or not we can count unread messages. - * - * @return True if enabled, false otherwise. - * @since 3.2 - */ - isMessageCountEnabled(): boolean { - return CoreSites.wsAvailableInCurrentSite('core_message_get_unread_conversations_count'); - } - - /** - * Returns whether or not the message preferences are enabled for the current site. - * - * @return True if enabled, false otherwise. - * @since 3.2 - */ - isMessagePreferencesEnabled(): boolean { - return CoreSites.wsAvailableInCurrentSite('core_message_get_user_message_preferences'); - } - /** * Returns whether or not messaging is enabled for a certain site. * @@ -2105,15 +2047,6 @@ export class AddonMessagesProvider { return site.canUseAdvancedFeature('messaging'); } - /** - * Returns whether or not we can search messages. - * - * @since 3.2 - */ - isSearchMessagesEnabled(): boolean { - return CoreSites.wsAvailableInCurrentSite('core_message_data_for_messagearea_search_messages'); - } - /** * Returns whether or not self conversation is supported in a certain site. * @@ -2714,7 +2647,7 @@ export class AddonMessagesProvider { conversationid: conversationId, messages: messages.map((message) => ({ text: message.text, - textformat: typeof message.textformat != 'undefined' ? message.textformat : 1, + textformat: message.textformat !== undefined ? message.textformat : 1, })), }; @@ -3115,16 +3048,9 @@ export type AddonMessagesMessagePreferencesNotificationProcessor = { locked: boolean; // Is locked by admin?. lockedmessage?: string; // @since 3.6. Text to display if locked. userconfigured: number; // Is configured?. - loggedin: { - name: string; // Name. - displayname: string; // Display name. - checked: boolean; // Is checked?. - }; - loggedoff: { - name: string; // Name. - displayname: string; // Display name. - checked: boolean; // Is checked?. - }; + enabled?: boolean; // @since 4.0. Processor enabled. + loggedin: AddonNotificationsPreferencesNotificationProcessorState; // @deprecated removed on 4.0. + loggedoff: AddonNotificationsPreferencesNotificationProcessorState; // @deprecated removed on 4.0. }; /** @@ -3691,6 +3617,13 @@ type AddonMessagesSetFavouriteConversationsWSParams = { conversations: number[]; }; +/** + * Params of core_message_get_unread_conversations_count WS. + */ +type AddonMessageGetUnreadConversationsCountWSParams = { + useridto: number; // The user id who received the message, 0 for any user. +}; + /** * Data sent by UNREAD_CONVERSATION_COUNTS_EVENT event. */ diff --git a/src/addons/mod/assign/assign.module.ts b/src/addons/mod/assign/assign.module.ts index 46bd253e9..001a5cf16 100644 --- a/src/addons/mod/assign/assign.module.ts +++ b/src/addons/mod/assign/assign.module.ts @@ -70,8 +70,7 @@ const routes: Routes = [ { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { CoreCourseModuleDelegate.registerHandler(AddonModAssignModuleHandler.instance); CoreContentLinksDelegate.registerHandler(AddonModAssignIndexLinkHandler.instance); CoreContentLinksDelegate.registerHandler(AddonModAssignListLinkHandler.instance); diff --git a/src/addons/mod/assign/classes/base-feedback-plugin-component.ts b/src/addons/mod/assign/classes/base-feedback-plugin-component.ts index b44226f47..2bc825f83 100644 --- a/src/addons/mod/assign/classes/base-feedback-plugin-component.ts +++ b/src/addons/mod/assign/classes/base-feedback-plugin-component.ts @@ -57,7 +57,7 @@ export class AddonModAssignFeedbackPluginBaseComponent { }, }); - if (typeof modalData == 'undefined') { + if (modalData === undefined) { throw new CoreCanceledError(); // User cancelled. } diff --git a/src/addons/mod/assign/classes/submissions-source.ts b/src/addons/mod/assign/classes/submissions-source.ts new file mode 100644 index 000000000..8a5ef3441 --- /dev/null +++ b/src/addons/mod/assign/classes/submissions-source.ts @@ -0,0 +1,262 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Params } from '@angular/router'; +import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source'; +import { CoreGroupInfo, CoreGroups } from '@services/groups'; +import { CoreSites } from '@services/sites'; +import { CoreUtils } from '@services/utils/utils'; +import { Translate } from '@singletons'; +import { CoreIonicColorNames } from '@singletons/colors'; +import { CoreEvents } from '@singletons/events'; +import { + AddonModAssign, + AddonModAssignAssign, + AddonModAssignGradingStates, + AddonModAssignSubmission, + AddonModAssignSubmissionStatusValues, +} from '../services/assign'; +import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../services/assign-helper'; +import { AddonModAssignOffline } from '../services/assign-offline'; +import { AddonModAssignSync, AddonModAssignSyncProvider } from '../services/assign-sync'; + +/** + * Provides a collection of assignment submissions. + */ +export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSource { + + /** + * @inheritdoc + */ + static getSourceId(courseId: number, moduleId: number, selectedStatus?: AddonModAssignListFilterName): string { + const statusId = selectedStatus ?? '__empty__'; + + return `submissions-${courseId}-${moduleId}-${statusId}`; + } + + readonly COURSE_ID: number; + readonly MODULE_ID: number; + readonly SELECTED_STATUS: AddonModAssignListFilterName | undefined; + + assign?: AddonModAssignAssign; + groupId = 0; + groupInfo: CoreGroupInfo = { + groups: [], + separateGroups: false, + visibleGroups: false, + defaultGroupId: 0, + canAccessAllGroups: false, + }; + + protected submissionsData: { canviewsubmissions: boolean; submissions?: AddonModAssignSubmission[] } = { + canviewsubmissions: false, + }; + + constructor(courseId: number, moduleId: number, selectedStatus?: AddonModAssignListFilterName) { + super(); + + this.COURSE_ID = courseId; + this.MODULE_ID = moduleId; + this.SELECTED_STATUS = selectedStatus; + } + + /** + * @inheritdoc + */ + getItemPath(submission: AddonModAssignSubmissionForList): string { + return String(submission.submitid); + } + + /** + * @inheritdoc + */ + getItemQueryParams(submission: AddonModAssignSubmissionForList): Params { + return { + blindId: submission.blindid, + groupId: this.groupId, + selectedStatus: this.SELECTED_STATUS, + }; + } + + /** + * Invalidate assignment cache. + */ + async invalidateCache(): Promise { + await Promise.all([ + AddonModAssign.invalidateAssignmentData(this.COURSE_ID), + this.assign && AddonModAssign.invalidateAllSubmissionData(this.assign.id), + this.assign && AddonModAssign.invalidateAssignmentUserMappingsData(this.assign.id), + this.assign && AddonModAssign.invalidateAssignmentGradesData(this.assign.id), + this.assign && AddonModAssign.invalidateListParticipantsData(this.assign.id), + ]); + } + + /** + * Load assignment. + */ + async loadAssignment(sync: boolean = false): Promise { + // Get assignment data. + this.assign = await AddonModAssign.getAssignment(this.COURSE_ID, this.MODULE_ID); + + if (sync) { + try { + // Try to synchronize data. + const result = await AddonModAssignSync.syncAssign(this.assign.id); + + if (result && result.updated) { + CoreEvents.trigger( + AddonModAssignSyncProvider.MANUAL_SYNCED, + { + assignId: this.assign.id, + warnings: result.warnings, + gradesBlocked: result.gradesBlocked, + context: 'submission-list', + }, + CoreSites.getCurrentSiteId(), + ); + } + } catch (error) { + // Ignore errors, probably user is offline or sync is blocked. + } + } + + // Get assignment submissions. + this.submissionsData = await AddonModAssign.getSubmissions(this.assign.id, { cmId: this.assign.cmid }); + + if (!this.submissionsData.canviewsubmissions) { + // User shouldn't be able to reach here. + throw new Error('Cannot view submissions.'); + } + + // Check if groupmode is enabled to avoid showing wrong numbers. + this.groupInfo = await CoreGroups.getActivityGroupInfo(this.assign.cmid, false); + + this.groupId = CoreGroups.validateGroupId(this.groupId, this.groupInfo); + + await this.reload(); + } + + /** + * @inheritdoc + */ + protected async loadPageItems(): Promise<{ items: AddonModAssignSubmissionForList[] }> { + const assign = this.assign; + + if (!assign) { + throw new Error('Can\'t load submissions without assignment'); + } + + // Fetch submissions and grades. + let submissions = + await AddonModAssignHelper.getSubmissionsUserData( + assign, + this.submissionsData.submissions, + this.groupId, + ); + + // Get assignment grades only if workflow is not enabled to check grading date. + let grades = !assign.markingworkflow + ? await AddonModAssign.getAssignmentGrades(assign.id, { cmId: assign.cmid }) + : []; + + // Remove grades (not graded) and sort by timemodified DESC to allow finding quicker. + grades = grades.filter((grade) => parseInt(grade.grade, 10) >= 0).sort((a, b) => b.timemodified - a.timemodified); + // Filter the submissions to get only the ones with the right status and add some extra data. + if (this.SELECTED_STATUS == AddonModAssignListFilterName.NEED_GRADING) { + const promises: Promise[] = submissions.map(async (submission: AddonModAssignSubmissionForList) => { + // Only show the submissions that need to be graded. + submission.needsGrading = await AddonModAssign.needsSubmissionToBeGraded(submission, assign.id); + }); + + await Promise.all(promises); + + submissions = submissions.filter((submission: AddonModAssignSubmissionForList) => submission.needsGrading); + } else if (this.SELECTED_STATUS) { + const searchStatus = this.SELECTED_STATUS == AddonModAssignListFilterName.DRAFT + ? AddonModAssignSubmissionStatusValues.DRAFT + : AddonModAssignSubmissionStatusValues.SUBMITTED; + + submissions = submissions.filter((submission: AddonModAssignSubmissionForList) => submission.status == searchStatus); + } + + const showSubmissions: AddonModAssignSubmissionForList[] = await Promise.all( + submissions.map(async (submission: AddonModAssignSubmissionForList) => { + const gradeData = + await CoreUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid)); + + // Load offline grades. + const notSynced = !!gradeData && submission.timemodified < gradeData.timemodified; + + if (!assign.markingworkflow) { + // Get the last grade of the submission. + const grade = grades.find((grade) => grade.userid == submission.userid); + + if (grade) { + // Override status if grade is found. + submission.gradingstatus = grade.timemodified < submission.timemodified + ? AddonModAssignGradingStates.GRADED_FOLLOWUP_SUBMIT + : AddonModAssignGradingStates.GRADED; + } + } + submission.statusColor = AddonModAssign.getSubmissionStatusColor(submission.status); + submission.gradingColor = AddonModAssign.getSubmissionGradingStatusColor( + submission.gradingstatus, + ); + + submission.statusTranslated = Translate.instant( + 'addon.mod_assign.submissionstatus_' + submission.status, + ); + + if (notSynced) { + submission.gradingStatusTranslationId = 'addon.mod_assign.gradenotsynced'; + submission.gradingColor = ''; + } else if (submission.statusColor != CoreIonicColorNames.DANGER || + submission.gradingColor != CoreIonicColorNames.DANGER) { + // Show grading status if one of the statuses is not done. + submission.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId( + submission.gradingstatus, + ); + } else { + submission.gradingStatusTranslationId = ''; + } + + return submission; + }), + ); + + return { items: showSubmissions }; + } + +} + +/** + * Calculated data for an assign submission. + */ +export type AddonModAssignSubmissionForList = AddonModAssignSubmissionFormatted & { + statusColor?: string; // Calculated in the app. Color of the submission status. + gradingColor?: string; // Calculated in the app. Color of the submission grading status. + statusTranslated?: string; // Calculated in the app. Translated text of the submission status. + gradingStatusTranslationId?: string; // Calculated in the app. Key of the text of the submission grading status. + needsGrading?: boolean; // Calculated in the app. If submission and grading status means that it needs grading. +}; + +/** + * List filter by status name. + */ +export enum AddonModAssignListFilterName { + ALL = '', + NEED_GRADING = 'needgrading', + DRAFT = 'draft', + SUBMITTED = 'submitted', +}; diff --git a/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html b/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html index 6e5868cce..f24b5d9b3 100644 --- a/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html +++ b/src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html @@ -1,6 +1,8 @@ -

{{ plugin.name }}

+ +

{{ plugin.name }}

+
@@ -10,8 +12,7 @@
- + {{ 'core.done' | translate }} diff --git a/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html b/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html index 0c6116e3c..3a61b78e2 100644 --- a/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html +++ b/src/addons/mod/assign/components/feedback-plugin/addon-mod-assign-feedback-plugin.html @@ -1,4 +1,3 @@ - @@ -9,9 +8,8 @@ {{ 'addon.mod_assign.feedbacknotsupported' | translate }}

- +

- - - - - - - - - - - - - - - - + + + - + - + +
+ + +
- - - - - - - - - - - - - - - - - - - - {{ 'core.hasdatatosync' | translate: {$a: moduleName} }} - - - - + {{'core.groupsseparate' | translate }} {{'core.groupsvisible' | translate }} @@ -76,6 +33,14 @@ + + +

{{ 'core.course.hiddenfromstudents' | translate }}

+

{{ 'core.no' | translate }}

+

{{ 'core.yes' | translate }}

+
+
+

{{ 'addon.mod_assign.timeremaining' | translate }}

@@ -90,13 +55,12 @@
- +

{{ 'addon.mod_assign.numberofteams' | translate }}

{{ 'addon.mod_assign.numberofparticipants' | translate }}

- + {{ 'addon.mod_assign.numberofparticipantscountdescription' | translate:{count: summary.participantcount} }} @@ -109,48 +73,48 @@ -

{{ 'addon.mod_assign.numberofdraftsubmissions' | translate }}

- + +

{{ 'addon.mod_assign.numberofdraftsubmissions' | translate }}

+
+ {{ 'addon.mod_assign.numberofdraftsubmissionscountdescription' | translate: - {count: summary.submissiondraftscount} }} + {count: summary.submissiondraftscount} }}
- -

{{ 'addon.mod_assign.numberofsubmittedassignments' | translate }}

- + +

{{ 'addon.mod_assign.numberofsubmittedassignments' | translate }}

+
+ {{ 'addon.mod_assign.numberofsubmittedassignmentscountdescription' | translate: - {count: summary.submissionssubmittedcount} }} + {count: summary.submissionssubmittedcount} }}
- -

{{ 'addon.mod_assign.numberofsubmissionsneedgrading' | translate }}

+ +

{{ 'addon.mod_assign.numberofsubmissionsneedgrading' | translate }}

+
{{ 'addon.mod_assign.numberofsubmissionsneedgradingcountdescription' | translate: - {count: summary.submissionsneedgradingcount} }} + {count: summary.submissionsneedgradingcount} }}
@@ -163,10 +127,15 @@ {{ 'addon.mod_assign.'+summary.warnofungroupedusers | translate }}
+ +
+ + +
-
diff --git a/src/addons/mod/assign/components/index/index.ts b/src/addons/mod/assign/components/index/index.ts index edf0e7144..37998df5b 100644 --- a/src/addons/mod/assign/components/index/index.ts +++ b/src/addons/mod/assign/components/index/index.ts @@ -17,17 +17,17 @@ import { Params } from '@angular/router'; import { CoreSite } from '@classes/site'; import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component'; import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; -import { CoreCourse } from '@features/course/services/course'; import { IonContent } from '@ionic/angular'; import { CoreGroupInfo, CoreGroups } from '@services/groups'; import { CoreNavigator } from '@services/navigator'; import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; -import { CoreTextUtils } from '@services/utils/text'; import { CoreTimeUtils } from '@services/utils/time'; import { CoreUtils } from '@services/utils/utils'; import { Translate } from '@singletons'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; +import { CoreTime } from '@singletons/time'; +import { AddonModAssignListFilterName } from '../../classes/submissions-source'; import { AddonModAssign, AddonModAssignAssign, @@ -63,7 +63,6 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo canViewOwnSubmission = false; // Whether the user can view their own submission. timeRemaining?: string; // Message about time remaining to submit. lateSubmissions?: string; // Message about late submissions. - showNumbers = true; // Whether to show number of submissions with each status. summary?: AddonModAssignSubmissionGradingSummary; // The grading summary. needsGradingAvailable = false; // Whether we can see the submissions that need grading. @@ -72,27 +71,32 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo separateGroups: false, visibleGroups: false, defaultGroupId: 0, + canAccessAllGroups: false, }; // Status. - submissionStatusSubmitted = AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED; - submissionStatusDraft = AddonModAssignProvider.SUBMISSION_STATUS_DRAFT; - needGrading = AddonModAssignProvider.NEED_GRADING; + submissionStatusSubmitted = AddonModAssignListFilterName.SUBMITTED; + submissionStatusDraft = AddonModAssignListFilterName.DRAFT; + needGrading = AddonModAssignListFilterName.NEED_GRADING; - protected currentUserId?: number; // Current user ID. - protected currentSite?: CoreSite; // Current user ID. + protected currentUserId!: number; // Current user ID. + protected currentSite!: CoreSite; // Current site. protected syncEventName = AddonModAssignSyncProvider.AUTO_SYNCED; // Observers. protected savedObserver?: CoreEventObserver; protected submittedObserver?: CoreEventObserver; protected gradedObserver?: CoreEventObserver; + protected startedObserver?: CoreEventObserver; constructor( protected content?: IonContent, @Optional() courseContentsPage?: CoreCourseContentsPage, ) { super('AddonModLessonIndexComponent', content, courseContentsPage); + + this.currentSite = CoreSites.getRequiredCurrentSite(); + this.currentUserId = this.currentSite.getUserId(); } /** @@ -101,15 +105,12 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo async ngOnInit(): Promise { super.ngOnInit(); - this.currentUserId = CoreSites.getCurrentSiteUserId(); - this.currentSite = CoreSites.getCurrentSite(); - // Listen to events. this.savedObserver = CoreEvents.on( AddonModAssignProvider.SUBMISSION_SAVED_EVENT, (data) => { if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) { - // Assignment submission saved, refresh data. + // Assignment submission saved, refresh data. this.showLoadingAndRefresh(true, false); } }, @@ -121,7 +122,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo (data) => { if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) { // Assignment submitted, check completion. - CoreCourse.checkModuleCompletion(this.courseId, this.module.completiondata); + this.checkCompletion(); // Reload data since it can have offline data now. this.showLoadingAndRefresh(true, false); @@ -137,125 +138,105 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo } }, this.siteId); + this.startedObserver = CoreEvents.on(AddonModAssignProvider.STARTED_EVENT, (data) => { + if (this.assign && data.assignmentId == this.assign.id) { + // Assignment submission started, refresh data. + this.showLoadingAndRefresh(false, false); + } + }, this.siteId); + await this.loadContent(false, true); + } + + /** + * @inheritdoc + */ + protected async fetchContent(refresh?: boolean, sync = false, showErrors = false): Promise { + + // Get assignment data. + this.assign = await AddonModAssign.getAssignment(this.courseId, this.module.id); + + this.dataRetrieved.emit(this.assign); + this.description = this.assign.intro; + + if (sync) { + // Try to synchronize the assign. + await CoreUtils.ignoreErrors(this.syncActivity(showErrors)); + } + + // Check if there's any offline data for this assign. + this.hasOffline = await AddonModAssignOffline.hasAssignOfflineData(this.assign.id); + + // Get assignment submissions. + const submissions = await AddonModAssign.getSubmissions(this.assign.id, { cmId: this.module.id }); + const time = CoreTimeUtils.timestamp(); + + this.canViewAllSubmissions = submissions.canviewsubmissions; + + if (submissions.canviewsubmissions) { + + // Calculate the messages to display about time remaining and late submissions. + this.timeRemaining = ''; + this.lateSubmissions = ''; + + if (this.assign.duedate > 0) { + if (this.assign.duedate - time <= 0) { + this.timeRemaining = Translate.instant('addon.mod_assign.assignmentisdue'); + } else { + this.timeRemaining = CoreTime.formatTime(this.assign.duedate - time); + } + + if (this.assign.duedate < time) { + if (this.assign.cutoffdate) { + if (this.assign.cutoffdate > time) { + this.lateSubmissions = Translate.instant( + 'addon.mod_assign.latesubmissionsaccepted', + { $a: CoreTimeUtils.userDate(this.assign.cutoffdate * 1000) }, + ); + } else { + this.lateSubmissions = Translate.instant('addon.mod_assign.nomoresubmissionsaccepted'); + } + } + } + } + + // Check if groupmode is enabled to avoid showing wrong numbers. + this.groupInfo = await CoreGroups.getActivityGroupInfo(this.assign.cmid, false); + + await this.setGroup(CoreGroups.validateGroupId(this.group, this.groupInfo)); + + return; + } try { - await AddonModAssign.logView(this.assign!.id, this.assign!.name); - CoreCourse.checkModuleCompletion(this.courseId, this.module.completiondata); - } catch { - // Ignore errors. Just don't check Module completion. + // Check if the user can view their own submission. + await AddonModAssign.getSubmissionStatus(this.assign.id, { cmId: this.module.id }); + this.canViewOwnSubmission = true; + } catch (error) { + this.canViewOwnSubmission = false; + + if (error.errorcode !== 'nopermission') { + throw error; + } } + } + + /** + * @inheritdoc + */ + protected async logActivity(): Promise { + if (!this.assign) { + return; // Shouldn't happen. + } + + await AddonModAssign.logView(this.assign.id, this.assign.name); if (this.canViewAllSubmissions) { // User can see all submissions, log grading view. - CoreUtils.ignoreErrors(AddonModAssign.logGradingView(this.assign!.id, this.assign!.name)); + CoreUtils.ignoreErrors(AddonModAssign.logGradingView(this.assign.id, this.assign.name)); } else if (this.canViewOwnSubmission) { // User can only see their own submission, log view the user submission. - CoreUtils.ignoreErrors(AddonModAssign.logSubmissionView(this.assign!.id, this.assign!.name)); - } - } - - /** - * Expand the description. - */ - expandDescription(ev?: Event): void { - ev?.preventDefault(); - ev?.stopPropagation(); - - if (this.assign && (this.description || this.assign.introattachments)) { - CoreTextUtils.viewText(Translate.instant('core.description'), this.description || '', { - component: this.component, - componentId: this.module.id, - files: this.assign.introattachments, - filter: true, - contextLevel: 'module', - instanceId: this.module.id, - courseId: this.courseId, - }); - } - } - - /** - * Get assignment data. - * - * @param refresh If it's refreshing content. - * @param sync If it should try to sync. - * @param showErrors If show errors to the user of hide them. - * @return Promise resolved when done. - */ - protected async fetchContent(refresh = false, sync = false, showErrors = false): Promise { - - // Get assignment data. - try { - this.assign = await AddonModAssign.getAssignment(this.courseId, this.module.id); - - this.dataRetrieved.emit(this.assign); - this.description = this.assign.intro; - - if (sync) { - // Try to synchronize the assign. - await CoreUtils.ignoreErrors(this.syncActivity(showErrors)); - } - - // Check if there's any offline data for this assign. - this.hasOffline = await AddonModAssignOffline.hasAssignOfflineData(this.assign.id); - - // Get assignment submissions. - const submissions = await AddonModAssign.getSubmissions(this.assign.id, { cmId: this.module.id }); - const time = CoreTimeUtils.timestamp(); - - this.canViewAllSubmissions = submissions.canviewsubmissions; - - if (submissions.canviewsubmissions) { - - // Calculate the messages to display about time remaining and late submissions. - if (this.assign.duedate > 0) { - if (this.assign.duedate - time <= 0) { - this.timeRemaining = Translate.instant('addon.mod_assign.assignmentisdue'); - } else { - this.timeRemaining = CoreTimeUtils.formatDuration(this.assign.duedate - time, 3); - - if (this.assign.cutoffdate) { - if (this.assign.cutoffdate > time) { - this.lateSubmissions = Translate.instant( - 'addon.mod_assign.latesubmissionsaccepted', - { $a: CoreTimeUtils.userDate(this.assign.cutoffdate * 1000) }, - ); - } else { - this.lateSubmissions = Translate.instant('addon.mod_assign.nomoresubmissionsaccepted'); - } - } else { - this.lateSubmissions = ''; - } - } - } else { - this.timeRemaining = ''; - this.lateSubmissions = ''; - } - - // Check if groupmode is enabled to avoid showing wrong numbers. - this.groupInfo = await CoreGroups.getActivityGroupInfo(this.assign.cmid, false); - this.showNumbers = (this.groupInfo.groups && this.groupInfo.groups.length == 0) || - this.currentSite!.isVersionGreaterEqualThan('3.5'); - - await this.setGroup(CoreGroups.validateGroupId(this.group, this.groupInfo)); - - return; - } - - try { - // Check if the user can view their own submission. - await AddonModAssign.getSubmissionStatus(this.assign.id, { cmId: this.module.id }); - this.canViewOwnSubmission = true; - } catch (error) { - this.canViewOwnSubmission = false; - - if (error.errorcode !== 'nopermission') { - throw error; - } - } - } finally { - this.fillContextMenu(refresh); + CoreUtils.ignoreErrors(AddonModAssign.logSubmissionView(this.assign.id, this.assign.name)); } } @@ -268,7 +249,11 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo async setGroup(groupId = 0): Promise { this.group = groupId; - const submissionStatus = await AddonModAssign.getSubmissionStatus(this.assign!.id, { + if (!this.assign) { + return; + } + + const submissionStatus = await AddonModAssign.getSubmissionStatus(this.assign.id, { groupId: this.group, cmId: this.module.id, }); @@ -280,10 +265,10 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo return; } - if (this.summary?.warnofungroupedusers === true) { + if (this.summary.warnofungroupedusers === true) { this.summary.warnofungroupedusers = 'ungroupedusers'; } else { - switch (this.summary?.warnofungroupedusers) { + switch (this.summary.warnofungroupedusers) { case AddonModAssignProvider.WARN_GROUPS_REQUIRED: this.summary.warnofungroupedusers = 'ungroupedusers'; break; @@ -296,9 +281,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo } } - this.needsGradingAvailable = - (submissionStatus.gradingsummary?.submissionsneedgradingcount || 0) > 0 && - this.currentSite!.isVersionGreaterEqualThan('3.2'); + this.needsGradingAvailable = this.summary.submissionsneedgradingcount > 0; } /** @@ -307,8 +290,8 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo * @param status Status to see. * @param hasSubmissions If the status has any submission. */ - goToSubmissionList(status?: string, hasSubmissions = false): void { - if (typeof status != 'undefined' && !hasSubmissions && this.showNumbers) { + goToSubmissionList(status?: AddonModAssignListFilterName, hasSubmissions = false): void { + if (status !== undefined && !hasSubmissions) { return; } @@ -316,7 +299,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo groupId: this.group || 0, moduleName: this.moduleName, }; - if (typeof status != 'undefined') { + if (status !== undefined) { params.status = status; } @@ -329,12 +312,13 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo } /** - * Checks if sync has succeed from result sync data. - * - * @param result Data returned by the sync function. - * @return If succeed or not. + * @inheritdoc */ - protected hasSyncSucceed(result: AddonModAssignSyncResult): boolean { + protected hasSyncSucceed(result?: AddonModAssignSyncResult): boolean { + if (!result) { + return false; + } + if (result.updated) { this.submissionComponent?.invalidateAndRefresh(false); } @@ -343,14 +327,14 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo } /** - * Perform the invalidate content function. - * - * @return Resolved when done. + * @inheritdoc */ protected async invalidateContent(): Promise { const promises: Promise[] = []; promises.push(AddonModAssign.invalidateAssignmentData(this.courseId)); + // Invalidate before component becomes null. + promises.push(this.submissionComponent?.invalidateAndRefresh(true) || Promise.resolve()); if (this.assign) { promises.push(AddonModAssign.invalidateAllSubmissionData(this.assign.id)); @@ -360,9 +344,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo } } - await Promise.all(promises).finally(() => { - this.submissionComponent?.invalidateAndRefresh(true); - }); + await Promise.all(promises); } /** @@ -384,35 +366,34 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo } /** - * Compares sync event data with current data to check if refresh content is needed. - * - * @param syncEventData Data receiven on sync observer. - * @return True if refresh is needed, false otherwise. + * @inheritdoc */ protected isRefreshSyncNeeded(syncEventData: AddonModAssignAutoSyncData): boolean { - if (this.assign && syncEventData.assignId == this.assign.id) { - if (syncEventData.warnings && syncEventData.warnings.length) { - // Show warnings. - CoreDomUtils.showErrorModal(syncEventData.warnings[0]); - } - - return true; + if (!this.assign || syncEventData.assignId != this.assign.id) { + return false; } - return false; + if (syncEventData.warnings && syncEventData.warnings.length) { + // Show warnings. + CoreDomUtils.showErrorModal(syncEventData.warnings[0]); + } + + return true; } /** - * Performs the sync of the activity. - * - * @return Promise resolved when done. + * @inheritdoc */ - protected sync(): Promise { - return AddonModAssignSync.syncAssign(this.assign!.id); + protected async sync(): Promise { + if (!this.assign) { + return; + } + + return await AddonModAssignSync.syncAssign(this.assign.id); } /** - * Component being destroyed. + * @inheritdoc */ ngOnDestroy(): void { super.ngOnDestroy(); @@ -420,6 +401,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo this.savedObserver?.off(); this.submittedObserver?.off(); this.gradedObserver?.off(); + this.startedObserver?.off(); } } diff --git a/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html b/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html index 9ec50a95c..29818a878 100644 --- a/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html +++ b/src/addons/mod/assign/components/submission-plugin/addon-mod-assign-submission-plugin.html @@ -1,4 +1,3 @@ - @@ -9,9 +8,8 @@ {{ 'addon.mod_assign.submissionnotsupported' | translate }}

- +

+ +
+ + + + + +

{{ 'addon.mod_assign.caneditsubmission' | translate }}

+
+
+
- - - - -

{{ user!.fullname }}

- -
-
+ + + + +

{{ user!.fullname }}

+ +
+
- - - -

{{ 'addon.mod_assign.hiddenuser' | translate }} {{blindId}}

- -
-
+ + + +

{{ 'addon.mod_assign.hiddenuser' | translate }} {{blindId}}

+ +
+
- - - -

{{ 'addon.mod_assign.submissionstatus' | translate }}

- -
-
+ + + +

{{ 'addon.mod_assign.submissionstatus' | translate }}

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

{{ 'addon.mod_assign.timemodified' | translate }}

-

{{ userSubmission!.timemodified * 1000 | coreFormatDate }}

-
-
- - - -

{{ 'addon.mod_assign.timeremaining' | translate }}

-

-
-
- - - -

-

-

-

-
-
- - - -

{{ 'addon.mod_assign.duedate' | translate }}

-

{{ assign!.duedate * 1000 | coreFormatDate }}

-

{{ 'addon.mod_assign.duedateno' | translate }}

-
-
- - - -

{{ 'addon.mod_assign.cutoffdate' | translate }}

-

{{ assign!.cutoffdate * 1000 | coreFormatDate }}

-
-
- - - -

{{ 'addon.mod_assign.extensionduedate' | translate }}

-

{{ lastAttempt!.extensionduedate * 1000 | coreFormatDate }}

-
-
- - - -

{{ 'addon.mod_assign.attemptnumber' | translate }}

-

- {{ 'addon.mod_assign.outof' | translate : - {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }} -

-

- {{ 'addon.mod_assign.outof' | translate : - {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }} -

-
-
- - - - -
- - - {{ 'addon.mod_assign.editsubmission' | translate }} - - - - {{ 'addon.mod_assign.addsubmission' | translate }} - - - - - {{ 'addon.mod_assign.addnewattemptfromprevious' | translate }} - - - {{ 'addon.mod_assign.addnewattempt' | translate }} - - - - - {{ 'addon.mod_assign.editsubmission' | translate }} - -
-
-

{{ 'addon.mod_assign.erroreditpluginsnotsupported' | translate }}

-

{{ name }}

-
-
-

{{ 'addon.mod_assign.cannoteditduetostatementsubmission' | translate }}

-
-
-
- - - - + + + + + + + - - - - - - - - - - {{ 'addon.mod_assign.submitassignment' | translate }} - -

{{ 'addon.mod_assign.submitassignment_help' | translate }}

-
-
- - - -

- {{ 'addon.mod_assign.cannotsubmitduetostatementsubmission' | translate }} -

-
-
-
- - - -

{{ 'addon.mod_assign.userswhoneedtosubmit' | translate: {$a: ''} }}

-
- - - - -

{{ user.fullname }}

-
-
-
- - - - {{ 'addon.mod_assign.hiddenuser' | translate }} {{ blindId }} - - - - - - -

{{ 'addon.mod_assign.submissionslocked' | translate }}

-
- - - - -

{{ 'addon.mod_assign.editingstatus' | translate }}

-

{{ 'addon.mod_assign.submissioneditable' | translate }}

-

{{ 'addon.mod_assign.submissionnoteditable' | translate }}

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

{{ 'addon.mod_assign.currentgrade' | translate }}

-

-
- - - -
- - - - - -

{{ 'addon.mod_assign.gradeoutof' | translate: {$a: gradeInfo!.grade} }}

-
- - -

{{ 'addon.mod_assign.gradelocked' | translate }}

-
- - - -

{{ 'addon.mod_assign.grade' | translate }}

- - - {{grade.label}} - - -
- - - -

{{ outcome.name }}

- - - {{grade.label}} - - -

{{ outcome.selected }}

-
- - - - -

{{ 'addon.mod_assign.currentgrade' | translate }}

-

- {{ grade.gradebookGrade }} -

-

- {{ grade.scale[grade.gradebookGrade].label }} -

-

-

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

{{ 'addon.mod_assign.markingworkflowstate' | translate }}

-

{{ workflowStatusTranslationId | translate }}

-
-
- - - - -

{{ 'addon.mod_assign.groupsubmissionsettings' | translate }}

-

{{ 'addon.mod_assign.applytoteam' | translate }}

-
- -
- - - - - -

{{ 'addon.mod_assign.attemptsettings' | translate }}

+

{{ 'addon.mod_assign.attemptnumber' | translate }}

{{ 'addon.mod_assign.outof' | translate : - {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }} + {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }}

{{ 'addon.mod_assign.outof' | translate : - {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }} -

-

- {{ 'addon.mod_assign.attemptreopenmethod' | translate }}: - {{ 'addon.mod_assign.attemptreopenmethod_' + assign!.attemptreopenmethod | translate }} + {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }}

- - {{ 'addon.mod_assign.addattempt' | translate }} - - -
- - - - -

{{ 'addon.mod_assign.gradedby' | translate }}

-

{{ grader!.fullname }}

-

{{ feedback!.gradeddate * 1000 | coreFormatDate }}

-
-
- - - - -

{{ 'addon.mod_assign.gradedon' | translate }}

-

{{ feedback!.gradeddate * 1000 | coreFormatDate }}

-
-
- - - - - + + -

{{ 'addon.mod_assign.cannotgradefromapp' | translate }}

- - {{ 'core.openinbrowser' | translate }} - - +

{{ 'addon.mod_assign.submissionslocked' | translate }}

-
-
-
-
+ + + + +

+

+

+

+
+
+ + + +

{{ 'addon.mod_assign.duedate' | translate }}

+

{{ assign!.duedate * 1000 | coreFormatDate }}

+

{{ 'addon.mod_assign.duedateno' | translate }}

+
+
+ + + +

{{ 'addon.mod_assign.cutoffdate' | translate }}

+

{{ assign!.cutoffdate * 1000 | coreFormatDate }}

+
+
+ + + +

{{ 'addon.mod_assign.extensionduedate' | translate }}

+

{{ lastAttempt!.extensionduedate * 1000 | coreFormatDate }}

+
+
+ + + + +

{{ 'addon.mod_assign.timeremaining' | translate }}

+

+ + +
+
+ + + + +

{{ 'addon.mod_assign.timelimit' | translate }}

+

{{ assign.timelimit | coreDuration }}

+
+
+ + + + +

{{ 'addon.mod_assign.editingstatus' | translate }}

+

{{ 'addon.mod_assign.submissioneditable' | translate }}

+

{{ 'addon.mod_assign.submissionnoteditable' | translate }}

+
+
+ + + + +

{{ 'addon.mod_assign.timemodified' | translate }}

+

{{ userSubmission!.timemodified * 1000 | coreFormatDate }}

+
+
+ + + + + + + +

{{ 'addon.mod_assign.userswhoneedtosubmit' | translate: {$a: ''} }}

+
+
+ + + + + +

{{ user.fullname }}

+
+
+
+
+ + + + {{ 'addon.mod_assign.hiddenuser' | translate }} {{ blindId }} + + + + + +
+
+ + + + + {{ 'addon.mod_assign.editsubmission' | translate }} + + + + + {{ 'addon.mod_assign.addsubmission' | translate }} + + + {{ 'addon.mod_assign.beginassignment' | translate }} + + + + + + {{ 'addon.mod_assign.addnewattemptfromprevious' | translate }} + + + {{ 'addon.mod_assign.addnewattempt' | translate }} + + + + + {{ 'addon.mod_assign.editsubmission' | translate }} + + + + + +

{{ 'addon.mod_assign.erroreditpluginsnotsupported' | translate }}

+

{{ name }}

+
+ +

{{ 'addon.mod_assign.cannoteditduetostatementsubmission' | translate }}

+
+
+
+ +
+ + + + + + + + + + + + + + + {{ 'addon.mod_assign.submitassignment' | translate }} + +

{{ 'addon.mod_assign.submitassignment_help' | translate }}

+
+
+ + + +

+ {{ 'addon.mod_assign.cannotsubmitduetostatementsubmission' | translate }} +

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

{{ 'addon.mod_assign.currentgrade' | translate }}

+

+ +

+
+ + + +
+ + + + + +

{{ 'addon.mod_assign.gradeoutof' | translate: {$a: gradeInfo!.grade} }}

+
+ + +

{{ 'addon.mod_assign.gradelocked' | translate }}

+
+ + + + +

{{ 'addon.mod_assign.grade' | translate }}

+
+ + + {{grade.label}} + + +
+ + + + +

{{ outcome.name }}

+
+ + + {{grade.label}} + + +

{{ outcome.selected }}

+
+ + + + +

{{ 'addon.mod_assign.currentgrade' | translate }}

+

+ {{ grade.gradebookGrade }} +

+

+ {{ grade.scale[grade.gradebookGrade].label }} +

+

-

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

{{ 'addon.mod_assign.markingworkflowstate' | translate }}

+

{{ workflowStatusTranslationId | translate }}

+
+
+ + + + +

{{ 'addon.mod_assign.groupsubmissionsettings' | translate }}

+

{{ 'addon.mod_assign.applytoteam' | translate }}

+
+ +
+ + + + + +

{{ 'addon.mod_assign.attemptsettings' | translate }}

+

+ {{ 'addon.mod_assign.outof' | translate : + {'$a': {'current': currentAttempt, 'total': maxAttemptsText} } }} +

+

+ {{ 'addon.mod_assign.outof' | translate : + {'$a': {'current': currentAttempt, 'total': assign!.maxattempts} } }} +

+

+ {{ 'addon.mod_assign.attemptreopenmethod' | translate }}: + {{ 'addon.mod_assign.attemptreopenmethod_' + assign!.attemptreopenmethod | translate }} +

+
+
+ + {{ 'addon.mod_assign.addattempt' | translate }} + + +
+ + + + + +

{{ 'addon.mod_assign.gradedby' | translate }}

+

{{ grader!.fullname }}

+

{{ feedback!.gradeddate * 1000 | coreFormatDate }}

+
+
+ + + + +

{{ 'addon.mod_assign.gradedon' | translate }}

+

{{ feedback!.gradeddate * 1000 | coreFormatDate }}

+
+
+ + + + + + +

{{ 'addon.mod_assign.cannotgradefromapp' | translate }}

+ + {{ 'core.openinbrowser' | translate }} + + +
+
+
+
+
+ +
-

{{lastAttempt!.submissiongroupname}}

+

+ {{lastAttempt!.submissiongroupname}} +

@@ -387,10 +433,10 @@

- + {{ statusTranslated }} - + {{ gradingStatusTranslationId | translate }}

diff --git a/src/addons/mod/assign/components/submission/submission.scss b/src/addons/mod/assign/components/submission/submission.scss index 3c8a199a0..eb68d7add 100644 --- a/src/addons/mod/assign/components/submission/submission.scss +++ b/src/addons/mod/assign/components/submission/submission.scss @@ -1,30 +1,47 @@ :host ::ng-deep { - div.latesubmission, - div.overdue { + ion-item.latesubmission, + ion-item.overdue { border-bottom: 3px solid var(--danger) !important; ion-icon { color: var(--danger); } } - div.earlysubmission { + ion-item.earlysubmission { border-bottom: 3px solid var(--success) !important; ion-icon { color: var(--success); } } - div.submissioneditable p { - color: var(--red); + ion-item.submissioneditable p { + color: var(--danger); } .core-grading-summary .advancedgrade { display: none; } + + ion-badge { + margin-left: 2px; + margin-right: 2px; + } + + core-timer .core-timer { + &.core-timer-under-300 { + background-color: var(--danger-tint); + color: var(--danger-shade); + } + + &.core-timer-under-900 { + background-color: var(--warning-tint); + color: var(--warning-shade); + } + } } :host-context(body.dark) ::ng-deep { - div.submissioneditable p { - color: var(--red-light); + ion-item.submissioneditable p { + color: var(--danger-tint); } } diff --git a/src/addons/mod/assign/components/submission/submission.ts b/src/addons/mod/assign/components/submission/submission.ts index a59db45c3..f3c2f3840 100644 --- a/src/addons/mod/assign/components/submission/submission.ts +++ b/src/addons/mod/assign/components/submission/submission.ts @@ -25,6 +25,9 @@ import { AddonModAssign, AddonModAssignGetSubmissionStatusWSResponse, AddonModAssignSavePluginData, + AddonModAssignGradingStates, + AddonModAssignSubmissionStatusValues, + AddonModAssignAttemptReopenMethodValues, } from '../../services/assign'; import { AddonModAssignAutoSyncData, @@ -55,6 +58,7 @@ import { CoreSync } from '@services/sync'; import { AddonModAssignSubmissionPluginComponent } from '../submission-plugin/submission-plugin'; import { AddonModAssignModuleHandlerService } from '../../services/handlers/module'; import { CanLeave } from '@guards/can-leave'; +import { CoreTime } from '@singletons/time'; /** * Component that displays an assignment submission. @@ -103,6 +107,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can submissionPlugins: AddonModAssignPlugin[] = []; // List of submission plugins. timeRemaining = ''; // Message about time remaining. timeRemainingClass = ''; // Class to apply to time remaining message. + timeLimitEndTime = 0; // If time limit is enabled and submission is ongoing, the end time for the timer. statusTranslated?: string; // Status. statusColor = ''; // Color to apply to the status. unsupportedEditPlugins: string[] = []; // List of submission plugins that don't support edit. @@ -123,11 +128,12 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can gradeUrl?: string; // URL to grade in browser. isPreviousAttemptEmpty = true; // Whether the previous attempt contains an empty submission. showDates = false; // Whether to show some dates. + timeLimitFinished = false; // Whether there is a time limit and it finished, so the user will submit late. // Some constants. - statusNew = AddonModAssignProvider.SUBMISSION_STATUS_NEW; - statusReopened = AddonModAssignProvider.SUBMISSION_STATUS_REOPENED; - attemptReopenMethodNone = AddonModAssignProvider.ATTEMPT_REOPEN_METHOD_NONE; + statusNew = AddonModAssignSubmissionStatusValues.NEW; + statusReopened = AddonModAssignSubmissionStatusValues.REOPENED; + attemptReopenMethodNone = AddonModAssignAttemptReopenMethodValues.NONE; unlimitedAttempts = AddonModAssignProvider.UNLIMITED_ATTEMPTS; protected siteId: string; // Current site ID. @@ -178,7 +184,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } /** - * Component being initialized. + * @inheritdoc */ ngOnInit(): void { this.isSubmittedForGrading = !!this.submitId; @@ -193,7 +199,16 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * @param response Response of get submission status. */ protected calculateTimeRemaining(response: AddonModAssignGetSubmissionStatusWSResponse): void { - if (this.assign!.duedate <= 0) { + if (!this.assign) { + return; + } + + const submissionStarted = !!this.userSubmission?.timestarted; + this.timeLimitEndTime = 0; + this.timeLimitFinished = false; + + if (this.assign.duedate <= 0 && !submissionStarted) { + // No due date and no countdown. this.timeRemaining = ''; this.timeRemainingClass = ''; @@ -201,53 +216,53 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } const time = CoreTimeUtils.timestamp(); - const dueDate = response.lastattempt?.extensionduedate - ? response.lastattempt.extensionduedate - : this.assign!.duedate; - const timeRemaining = dueDate - time; + const timeLimitEnabled = this.assign.timelimit && submissionStarted; + const dueDateReached = this.assign.duedate > 0 && this.assign.duedate - time <= 0; + const timeLimitEnabledBeforeDueDate = timeLimitEnabled && !dueDateReached; - if (timeRemaining > 0) { - this.timeRemaining = CoreTimeUtils.formatDuration(timeRemaining, 3); - this.timeRemainingClass = ''; + if (this.userSubmission && this.userSubmission.status === AddonModAssignSubmissionStatusValues.SUBMITTED) { + // Submitted, display the relevant early/late message. + const lateCalculation = this.userSubmission.timemodified - + (timeLimitEnabledBeforeDueDate ? this.userSubmission.timecreated : 0); + const lateThreshold = timeLimitEnabledBeforeDueDate ? this.assign.timelimit || 0 : this.assign.duedate; + const earlyString = timeLimitEnabledBeforeDueDate ? 'submittedundertime' : 'submittedearly'; + const lateString = timeLimitEnabledBeforeDueDate ? 'submittedovertime' : 'submittedlate'; + const onTime = lateCalculation <= lateThreshold; - return; - } - - // Not submitted. - if (!this.userSubmission || this.userSubmission.status != AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED) { - - if (response.lastattempt?.submissionsenabled || response.gradingsummary?.submissionsenabled) { - this.timeRemaining = Translate.instant( - 'addon.mod_assign.overdue', - { $a: CoreTimeUtils.formatDuration(-timeRemaining, 3) }, - ); - this.timeRemainingClass = 'overdue'; - - return; - } - - this.timeRemaining = Translate.instant('addon.mod_assign.duedatereached'); - this.timeRemainingClass = ''; - - return; - } - - const timeSubmittedDiff = this.userSubmission.timemodified - dueDate; - if (timeSubmittedDiff > 0) { this.timeRemaining = Translate.instant( - 'addon.mod_assign.submittedlate', - { $a: CoreTimeUtils.formatDuration(timeSubmittedDiff, 2) }, + 'addon.mod_assign.' + (onTime ? earlyString : lateString), + { $a: CoreTime.formatTime(Math.abs(lateCalculation - lateThreshold)) }, ); - this.timeRemainingClass = 'latesubmission'; + this.timeRemainingClass = onTime ? 'earlysubmission' : 'latesubmission'; return; } - this.timeRemaining = Translate.instant( - 'addon.mod_assign.submittedearly', - { $a: CoreTimeUtils.formatDuration(-timeSubmittedDiff, 2) }, - ); - this.timeRemainingClass = 'earlysubmission'; + if (dueDateReached) { + // There is no submission, due date has passed, show assignment is overdue. + const submissionsEnabled = response.lastattempt?.submissionsenabled || response.gradingsummary?.submissionsenabled; + this.timeRemaining = Translate.instant( + 'addon.mod_assign.' + (submissionsEnabled ? 'overdue' : 'duedatereached'), + { $a: CoreTime.formatTime(time - this.assign.duedate) }, + ); + this.timeRemainingClass = 'overdue'; + this.timeLimitFinished = true; + + return; + } + + if (timeLimitEnabled && submissionStarted) { + // An attempt has started and there is a time limit, display the time limit. + this.timeRemaining = ''; + this.timeRemainingClass = 'timeremaining'; + this.timeLimitEndTime = AddonModAssignHelper.calculateEndTime(this.assign, this.userSubmission); + + return; + } + + // Assignment is not overdue, and no submission has been made. Just display the due date. + this.timeRemaining = CoreTime.formatTime(this.assign.duedate - time); + this.timeRemainingClass = 'timeremaining'; } /** @@ -273,6 +288,10 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * Copy a previous attempt and then go to edit. */ async copyPrevious(): Promise { + if (!this.assign) { + return; + } + if (!CoreApp.isOnline()) { CoreDomUtils.showErrorModal('core.networkerrormsg', true); @@ -281,14 +300,14 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can if (!this.previousAttempt?.submission) { // Cannot access previous attempts, just go to edit. - return this.goToEdit(); + return this.goToEdit(true); } const previousSubmission = this.previousAttempt.submission; let modal = await CoreDomUtils.showModalLoading(); const size = await CoreUtils.ignoreErrors( - AddonModAssignHelper.getSubmissionSizeForCopy(this.assign!, previousSubmission), + AddonModAssignHelper.getSubmissionSizeForCopy(this.assign, previousSubmission), -1, ); // Error calculating size, return -1. @@ -306,15 +325,15 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can modal = await CoreDomUtils.showModalLoading('core.sending', true); try { - await AddonModAssignHelper.copyPreviousAttempt(this.assign!, previousSubmission); + await AddonModAssignHelper.copyPreviousAttempt(this.assign, previousSubmission); // Now go to edit. - this.goToEdit(); + this.goToEdit(true); - if (!this.assign!.submissiondrafts) { + if (!this.assign.submissiondrafts && this.userSubmission) { // No drafts allowed, so it was submitted. Trigger event. CoreEvents.trigger(AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, { - assignmentId: this.assign!.id, - submissionId: this.userSubmission!.id, + assignmentId: this.assign.id, + submissionId: this.userSubmission.id, userId: this.currentUserId, }, this.siteId); } else { @@ -334,15 +353,31 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * @return Promise resolved when done. */ protected async discardDrafts(): Promise { - if (this.feedback && this.feedback.plugins) { - await AddonModAssignHelper.discardFeedbackPluginData(this.assign!.id, this.submitId, this.feedback); + if (this.assign && this.feedback && this.feedback.plugins) { + await AddonModAssignHelper.discardFeedbackPluginData(this.assign.id, this.submitId, this.feedback); } } /** * Go to the page to add or edit submission. + * + * @param afterCopyPrevious Whether the user has just copied the previous submission. */ - goToEdit(): void { + async goToEdit(afterCopyPrevious = false): Promise { + if (!afterCopyPrevious && this.assign?.timelimit && (!this.userSubmission || !this.userSubmission.timestarted)) { + try { + await CoreDomUtils.showConfirm( + Translate.instant('addon.mod_assign.confirmstart', { + $a: CoreTime.formatTime(this.assign.timelimit), + }), + undefined, + Translate.instant('addon.mod_assign.beginassignment'), + ); + } catch { + return; // User canceled. + } + } + CoreNavigator.navigateToSitePath( AddonModAssignModuleHandlerService.PAGE_NAME + '/' + this.courseId + '/' + this.moduleId + '/edit', { @@ -360,7 +395,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * @return Promise resolved with boolean: whether there's data to save. */ protected async hasDataToSave(isSubmit = false): Promise { - if (!this.canSaveGrades || !this.loaded) { + if (!this.canSaveGrades || !this.loaded || !this.assign) { return false; } @@ -376,11 +411,11 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } // Check if outcomes changed. - if (this.gradeInfo && this.gradeInfo.outcomes) { + if (this.gradeInfo?.outcomes) { for (const x in this.gradeInfo.outcomes) { const outcome = this.gradeInfo.outcomes[x]; - if (this.originalGrades.outcomes[outcome.id] == 'undefined' || + if (this.originalGrades.outcomes[outcome.id] === undefined || this.originalGrades.outcomes[outcome.id] != outcome.selectedId) { return true; } @@ -393,7 +428,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can try { return AddonModAssignHelper.hasFeedbackDataChanged( - this.assign!, + this.assign, this.userSubmission, this.feedback, this.submitId, @@ -432,13 +467,13 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can promises.push(AddonModAssign.invalidateAssignmentData(this.courseId)); if (this.assign) { promises.push(AddonModAssign.invalidateSubmissionStatusData( - this.assign!.id, + this.assign.id, this.submitId, undefined, !!this.blindId, )); - promises.push(AddonModAssign.invalidateAssignmentUserMappingsData(this.assign!.id)); - promises.push(AddonModAssign.invalidateListParticipantsData(this.assign!.id)); + promises.push(AddonModAssign.invalidateAssignmentUserMappingsData(this.assign.id)); + promises.push(AddonModAssign.invalidateListParticipantsData(this.assign.id)); } promises.push(CoreGradesHelper.invalidateGradeModuleItems(this.courseId, this.submitId)); promises.push(CoreCourse.invalidateModule(this.moduleId)); @@ -531,13 +566,13 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } // Treat last attempt. - promises = this.treatLastAttempt(submissionStatus); + promises = this.treatLastAttempt(submissionStatus, this.lastAttempt); // Calculate the time remaining. this.calculateTimeRemaining(submissionStatus); // Load the feedback. - promises.push(this.loadFeedback(submissionStatus.feedback)); + promises.push(this.loadFeedback(this.assign, submissionStatus.feedback)); // Check if there's any unsupported plugin for editing. if (!this.userSubmission || !this.userSubmission.plugins) { @@ -572,8 +607,12 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * @return Promise resolved when done. */ protected async loadSubmissionOfflineData(): Promise { + if (!this.assign) { + return; + } + try { - const submission = await AddonModAssignOffline.getSubmission(this.assign!.id, this.submitId); + const submission = await AddonModAssignOffline.getSubmission(this.assign.id, this.submitId); this.hasOffline = submission && submission.plugindata && Object.keys(submission.plugindata).length > 0; @@ -588,10 +627,11 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can /** * Load the data to render the feedback and grade. * + * @param assign Assign data. * @param feedback The feedback data from the submission status. * @return Promise resolved when done. */ - protected async loadFeedback(feedback?: AddonModAssignSubmissionFeedback): Promise { + protected async loadFeedback(assign: AddonModAssignAssign, feedback?: AddonModAssignSubmissionFeedback): Promise { this.grade = { method: '', modified: 0, @@ -612,11 +652,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can // If we have data about the grader, get its profile. if (feedback.grade && feedback.grade.grader > 0) { - try { - this.grader = await CoreUser.getProfile(feedback.grade.grader, this.courseId); - } catch { - // Ignore errors. - } + this.grader = await CoreUtils.ignoreErrors(CoreUser.getProfile(feedback.grade.grader, this.courseId)); } else { delete this.grader; } @@ -633,7 +669,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can if (feedback.grade && feedback.grade.grade && !this.grade.grade) { const parsedGrade = parseFloat(feedback.grade.grade); - this.grade!.grade = parsedGrade >= 0 ? parsedGrade : undefined; + this.grade.grade = parsedGrade >= 0 ? parsedGrade : undefined; this.grade.gradebookGrade = CoreUtils.formatFloat(this.grade.grade); this.originalGrades.grade = this.grade.grade; } @@ -649,31 +685,30 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can this.gradeInfo = await CoreCourse.getModuleBasicGradeInfo(this.moduleId); if (!this.gradeInfo) { - // It won't get gradeinfo on 3.1. return; } // Treat the grade info. await this.treatGradeInfo(); - const isManual = this.assign!.attemptreopenmethod == AddonModAssignProvider.ATTEMPT_REOPEN_METHOD_MANUAL; - const isUnlimited = this.assign!.maxattempts == AddonModAssignProvider.UNLIMITED_ATTEMPTS; - const isLessThanMaxAttempts = !!this.userSubmission && (this.userSubmission.attemptnumber < (this.assign!.maxattempts - 1)); + const isManual = assign.attemptreopenmethod == AddonModAssignAttemptReopenMethodValues.MANUAL; + const isUnlimited = assign.maxattempts == AddonModAssignProvider.UNLIMITED_ATTEMPTS; + const isLessThanMaxAttempts = !!this.userSubmission && (this.userSubmission.attemptnumber < (assign.maxattempts - 1)); this.allowAddAttempt = isManual && (!this.userSubmission || isUnlimited || isLessThanMaxAttempts); - if (this.assign!.teamsubmission) { + if (assign.teamsubmission) { this.grade.applyToAll = true; this.originalGrades.applyToAll = true; } - if (this.assign!.markingworkflow && this.grade.gradingStatus) { + if (assign.markingworkflow && this.grade.gradingStatus) { this.workflowStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId(this.grade.gradingStatus); } - if (this.lastAttempt?.gradingstatus == 'graded' && !this.assign!.markingworkflow && this.userSubmission && feedback) { + if (this.lastAttempt?.gradingstatus == 'graded' && !assign.markingworkflow && this.userSubmission && feedback) { if (feedback.gradeddate < this.userSubmission.timemodified) { - this.lastAttempt.gradingstatus = AddonModAssignProvider.GRADED_FOLLOWUP_SUBMIT; + this.lastAttempt.gradingstatus = AddonModAssignGradingStates.GRADED_FOLLOWUP_SUBMIT; // Get grading text and color. this.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId( @@ -687,7 +722,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can if (!this.feedback || !this.feedback.plugins) { // Feedback plugins not present, we have to use assign configs to detect the plugins used. this.feedback = AddonModAssignHelper.createEmptyFeedback(); - this.feedback.plugins = AddonModAssignHelper.getPluginsEnabled(this.assign!, 'assignfeedback'); + this.feedback.plugins = AddonModAssignHelper.getPluginsEnabled(assign, 'assignfeedback'); } // Check if there's any offline data for this submission. @@ -702,7 +737,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can // Submission grades aren't identified by attempt number so it can retrieve the feedback for a previous attempt. // The app will not treat that as an special case. const submissionGrade = await CoreUtils.ignoreErrors( - AddonModAssignOffline.getSubmissionGrade(this.assign!.id, this.submitId), + AddonModAssignOffline.getSubmissionGrade(assign.id, this.submitId), ); this.hasOfflineGrade = false; @@ -727,10 +762,10 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can if (submissionGrade.outcomes && Object.keys(submissionGrade.outcomes).length && this.gradeInfo?.outcomes) { this.gradeInfo.outcomes.forEach((outcome) => { - if (typeof submissionGrade.outcomes[outcome.itemNumber!] != 'undefined') { + if (outcome.itemNumber !== undefined && submissionGrade.outcomes[outcome.itemNumber] !== undefined) { // If outcome has been modified from gradebook, do not use offline. - if (outcome.modified! < submissionGrade.timemodified) { - outcome.selectedId = submissionGrade.outcomes[outcome.itemNumber!]; + if ((outcome.modified || 0) < submissionGrade.timemodified) { + outcome.selectedId = submissionGrade.outcomes[outcome.itemNumber]; this.originalGrades.outcomes[outcome.id] = outcome.selectedId; } } @@ -754,43 +789,47 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * @param status Submission status. */ protected setStatusNameAndClass(status: AddonModAssignGetSubmissionStatusWSResponse): void { - const translateService = Translate.instance; + if (!this.assign) { + return; + } if (this.hasOffline || this.submittedOffline) { // Offline data. - this.statusTranslated = translateService.instant('core.notsent'); + this.statusTranslated = Translate.instant('core.notsent'); this.statusColor = 'warning'; - } else if (!this.assign!.teamsubmission) { + } else if (!this.assign.teamsubmission) { // Single submission. if (this.userSubmission && this.userSubmission.status != this.statusNew) { - this.statusTranslated = translateService.instant('addon.mod_assign.submissionstatus_' + this.userSubmission.status); + this.statusTranslated = Translate.instant('addon.mod_assign.submissionstatus_' + this.userSubmission.status); this.statusColor = AddonModAssign.getSubmissionStatusColor(this.userSubmission.status); } else { if (!status.lastattempt?.submissionsenabled) { - this.statusTranslated = translateService.instant('addon.mod_assign.noonlinesubmissions'); - this.statusColor = AddonModAssign.getSubmissionStatusColor('noonlinesubmissions'); + this.statusTranslated = Translate.instant('addon.mod_assign.noonlinesubmissions'); + this.statusColor = + AddonModAssign.getSubmissionStatusColor(AddonModAssignSubmissionStatusValues.NO_ONLINE_SUBMISSIONS); } else { - this.statusTranslated = translateService.instant('addon.mod_assign.noattempt'); - this.statusColor = AddonModAssign.getSubmissionStatusColor('noattempt'); + this.statusTranslated = Translate.instant('addon.mod_assign.noattempt'); + this.statusColor = AddonModAssign.getSubmissionStatusColor(AddonModAssignSubmissionStatusValues.NO_ATTEMPT); } } } else { // Team submission. - if (!status.lastattempt?.submissiongroup && this.assign!.preventsubmissionnotingroup) { - this.statusTranslated = translateService.instant('addon.mod_assign.nosubmission'); - this.statusColor = AddonModAssign.getSubmissionStatusColor('nosubmission'); + if (!status.lastattempt?.submissiongroup && this.assign.preventsubmissionnotingroup) { + this.statusTranslated = Translate.instant('addon.mod_assign.nosubmission'); + this.statusColor = AddonModAssign.getSubmissionStatusColor(AddonModAssignSubmissionStatusValues.NO_SUBMISSION); } else if (this.userSubmission && this.userSubmission.status != this.statusNew) { - this.statusTranslated = translateService.instant('addon.mod_assign.submissionstatus_' + this.userSubmission.status); + this.statusTranslated = Translate.instant('addon.mod_assign.submissionstatus_' + this.userSubmission.status); this.statusColor = AddonModAssign.getSubmissionStatusColor(this.userSubmission.status); } else { if (!status.lastattempt?.submissionsenabled) { - this.statusTranslated = translateService.instant('addon.mod_assign.noonlinesubmissions'); - this.statusColor = AddonModAssign.getSubmissionStatusColor('noonlinesubmissions'); + this.statusTranslated = Translate.instant('addon.mod_assign.noonlinesubmissions'); + this.statusColor = + AddonModAssign.getSubmissionStatusColor(AddonModAssignSubmissionStatusValues.NO_ONLINE_SUBMISSIONS); } else { - this.statusTranslated = translateService.instant('addon.mod_assign.nosubmission'); - this.statusColor = AddonModAssign.getSubmissionStatusColor('nosubmission'); + this.statusTranslated = Translate.instant('addon.mod_assign.nosubmission'); + this.statusColor = AddonModAssign.getSubmissionStatusColor(AddonModAssignSubmissionStatusValues.NO_SUBMISSION); } } } @@ -818,7 +857,11 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * @param acceptStatement Whether the statement has been accepted. */ async submitForGrading(acceptStatement: boolean): Promise { - if (this.assign!.requiresubmissionstatement && !acceptStatement) { + if (!this.assign || !this.userSubmission) { + return; + } + + if (this.assign.requiresubmissionstatement && !acceptStatement) { CoreDomUtils.showErrorModal('addon.mod_assign.acceptsubmissionstatement', true); return; @@ -832,17 +875,17 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can try { await AddonModAssign.submitForGrading( - this.assign!.id, + this.assign.id, this.courseId, acceptStatement, - this.userSubmission!.timemodified, + this.userSubmission.timemodified, this.hasOffline, ); // Submitted, trigger event. CoreEvents.trigger(AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, { - assignmentId: this.assign!.id, - submissionId: this.userSubmission!.id, + assignmentId: this.assign.id, + submissionId: this.userSubmission.id, userId: this.currentUserId, }, this.siteId); } catch (error) { @@ -863,7 +906,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can async submitGrade(): Promise { // Check if there's something to be saved. const modified = await this.hasDataToSave(true); - if (!modified) { + if (!modified || !this.assign) { return; } @@ -882,22 +925,21 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can const modal = await CoreDomUtils.showModalLoading('core.sending', true); (this.gradeInfo?.outcomes || []).forEach((outcome) => { - if (outcome.itemNumber) { - outcomes[outcome.itemNumber] = outcome.selectedId!; + if (outcome.itemNumber && outcome.selectedId) { + outcomes[outcome.itemNumber] = outcome.selectedId; } }); let pluginData: AddonModAssignSavePluginData = {}; try { if (this.feedback && this.feedback.plugins) { - pluginData = - await AddonModAssignHelper.prepareFeedbackPluginData(this.assign!.id, this.submitId, this.feedback); + pluginData = await AddonModAssignHelper.prepareFeedbackPluginData(this.assign.id, this.submitId, this.feedback); } try { // We have all the data, now send it. await AddonModAssign.submitGradingForm( - this.assign!.id, + this.assign.id, this.submitId, this.courseId, grade || 0, @@ -916,7 +958,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can this.invalidateAndRefresh(true); CoreEvents.trigger(AddonModAssignProvider.GRADED_EVENT, { - assignmentId: this.assign!.id, + assignmentId: this.assign.id, submissionId: this.submitId, userId: this.currentUserId, }, this.siteId); @@ -941,21 +983,21 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can this.isGrading = true; // Make sure outcomes is an array. - this.gradeInfo.outcomes = this.gradeInfo.outcomes || []; + const gradeInfo = this.gradeInfo; + gradeInfo.outcomes = gradeInfo.outcomes || []; // Check if grading method is simple or not. - if (this.gradeInfo.advancedgrading && this.gradeInfo.advancedgrading[0] && - typeof this.gradeInfo.advancedgrading[0].method != 'undefined') { - this.grade.method = this.gradeInfo.advancedgrading[0].method || 'simple'; + if (gradeInfo.advancedgrading && gradeInfo.advancedgrading[0] && gradeInfo.advancedgrading[0].method !== undefined) { + this.grade.method = gradeInfo.advancedgrading[0].method || 'simple'; } else { this.grade.method = 'simple'; } this.canSaveGrades = this.grade.method == 'simple'; // Grades can be saved if simple grading. - if (this.gradeInfo.scale) { + if (gradeInfo.scale) { this.grade.scale = - CoreUtils.makeMenuFromList(this.gradeInfo.scale, Translate.instant('core.nograde')); + CoreUtils.makeMenuFromList(gradeInfo.scale, Translate.instant('core.nograde')); } else { // Format the grade. this.grade.grade = CoreUtils.formatFloat(this.grade.grade); @@ -966,8 +1008,8 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } // Treat outcomes. - if (this.gradeInfo.outcomes && AddonModAssign.isOutcomesEditEnabled()) { - this.gradeInfo.outcomes.forEach((outcome) => { + if (gradeInfo.outcomes) { + gradeInfo.outcomes.forEach((outcome) => { if (outcome.scale) { outcome.options = CoreUtils.makeMenuFromList( @@ -981,15 +1023,15 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } // Get grade items. - const grades = - await CoreGradesHelper.getGradeModuleItems(this.courseId, this.moduleId, this.submitId); + const grades = await CoreGradesHelper.getGradeModuleItems(this.courseId, this.moduleId, this.submitId); const outcomes: AddonModAssignGradeOutcome[] = []; grades.forEach((grade: CoreGradesFormattedItem) => { if (!grade.outcomeid && !grade.scaleid) { - const gradeFormatted = grade.gradeformatted || ''; + // Clean HTML tags, grade can contain an icon. + const gradeFormatted = CoreTextUtils.cleanTags(grade.gradeformatted || ''); // Not using outcomes or scale, get the numeric grade. if (this.grade.scale) { this.grade.gradebookGrade = CoreUtils.formatFloat( @@ -1007,7 +1049,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } else if (grade.outcomeid) { // Only show outcomes with info on it, outcomeid could be null if outcomes are disabled on site. - this.gradeInfo!.outcomes && this.gradeInfo!.outcomes.forEach((outcome) => { + gradeInfo.outcomes?.forEach((outcome) => { if (outcome.id == String(grade.outcomeid)) { outcome.selected = grade.gradeformatted; outcome.modified = grade.gradedategraded; @@ -1020,38 +1062,42 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can outcomes.push(outcome); } }); - this.gradeInfo!.disabled = grade.gradeislocked || grade.gradeisoverridden; + gradeInfo.disabled = grade.gradeislocked || grade.gradeisoverridden; } }); - this.gradeInfo.outcomes = outcomes; + gradeInfo.outcomes = outcomes; } /** * Treat the last attempt. * * @param submissionStatus Response of get submission status. + * @param lastAttempt Last attempt (if any). * @param promises List where to add the promises. */ - protected treatLastAttempt(submissionStatus: AddonModAssignGetSubmissionStatusWSResponse): Promise[] { + protected treatLastAttempt( + submissionStatus: AddonModAssignGetSubmissionStatusWSResponse, + lastAttempt?: AddonModAssignSubmissionAttemptFormatted, + ): Promise[] { const promises: Promise[] =[]; - if (!submissionStatus.lastattempt) { + if (!lastAttempt || !this.assign) { return []; } - const submissionStatementMissing = !!this.assign!.requiresubmissionstatement && - typeof this.assign!.submissionstatement == 'undefined'; + const submissionStatementMissing = !!this.assign.requiresubmissionstatement && + this.assign.submissionstatement === undefined; - this.canSubmit = !this.isSubmittedForGrading && !this.submittedOffline && (submissionStatus.lastattempt.cansubmit || - (this.hasOffline && AddonModAssign.canSubmitOffline(this.assign!, submissionStatus))); + this.canSubmit = !this.isSubmittedForGrading && !this.submittedOffline && (lastAttempt.cansubmit || + (this.hasOffline && AddonModAssign.canSubmitOffline(this.assign, submissionStatus))); - this.canEdit = !this.isSubmittedForGrading && submissionStatus.lastattempt.canedit && - (!this.submittedOffline || !this.assign!.submissiondrafts); + this.canEdit = !this.isSubmittedForGrading && lastAttempt.canedit && + (!this.submittedOffline || !this.assign.submissiondrafts); // Get submission statement if needed. - if (this.assign!.requiresubmissionstatement && this.assign!.submissiondrafts && this.submitId == this.currentUserId) { - this.submissionStatement = this.assign!.submissionstatement; + if (this.assign.requiresubmissionstatement && this.assign.submissiondrafts && this.submitId == this.currentUserId) { + this.submissionStatement = this.assign.submissionstatement; this.acceptStatement = false; } else { this.submissionStatement = undefined; @@ -1059,26 +1105,26 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } // Show error if submission statement should be shown but it couldn't be retrieved. - this.showErrorStatementEdit = submissionStatementMissing && !this.assign!.submissiondrafts && + this.showErrorStatementEdit = submissionStatementMissing && !this.assign.submissiondrafts && this.submitId == this.currentUserId; - this.showErrorStatementSubmit = submissionStatementMissing && !!this.assign!.submissiondrafts; + this.showErrorStatementSubmit = submissionStatementMissing && !!this.assign.submissiondrafts; - this.userSubmission = AddonModAssign.getSubmissionObjectFromAttempt(this.assign!, submissionStatus.lastattempt); + this.userSubmission = AddonModAssign.getSubmissionObjectFromAttempt(this.assign, lastAttempt); - if (this.assign!.attemptreopenmethod != this.attemptReopenMethodNone && this.userSubmission) { + if (this.assign.attemptreopenmethod != this.attemptReopenMethodNone && this.userSubmission) { this.currentAttempt = this.userSubmission.attemptnumber + 1; } this.setStatusNameAndClass(submissionStatus); - if (this.assign!.teamsubmission) { - if (submissionStatus.lastattempt.submissiongroup) { + if (this.assign.teamsubmission) { + if (lastAttempt.submissiongroup) { // Get the name of the group. - promises.push(CoreGroups.getActivityAllowedGroups(this.assign!.cmid).then((result) => { - const group = result.groups.find((group) => group.id == submissionStatus.lastattempt!.submissiongroup); + promises.push(CoreGroups.getActivityAllowedGroups(this.assign.cmid).then((result) => { + const group = result.groups.find((group) => group.id === lastAttempt.submissiongroup); if (group) { - this.lastAttempt!.submissiongroupname = group.name; + lastAttempt.submissiongroupname = group.name; } return; @@ -1088,19 +1134,10 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can // Get the members that need to submit. if (this.userSubmission && this.userSubmission.status != this.statusNew && - submissionStatus.lastattempt.submissiongroupmemberswhoneedtosubmit + lastAttempt.submissiongroupmemberswhoneedtosubmit ) { - submissionStatus.lastattempt.submissiongroupmemberswhoneedtosubmit.forEach((member) => { - if (this.blindMarking) { - // Users not blinded! (Moodle < 3.1.1, 3.2). - promises.push(AddonModAssign.getAssignmentUserMappings(this.assign!.id, member, { - cmId: this.moduleId, - }).then((blindId) => { - this.membersToSubmitBlind.push(blindId); - - return; - })); - } else { + lastAttempt.submissiongroupmemberswhoneedtosubmit.forEach((member) => { + if (!this.blindMarking) { promises.push(CoreUser.getProfile(member, this.courseId).then((profile) => { this.membersToSubmit.push(profile); @@ -1112,23 +1149,20 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can } // Get grading text and color. - this.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId( - submissionStatus.lastattempt.gradingstatus, - ); - this.gradingColor = AddonModAssign.getSubmissionGradingStatusColor(submissionStatus.lastattempt.gradingstatus); + this.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId(lastAttempt.gradingstatus); + this.gradingColor = AddonModAssign.getSubmissionGradingStatusColor(lastAttempt.gradingstatus); // Get the submission plugins. if (this.userSubmission) { - if (!this.assign!.teamsubmission || - !submissionStatus.lastattempt.submissiongroup || - !this.assign!.preventsubmissionnotingroup + if (!this.assign.teamsubmission || + !lastAttempt.submissiongroup || + !this.assign.preventsubmissionnotingroup ) { - if (this.previousAttempt && this.previousAttempt.submission!.plugins && - this.userSubmission.status == this.statusReopened) { + if (this.previousAttempt?.submission?.plugins && this.userSubmission.status === this.statusReopened) { // Get latest attempt if available. - this.submissionPlugins = this.previousAttempt.submission!.plugins; + this.submissionPlugins = this.previousAttempt.submission.plugins; } else { - this.submissionPlugins = this.userSubmission.plugins!; + this.submissionPlugins = this.userSubmission.plugins || []; } } } @@ -1146,7 +1180,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can return; } - const syncId = AddonModAssignSync.getGradeSyncId(this.assign!.id, this.submitId); + const syncId = AddonModAssignSync.getGradeSyncId(this.assign.id, this.submitId); if (block) { CoreSync.blockOperation(AddonModAssignProvider.COMPONENT, syncId); @@ -1161,10 +1195,18 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can * @param tab The tab that was selected. */ tabSelected(tab: CoreTabComponent): void { + this.selectedTab = tab.id; // Block sync when selecting grade tab, unblock when leaving it. this.setGradeSyncBlocked(tab.id === 'grade'); } + /** + * Function called when the time is up. + */ + timeUp(): void { + this.timeLimitFinished = true; + } + /** * Component being destroyed. */ @@ -1195,7 +1237,7 @@ type AddonModAssignSubmissionGrade = { grade?: number | string; gradebookGrade?: string; modified?: number; - gradingStatus?: string; + gradingStatus?: AddonModAssignGradingStates; addAttempt: boolean; applyToAll: boolean; scale?: CoreMenuItem[]; diff --git a/src/addons/mod/assign/feedback/comments/comments.module.ts b/src/addons/mod/assign/feedback/comments/comments.module.ts index 388efd827..d1be02007 100644 --- a/src/addons/mod/assign/feedback/comments/comments.module.ts +++ b/src/addons/mod/assign/feedback/comments/comments.module.ts @@ -31,8 +31,7 @@ import { AddonModAssignFeedbackDelegate } from '../../services/feedback-delegate { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { AddonModAssignFeedbackDelegate.registerHandler(AddonModAssignFeedbackCommentsHandler.instance); }, }, diff --git a/src/addons/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html b/src/addons/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html index b56fbcdd8..e30f369a0 100644 --- a/src/addons/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html +++ b/src/addons/mod/assign/feedback/comments/component/addon-mod-assign-feedback-comments.html @@ -3,16 +3,14 @@

{{ plugin.name }}

- +

- +
@@ -25,9 +23,8 @@ {{ plugin.name }} - + diff --git a/src/addons/mod/assign/feedback/comments/services/handler.ts b/src/addons/mod/assign/feedback/comments/services/handler.ts index 1b288988c..02a8bc342 100644 --- a/src/addons/mod/assign/feedback/comments/services/handler.ts +++ b/src/addons/mod/assign/feedback/comments/services/handler.ts @@ -69,7 +69,7 @@ export class AddonModAssignFeedbackCommentsHandlerService implements AddonModAss */ discardDraft(assignId: number, userId: number, siteId?: string): void { const id = this.getDraftId(assignId, userId, siteId); - if (typeof this.drafts[id] != 'undefined') { + if (this.drafts[id] !== undefined) { delete this.drafts[id]; } } @@ -95,7 +95,7 @@ export class AddonModAssignFeedbackCommentsHandlerService implements AddonModAss getDraft(assignId: number, userId: number, siteId?: string): AddonModAssignFeedbackCommentsDraftData | undefined { const id = this.getDraftId(assignId, userId, siteId); - if (typeof this.drafts[id] != 'undefined') { + if (this.drafts[id] !== undefined) { return this.drafts[id]; } } @@ -164,7 +164,7 @@ export class AddonModAssignFeedbackCommentsHandlerService implements AddonModAss const initialText = AddonModAssign.getSubmissionPluginText(plugin); const newText = AddonModAssignFeedbackCommentsHandler.getTextFromInputData(plugin, inputData); - if (typeof newText == 'undefined') { + if (newText === undefined) { return false; } diff --git a/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html b/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html index d6f66aad3..d50b9ae85 100644 --- a/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html +++ b/src/addons/mod/assign/feedback/editpdf/component/addon-mod-assign-feedback-editpdf.html @@ -3,8 +3,7 @@

{{plugin.name}}

- +
diff --git a/src/addons/mod/assign/feedback/editpdf/editpdf.module.ts b/src/addons/mod/assign/feedback/editpdf/editpdf.module.ts index d9c5dcb31..670975e8f 100644 --- a/src/addons/mod/assign/feedback/editpdf/editpdf.module.ts +++ b/src/addons/mod/assign/feedback/editpdf/editpdf.module.ts @@ -29,8 +29,7 @@ import { AddonModAssignFeedbackDelegate } from '../../services/feedback-delegate { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { AddonModAssignFeedbackDelegate.registerHandler(AddonModAssignFeedbackEditPdfHandler.instance); }, }, diff --git a/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html b/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html index d6f66aad3..d50b9ae85 100644 --- a/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html +++ b/src/addons/mod/assign/feedback/file/component/addon-mod-assign-feedback-file.html @@ -3,8 +3,7 @@

{{plugin.name}}

- +
diff --git a/src/addons/mod/assign/feedback/file/file.module.ts b/src/addons/mod/assign/feedback/file/file.module.ts index 021ce1149..b1dca6200 100644 --- a/src/addons/mod/assign/feedback/file/file.module.ts +++ b/src/addons/mod/assign/feedback/file/file.module.ts @@ -29,8 +29,7 @@ import { AddonModAssignFeedbackDelegate } from '../../services/feedback-delegate { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { AddonModAssignFeedbackDelegate.registerHandler(AddonModAssignFeedbackFileHandler.instance); }, }, diff --git a/src/addons/mod/assign/lang.json b/src/addons/mod/assign/lang.json index 8eb6b6708..ef812a4d9 100644 --- a/src/addons/mod/assign/lang.json +++ b/src/addons/mod/assign/lang.json @@ -9,14 +9,18 @@ "allowsubmissionsfromdatesummary": "This assignment will accept submissions from {{$a}}", "applytoteam": "Apply grades and feedback to entire group", "assignmentisdue": "Assignment is due", + "assigntimeleft": "Time left", "attemptnumber": "Attempt number", "attemptreopenmethod": "Additional attempts", "attemptreopenmethod_manual": "Manually", "attemptreopenmethod_untilpass": "Automatically until pass", "attemptsettings": "Attempt settings", + "beginassignment": "Begin assignment", + "caneditsubmission": "You can submit/edit submission after time limit passed, but it will be marked as late.", "cannoteditduetostatementsubmission": "You can't add or edit a submission in the app because the submission statement could not be retrieved from the site.", "cannotgradefromapp": "Certain grading methods are not yet supported by the app and cannot be modified.", "cannotsubmitduetostatementsubmission": "You can't make a submission in the app because the submission statement could not be retrieved from the site.", + "confirmstart": "Your submission will have a time limit of {{$a}}. When you start, the timer will begin to count down and cannot be paused. You must finish your submission before it expires. Are you sure you wish to start now?", "confirmsubmission": "Are you sure you want to submit your work for grading? You will not be able to make any more changes.", "currentattempt": "This is attempt {{$a}}.", "currentattemptof": "This is attempt {{$a.attemptnumber}} ( {{$a.maxattempts}} attempts allowed ).", @@ -75,7 +79,7 @@ "numberofteamscountdescription": "There are {{count}} teams.", "numwords": "{{$a}} words", "outof": "{{$a.current}} out of {{$a.total}}", - "overdue": "Assignment is overdue by: {{$a}}", + "overdue": "Assignment is overdue by: {{$a}}", "submission": "Submission", "submissioneditable": "Student can edit this submission", "submissionnoteditable": "Student cannot edit this submission", @@ -94,7 +98,10 @@ "submitassignment_help": "Once this assignment is submitted you will not be able to make any more changes.", "submittedearly": "Assignment was submitted {{$a}} early", "submittedlate": "Assignment was submitted {{$a}} late", + "submittedovertime": "Assignment was submitted {{$a}} over the time limit", + "submittedundertime": "Assignment was submitted {{$a}} under the time limit", "syncblockedusercomponent": "user grade", + "timelimit": "Time limit", "timemodified": "Last modified", "timeremaining": "Time remaining", "ungroupedusers": "The setting 'Require group to make submission' is enabled and some users are either not a member of any group, or are a member of more than one group, so are unable to make submissions.", @@ -105,4 +112,4 @@ "warningsubmissiongrademodified": "The submission grade was modified on the site.", "warningsubmissionmodified": "The user submission was modified on the site.", "wordlimit": "Word limit" -} \ No newline at end of file +} diff --git a/src/addons/mod/assign/pages/edit/edit.html b/src/addons/mod/assign/pages/edit/edit.html index 0b4882748..c1675bdb5 100644 --- a/src/addons/mod/assign/pages/edit/edit.html +++ b/src/addons/mod/assign/pages/edit/edit.html @@ -3,10 +3,12 @@ -

- - -

+ +

+ + +

+
{{ 'core.save' | translate }} @@ -18,6 +20,25 @@ + + + + + + + + + + + + + + + +
diff --git a/src/addons/mod/assign/pages/edit/edit.scss b/src/addons/mod/assign/pages/edit/edit.scss new file mode 100644 index 000000000..de79e53ed --- /dev/null +++ b/src/addons/mod/assign/pages/edit/edit.scss @@ -0,0 +1,17 @@ +:host ::ng-deep { + core-timer { + display: block; + + .core-timer { + &.core-timer-under-300 { + background-color: var(--danger-tint); + color: var(--danger-shade); + } + + &.core-timer-under-900 { + background-color: var(--warning-tint); + color: var(--warning-shade); + } + } + } +} diff --git a/src/addons/mod/assign/pages/edit/edit.ts b/src/addons/mod/assign/pages/edit/edit.ts index 98884b13e..a1a29932e 100644 --- a/src/addons/mod/assign/pages/edit/edit.ts +++ b/src/addons/mod/assign/pages/edit/edit.ts @@ -32,10 +32,13 @@ import { AddonModAssignSubmissionStatusOptions, AddonModAssignGetSubmissionStatusWSResponse, AddonModAssignSavePluginData, + AddonModAssignSubmissionStatusValues, } from '../../services/assign'; import { AddonModAssignHelper } from '../../services/assign-helper'; import { AddonModAssignOffline } from '../../services/assign-offline'; import { AddonModAssignSync } from '../../services/assign-sync'; +import { CoreUtils } from '@services/utils/utils'; +import { CoreWSExternalFile } from '@services/ws'; /** * Page that allows adding or editing an assigment submission. @@ -43,6 +46,7 @@ import { AddonModAssignSync } from '../../services/assign-sync'; @Component({ selector: 'page-addon-mod-assign-edit', templateUrl: 'edit.html', + styleUrls: ['edit.scss'], }) export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { @@ -57,6 +61,10 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { submissionStatement?: string; // The submission statement. submissionStatementAccepted = false; // Whether submission statement is accepted. loaded = false; // Whether data has been loaded. + timeLimitEndTime = 0; // If time limit is enabled, the end time for the timer. + activityInstructions?: string; // Activity instructions. + introAttachments?: CoreWSExternalFile[]; // Intro attachments. + component = AddonModAssignProvider.COMPONENT; protected userId: number; // User doing the submission. protected isBlind = false; // Whether blind is used. @@ -65,6 +73,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { protected hasOffline = false; // Whether the assignment has offline data. protected isDestroyed = false; // Whether the component has been destroyed. protected forceLeave = false; // To allow leaving the page without checking for changes. + protected timeUpToast?: HTMLIonToastElement; constructor( protected route: ActivatedRoute, @@ -78,9 +87,17 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { * Component being initialized. */ ngOnInit(): void { - this.moduleId = CoreNavigator.getRouteNumberParam('cmId')!; - this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; - this.isBlind = !!CoreNavigator.getRouteNumberParam('blindId'); + try { + this.moduleId = CoreNavigator.getRequiredRouteNumberParam('cmId'); + this.courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + this.isBlind = !!CoreNavigator.getRouteNumberParam('blindId'); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } this.fetchAssignment().finally(() => { this.loaded = true; @@ -170,6 +187,22 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { throw new CoreError(Translate.instant('core.nopermissions', { $a: this.editText })); } + submissionStatus = await this.startSubmissionIfNeeded(submissionStatus, options); + + if (submissionStatus.assignmentdata?.activity) { + // There are activity instructions. Make sure to display it with filters applied. + const filteredSubmissionStatus = options.filter ? + submissionStatus : + await AddonModAssign.getSubmissionStatus(this.assign.id, { + ...options, + filter: true, + }); + + this.activityInstructions = filteredSubmissionStatus.assignmentdata?.activity; + } + + this.introAttachments = submissionStatus.assignmentdata?.attachments?.intro ?? this.assign.introattachments; + this.allowOffline = true; // If offline isn't allowed we shouldn't have reached this point. // Only show submission statement if we are editing our own submission. if (this.assign.requiresubmissionstatement && !this.assign.submissiondrafts && this.userId == currentUserId) { @@ -178,6 +211,12 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { this.submissionStatement = undefined; } + if (this.assign.timelimit && this.userSubmission?.timestarted) { + this.timeLimitEndTime = AddonModAssignHelper.calculateEndTime(this.assign, this.userSubmission); + } else { + this.timeLimitEndTime = 0; + } + try { // Check if there's any offline data for this submission. const offlineData = await AddonModAssignOffline.getSubmission(this.assign.id, this.userId); @@ -195,6 +234,45 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { } } + /** + * Start the submission if needed. + * + * @param submissionStatus Current submission status. + * @param options Options. + * @return Promise resolved with the new submission status if it changed, original submission status otherwise. + */ + protected async startSubmissionIfNeeded( + submissionStatus: AddonModAssignGetSubmissionStatusWSResponse, + options: AddonModAssignSubmissionStatusOptions, + ): Promise { + if (!this.assign || !this.assign.timelimit) { + // Submission only needs to be started if there's a timelimit. + return submissionStatus; + } + + if (this.userSubmission && this.userSubmission.status !== AddonModAssignSubmissionStatusValues.NEW && + this.userSubmission.status !== AddonModAssignSubmissionStatusValues.REOPENED) { + // There is an ongoing submission, no need to start it. + return submissionStatus; + } + + await AddonModAssign.startSubmission(this.assign.id); + + CoreEvents.trigger(AddonModAssignProvider.STARTED_EVENT, { + assignmentId: this.assign.id, + }, CoreSites.getCurrentSiteId()); + + // Submission started, update the submission status. + const newSubmissionStatus = await AddonModAssign.getSubmissionStatus(this.assign.id, { + ...options, + readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, // Make sure not to use cache. + }); + + this.userSubmission = AddonModAssign.getSubmissionObjectFromAttempt(this.assign, newSubmissionStatus.lastattempt); + + return newSubmissionStatus; + } + /** * Get the input data. * @@ -247,7 +325,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { this.hasOffline, ); } catch (error) { - if (this.allowOffline && !this.saveOffline) { + if (this.allowOffline && !this.saveOffline && !CoreUtils.isWebServiceError(error)) { // Cannot submit in online, prepare for offline usage. this.saveOffline = true; @@ -383,11 +461,24 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave { } } + /** + * Function called when the time is up. + */ + async timeUp(): Promise { + this.timeUpToast = await CoreDomUtils.showToastWithOptions({ + message: Translate.instant('addon.mod_assign.caneditsubmission'), + duration: 0, + buttons: [Translate.instant('core.dismiss')], + cssClass: 'core-danger-toast', + }); + } + /** * Component being destroyed. */ ngOnDestroy(): void { this.isDestroyed = true; + this.timeUpToast?.dismiss(); // Unblock the assignment. if (this.assign) { diff --git a/src/addons/mod/assign/pages/index/index.html b/src/addons/mod/assign/pages/index/index.html index 8e1a710bc..2d3f9be93 100644 --- a/src/addons/mod/assign/pages/index/index.html +++ b/src/addons/mod/assign/pages/index/index.html @@ -1,20 +1,22 @@ - + -

- - -

+ +

+ + +

+
- - + + diff --git a/src/addons/mod/assign/pages/submission-list/submission-list.html b/src/addons/mod/assign/pages/submission-list/submission-list.html index 9f2ef968f..a88073d1c 100644 --- a/src/addons/mod/assign/pages/submission-list/submission-list.html +++ b/src/addons/mod/assign/pages/submission-list/submission-list.html @@ -3,10 +3,12 @@ -

- - -

+ +

+ + +

+
@@ -14,23 +16,17 @@ - + - - - - + - - - {{ 'core.groupsseparate' | translate }} + + + {{'core.groupsseparate' | translate }} + {{'core.groupsvisible' | translate }} - - {{ 'core.groupsvisible' | translate }} - - {{groupOpt.name}} @@ -48,7 +44,9 @@ {{ 'addon.mod_assign.hiddenuser' | translate }}{{submission.blindid}}

- {{submission.groupname}} + + {{submission.groupname}} + {{ 'addon.mod_assign.noteam' | translate }} @@ -61,25 +59,24 @@ {{ 'addon.mod_assign.defaultteam' | translate }}

- - {{ submission.statusTranslated }} - - - {{ submission.gradingStatusTranslationId | translate }} - +

+ + {{ submission.statusTranslated }} + +

+

+ + {{ submission.gradingStatusTranslationId | translate }} + +

- - - - - {{ 'addon.mod_assign.notallparticipantsareshown' | translate }} - -
+ + +
diff --git a/src/addons/mod/assign/pages/submission-list/submission-list.page.ts b/src/addons/mod/assign/pages/submission-list/submission-list.page.ts index 911bbbba0..9ac31e50e 100644 --- a/src/addons/mod/assign/pages/submission-list/submission-list.page.ts +++ b/src/addons/mod/assign/pages/submission-list/submission-list.page.ts @@ -13,29 +13,24 @@ // limitations under the License. import { Component, OnDestroy, AfterViewInit, ViewChild } from '@angular/core'; -import { Params } from '@angular/router'; -import { CorePageItemsListManager } from '@classes/page-items-list-manager'; +import { CoreListItemsManager } from '@classes/items-management/list-items-manager'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { IonRefresher } from '@ionic/angular'; -import { CoreGroupInfo, CoreGroups } from '@services/groups'; +import { CoreGroupInfo } from '@services/groups'; import { CoreNavigator } from '@services/navigator'; import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; -import { CoreUtils } from '@services/utils/utils'; import { Translate } from '@singletons'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { - AddonModAssignAssign, - AddonModAssignSubmission, - AddonModAssignProvider, - AddonModAssign, - AddonModAssignGrade, -} from '../../services/assign'; -import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../../services/assign-helper'; -import { AddonModAssignOffline } from '../../services/assign-offline'; + AddonModAssignListFilterName, + AddonModAssignSubmissionForList, + AddonModAssignSubmissionsSource, +} from '../../classes/submissions-source'; +import { AddonModAssignAssign, AddonModAssignProvider } from '../../services/assign'; import { AddonModAssignSyncProvider, - AddonModAssignSync, AddonModAssignManualSyncData, AddonModAssignAutoSyncData, } from '../../services/assign-sync'; @@ -51,48 +46,26 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; - title = ''; // Title to display. - assign?: AddonModAssignAssign; // Assignment. - submissions: AddonModAssignSubmissionListManager; // List of submissions - loaded = false; // Whether data has been loaded. - haveAllParticipants = true; // Whether all participants have been loaded. - groupId = 0; // Group ID to show. - courseId!: number; // Course ID the assignment belongs to. - moduleId!: number; // Module ID the submission belongs to. + title = ''; + submissions!: CoreListItemsManager; // List of submissions - groupInfo: CoreGroupInfo = { - groups: [], - separateGroups: false, - visibleGroups: false, - defaultGroupId: 0, - }; - - protected selectedStatus?: string; // The status to see. protected gradedObserver: CoreEventObserver; // Observer to refresh data when a grade changes. protected syncObserver: CoreEventObserver; // Observer to refresh data when the async is synchronized. - protected submissionsData: { canviewsubmissions: boolean; submissions?: AddonModAssignSubmission[] } = { - canviewsubmissions: false, - }; + protected sourceUnsubscribe?: () => void; constructor() { - this.submissions = new AddonModAssignSubmissionListManager(AddonModAssignSubmissionListPage); - // Update data if some grade changes. this.gradedObserver = CoreEvents.on( AddonModAssignProvider.GRADED_EVENT, (data) => { if ( - this.loaded && - this.assign && - data.assignmentId == this.assign.id && + this.submissions.loaded && + this.submissions.getSource().assign && + data.assignmentId == this.submissions.getSource().assign?.id && data.userId == CoreSites.getCurrentSiteUserId() ) { // Grade changed, refresh the data. - this.loaded = false; - - this.refreshAllData(true).finally(() => { - this.loaded = true; - }); + this.refreshAllData(true); } }, CoreSites.getCurrentSiteId(), @@ -103,40 +76,85 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro this.syncObserver = CoreEvents.onMultiple( events, (data) => { - if (!this.loaded || ('context' in data && data.context == 'submission-list')) { + if (!this.submissions.loaded || ('context' in data && data.context == 'submission-list')) { return; } - this.loaded = false; - - this.refreshAllData(false).finally(() => { - this.loaded = true; - }); + this.refreshAllData(false); }, CoreSites.getCurrentSiteId(), ); + + try { + const moduleId = CoreNavigator.getRequiredRouteNumberParam('cmId'); + const courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + const groupId = CoreNavigator.getRouteNumberParam('groupId') || 0; + const selectedStatus = CoreNavigator.getRouteParam('status'); + const submissionsSource = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonModAssignSubmissionsSource, + [courseId, moduleId, selectedStatus], + ); + + submissionsSource.groupId = groupId; + this.sourceUnsubscribe = submissionsSource.addListener({ + onItemsUpdated: () => { + this.title = this.submissions.getSource().assign?.name || this.title; + }, + }); + + this.submissions = new CoreListItemsManager( + submissionsSource, + AddonModAssignSubmissionListPage, + ); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } + } + + get assign(): AddonModAssignAssign | undefined { + return this.submissions.getSource().assign; + } + + get groupInfo(): CoreGroupInfo { + return this.submissions.getSource().groupInfo; + } + + get moduleId(): number { + return this.submissions.getSource().MODULE_ID; + } + + get courseId(): number { + return this.submissions.getSource().COURSE_ID; + } + + get groupId(): number { + return this.submissions.getSource().groupId; + } + + set groupId(value: number) { + this.submissions.getSource().groupId = value; } /** - * Component being initialized. + * @inheritdoc */ ngAfterViewInit(): void { - this.moduleId = CoreNavigator.getRouteNumberParam('cmId')!; - this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; - this.groupId = CoreNavigator.getRouteNumberParam('groupId') || 0; - this.selectedStatus = CoreNavigator.getRouteParam('status'); + const selectedStatus = this.submissions.getSource().SELECTED_STATUS; + this.title = Translate.instant( + selectedStatus + ? ( + selectedStatus === AddonModAssignListFilterName.NEED_GRADING + ? 'addon.mod_assign.numberofsubmissionsneedgrading' + : `addon.mod_assign.submissionstatus_${selectedStatus}` + ) + : 'addon.mod_assign.numberofparticipants', + ); - if (this.selectedStatus) { - if (this.selectedStatus == AddonModAssignProvider.NEED_GRADING) { - this.title = Translate.instant('addon.mod_assign.numberofsubmissionsneedgrading'); - } else { - this.title = Translate.instant('addon.mod_assign.submissionstatus_' + this.selectedStatus); - } - } else { - this.title = Translate.instant('addon.mod_assign.numberofparticipants'); - } this.fetchAssignment(true).finally(() => { - this.loaded = true; this.submissions.start(this.splitView); }); } @@ -149,158 +167,12 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro */ protected async fetchAssignment(sync = false): Promise { try { - // Get assignment data. - this.assign = await AddonModAssign.getAssignment(this.courseId, this.moduleId); - - this.title = this.assign.name || this.title; - - if (sync) { - try { - // Try to synchronize data. - const result = await AddonModAssignSync.syncAssign(this.assign.id); - - if (result && result.updated) { - CoreEvents.trigger( - AddonModAssignSyncProvider.MANUAL_SYNCED, - { - assignId: this.assign.id, - warnings: result.warnings, - gradesBlocked: result.gradesBlocked, - context: 'submission-list', - }, - CoreSites.getCurrentSiteId(), - ); - } - } catch (error) { - // Ignore errors, probably user is offline or sync is blocked. - } - } - - // Get assignment submissions. - this.submissionsData = await AddonModAssign.getSubmissions(this.assign.id, { cmId: this.assign.cmid }); - - if (!this.submissionsData.canviewsubmissions) { - // User shouldn't be able to reach here. - throw new Error('Cannot view submissions.'); - } - - // Check if groupmode is enabled to avoid showing wrong numbers. - this.groupInfo = await CoreGroups.getActivityGroupInfo(this.assign.cmid, false); - - await this.setGroup(CoreGroups.validateGroupId(this.groupId, this.groupInfo)); + await this.submissions.getSource().loadAssignment(sync); } catch (error) { CoreDomUtils.showErrorModalDefault(error, 'Error getting assigment data.'); } } - /** - * Set group to see the summary. - * - * @param groupId Group ID. - * @return Resolved when done. - */ - async setGroup(groupId: number): Promise { - this.groupId = groupId; - - this.haveAllParticipants = true; - - if (!CoreSites.getCurrentSite()?.wsAvailable('mod_assign_list_participants')) { - // Submissions are not displayed in Moodle 3.1 without the local plugin, see MOBILE-2968. - this.haveAllParticipants = false; - this.submissions.resetItems(); - - return; - } - - // Fetch submissions and grades. - const submissions = - await AddonModAssignHelper.getSubmissionsUserData( - this.assign!, - this.submissionsData.submissions, - this.groupId, - ); - // Get assignment grades only if workflow is not enabled to check grading date. - const grades = !this.assign!.markingworkflow - ? await AddonModAssign.getAssignmentGrades(this.assign!.id, { cmId: this.assign!.cmid }) - : []; - - // Filter the submissions to get only the ones with the right status and add some extra data. - const getNeedGrading = this.selectedStatus == AddonModAssignProvider.NEED_GRADING; - const searchStatus = getNeedGrading ? AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED : this.selectedStatus; - - const promises: Promise[] = []; - const showSubmissions: AddonModAssignSubmissionForList[] = []; - - submissions.forEach((submission: AddonModAssignSubmissionForList) => { - if (!searchStatus || searchStatus == submission.status) { - promises.push( - CoreUtils.ignoreErrors( - AddonModAssignOffline.getSubmissionGrade(this.assign!.id, submission.userid), - ).then(async (data) => { - if (getNeedGrading) { - // Only show the submissions that need to be graded. - const add = await AddonModAssign.needsSubmissionToBeGraded(submission, this.assign!.id); - - if (!add) { - return; - } - } - - // Load offline grades. - const notSynced = !!data && submission.timemodified < data.timemodified; - - if (submission.gradingstatus == 'graded' && !this.assign!.markingworkflow) { - // Get the last grade of the submission. - const grade = grades - .filter((grade) => grade.userid == submission.userid) - .reduce( - (a, b) => (a && a.timemodified > b.timemodified ? a : b), - undefined, - ); - - if (grade && grade.timemodified < submission.timemodified) { - submission.gradingstatus = AddonModAssignProvider.GRADED_FOLLOWUP_SUBMIT; - } - } - submission.statusColor = AddonModAssign.getSubmissionStatusColor(submission.status); - submission.gradingColor = AddonModAssign.getSubmissionGradingStatusColor( - submission.gradingstatus, - ); - - // Show submission status if not submitted for grading. - if (submission.statusColor != 'success' || !submission.gradingstatus) { - submission.statusTranslated = Translate.instant( - 'addon.mod_assign.submissionstatus_' + submission.status, - ); - } else { - submission.statusTranslated = ''; - } - - if (notSynced) { - submission.gradingStatusTranslationId = 'addon.mod_assign.gradenotsynced'; - submission.gradingColor = ''; - } else if (submission.statusColor != 'danger' || submission.gradingColor != 'danger') { - // Show grading status if one of the statuses is not done. - submission.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId( - submission.gradingstatus, - ); - } else { - submission.gradingStatusTranslationId = ''; - } - - showSubmissions.push(submission); - - return; - }), - ); - } - }); - - await Promise.all(promises); - - this.submissions.setItems(showSubmissions); - } - /** * Refresh all the data. * @@ -308,18 +180,8 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro * @return Promise resolved when done. */ protected async refreshAllData(sync?: boolean): Promise { - const promises: Promise[] = []; - - promises.push(AddonModAssign.invalidateAssignmentData(this.courseId)); - if (this.assign) { - promises.push(AddonModAssign.invalidateAllSubmissionData(this.assign.id)); - promises.push(AddonModAssign.invalidateAssignmentUserMappingsData(this.assign.id)); - promises.push(AddonModAssign.invalidateAssignmentGradesData(this.assign.id)); - promises.push(AddonModAssign.invalidateListParticipantsData(this.assign.id)); - } - try { - await Promise.all(promises); + await this.submissions.getSource().invalidateCache(); } finally { this.fetchAssignment(sync); } @@ -336,6 +198,13 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro }); } + /** + * Reload submissions list. + */ + async reloadSubmissions(): Promise { + await this.submissions.reload(); + } + /** * Component being destroyed. */ @@ -343,43 +212,7 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro this.gradedObserver?.off(); this.syncObserver?.off(); this.submissions.destroy(); + this.sourceUnsubscribe && this.sourceUnsubscribe(); } } - -/** - * Helper class to manage submissions. - */ -class AddonModAssignSubmissionListManager extends CorePageItemsListManager { - - constructor(pageComponent: unknown) { - super(pageComponent); - } - - /** - * @inheritdoc - */ - protected getItemPath(submission: AddonModAssignSubmissionForList): string { - return String(submission.submitid); - } - - /** - * @inheritdoc - */ - protected getItemQueryParams(submission: AddonModAssignSubmissionForList): Params { - return { - blindId: submission.blindid, - }; - } - -} - -/** - * Calculated data for an assign submission. - */ -type AddonModAssignSubmissionForList = AddonModAssignSubmissionFormatted & { - statusColor?: string; // Calculated in the app. Color of the submission status. - gradingColor?: string; // Calculated in the app. Color of the submission grading status. - statusTranslated?: string; // Calculated in the app. Translated text of the submission status. - gradingStatusTranslationId?: string; // Calculated in the app. Key of the text of the submission grading status. -}; diff --git a/src/addons/mod/assign/pages/submission-review/submission-review.html b/src/addons/mod/assign/pages/submission-review/submission-review.html index fa5c6d28a..370086cb0 100644 --- a/src/addons/mod/assign/pages/submission-review/submission-review.html +++ b/src/addons/mod/assign/pages/submission-review/submission-review.html @@ -3,10 +3,12 @@ -

- - -

+ +

+ + +

+
@@ -17,13 +19,12 @@
- - + - + diff --git a/src/addons/mod/assign/pages/submission-review/submission-review.ts b/src/addons/mod/assign/pages/submission-review/submission-review.ts index 831dea8b8..f722bdef6 100644 --- a/src/addons/mod/assign/pages/submission-review/submission-review.ts +++ b/src/addons/mod/assign/pages/submission-review/submission-review.ts @@ -12,14 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; +import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; +import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker'; +import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager'; import { CoreCourse } from '@features/course/services/course'; import { CanLeave } from '@guards/can-leave'; import { IonRefresher } from '@ionic/angular'; import { CoreNavigator } from '@services/navigator'; import { CoreScreen } from '@services/screen'; import { CoreDomUtils } from '@services/utils/dom'; +import { AddonModAssignListFilterName, AddonModAssignSubmissionsSource } from '../../classes/submissions-source'; import { AddonModAssignSubmissionComponent } from '../../components/submission/submission'; import { AddonModAssign, AddonModAssignAssign } from '../../services/assign'; @@ -30,11 +33,12 @@ import { AddonModAssign, AddonModAssignAssign } from '../../services/assign'; selector: 'page-addon-mod-assign-submission-review', templateUrl: 'submission-review.html', }) -export class AddonModAssignSubmissionReviewPage implements OnInit, CanLeave { +export class AddonModAssignSubmissionReviewPage implements OnInit, OnDestroy, CanLeave { @ViewChild(AddonModAssignSubmissionComponent) submissionComponent?: AddonModAssignSubmissionComponent; title = ''; // Title to display. + submissions?: AddonModAssignSubmissionSwipeItemsManager; moduleId!: number; // Module ID the submission belongs to. courseId!: number; // Course ID the assignment belongs to. submitId!: number; // User that did the submission. @@ -46,19 +50,38 @@ export class AddonModAssignSubmissionReviewPage implements OnInit, CanLeave { protected blindMarking = false; // Whether it uses blind marking. protected forceLeave = false; // To allow leaving the page without checking for changes. - constructor( - protected route: ActivatedRoute, - ) { } + constructor(protected route: ActivatedRoute) { } /** - * Component being initialized. + * @inheritdoc */ ngOnInit(): void { this.route.queryParams.subscribe((params) => { - this.moduleId = CoreNavigator.getRouteNumberParam('cmId')!; - this.courseId = CoreNavigator.getRouteNumberParam('courseId')!; - this.submitId = CoreNavigator.getRouteNumberParam('submitId') || 0; - this.blindId = CoreNavigator.getRouteNumberParam('blindId', { params }); + try { + this.moduleId = CoreNavigator.getRequiredRouteNumberParam('cmId'); + this.courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + this.submitId = CoreNavigator.getRouteNumberParam('submitId') || 0; + this.blindId = CoreNavigator.getRouteNumberParam('blindId', { params }); + const groupId = CoreNavigator.getRequiredRouteNumberParam('groupId'); + const selectedStatus = CoreNavigator.getRouteParam('selectedStatus'); + const submissionsSource = CoreRoutedItemsManagerSourcesTracker.getOrCreateSource( + AddonModAssignSubmissionsSource, + [this.courseId, this.moduleId, selectedStatus], + ); + + this.submissions?.destroy(); + + submissionsSource.groupId = groupId; + this.submissions = new AddonModAssignSubmissionSwipeItemsManager(submissionsSource); + + this.submissions.start(); + } catch (error) { + CoreDomUtils.showErrorModal(error); + + CoreNavigator.back(); + + return; + } this.fetchSubmission().finally(() => { this.loaded = true; @@ -66,6 +89,13 @@ export class AddonModAssignSubmissionReviewPage implements OnInit, CanLeave { }); } + /** + * @inheritdoc + */ + ngOnDestroy(): void { + this.submissions?.destroy(); + } + /** * Check if we can leave the page or not. * @@ -112,7 +142,7 @@ export class AddonModAssignSubmissionReviewPage implements OnInit, CanLeave { // Grades can be saved if simple grading. if (gradeInfo.advancedgrading && gradeInfo.advancedgrading[0] && - typeof gradeInfo.advancedgrading[0].method != 'undefined') { + gradeInfo.advancedgrading[0].method !== undefined) { const method = gradeInfo.advancedgrading[0].method || 'simple'; this.canSaveGrades = method == 'simple'; @@ -182,3 +212,17 @@ export class AddonModAssignSubmissionReviewPage implements OnInit, CanLeave { } } + +/** + * Helper to manage swiping within a collection of submissions. + */ +class AddonModAssignSubmissionSwipeItemsManager extends CoreSwipeNavigationItemsManager { + + /** + * @inheritdoc + */ + protected getSelectedItemPathFromRoute(route: ActivatedRouteSnapshot): string | null { + return route.params.submitId; + } + +} diff --git a/src/addons/mod/assign/services/assign-helper.ts b/src/addons/mod/assign/services/assign-helper.ts index 196d7607f..01e48419b 100644 --- a/src/addons/mod/assign/services/assign-helper.ts +++ b/src/addons/mod/assign/services/assign-helper.ts @@ -15,7 +15,7 @@ import { Injectable } from '@angular/core'; import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; -import { FileEntry } from '@ionic-native/file/ngx'; +import { FileEntry, DirectoryEntry } from '@ionic-native/file/ngx'; import { AddonModAssignProvider, AddonModAssignAssign, @@ -25,6 +25,7 @@ import { AddonModAssign, AddonModAssignPlugin, AddonModAssignSavePluginData, + AddonModAssignSubmissionStatusValues, } from './assign'; import { AddonModAssignOffline } from './assign-offline'; import { CoreUtils } from '@services/utils/utils'; @@ -43,6 +44,25 @@ import { CoreFileEntry } from '@services/file-helper'; @Injectable({ providedIn: 'root' }) export class AddonModAssignHelperProvider { + /** + * Calculate the end time (timestamp) for an assign and submission. + * + * @param assign Assign instance. + * @param submission Submission. + * @return End time. + */ + calculateEndTime(assign: AddonModAssignAssign, submission?: AddonModAssignSubmissionFormatted): number { + const timeDue = (submission?.timestarted || 0) + (assign.timelimit || 0); + + if (assign.duedate) { + return Math.min(timeDue, assign.duedate); + } else if (assign.cutoffdate) { + return Math.min(timeDue, assign.cutoffdate); + } + + return timeDue; + } + /** * Check if a submission can be edited in offline. * @@ -55,8 +75,8 @@ export class AddonModAssignHelperProvider { return false; } - if (submission.status == AddonModAssignProvider.SUBMISSION_STATUS_NEW || - submission.status == AddonModAssignProvider.SUBMISSION_STATUS_REOPENED) { + if (submission.status == AddonModAssignSubmissionStatusValues.NEW || + submission.status == AddonModAssignSubmissionStatusValues.REOPENED) { // It's a new submission, allow creating it in offline. return true; } @@ -149,7 +169,7 @@ export class AddonModAssignHelperProvider { attemptnumber: 0, timecreated: 0, timemodified: 0, - status: '', + status: AddonModAssignSubmissionStatusValues.NEW, groupid: 0, }; } @@ -398,70 +418,41 @@ export class AddonModAssignHelperProvider { groupId?: number, options: CoreSitesCommonWSOptions = {}, ): Promise { - // Create new options including all existing ones. - const modOptions: CoreCourseCommonModWSOptions = { cmId: assign.cmid, ...options }; + const participants = await this.getParticipants(assign, groupId, options); - const parts = await this.getParticipants(assign, groupId, options); + const blind = !!assign.blindmarking && !assign.revealidentities; + const teamsubmission = !!assign.teamsubmission; - const blind = assign.blindmarking && !assign.revealidentities; - const promises: Promise[] = []; - const result: AddonModAssignSubmissionFormatted[] = []; - const participants: {[id: number]: AddonModAssignParticipant} = CoreUtils.arrayToObject(parts, 'id'); + if (teamsubmission) { + // On team submission discard user submissions. + submissions = submissions.filter((submission) => submission.userid == 0); + } - submissions.forEach((submission) => { - submission.submitid = submission.userid && submission.userid > 0 ? submission.userid : submission.blindid; - if (typeof submission.submitid == 'undefined' || submission.submitid <= 0) { - return; - } + return participants.map((participant) => { + const groupId = participant.groupid ?? + (participant.groups && participant.groups[0] ? participant.groups[0].id : 0); - const participant = participants[submission.submitid]; - if (!participant) { - // Avoid permission denied error. Participant not found on list. - return; - } - - delete participants[submission.submitid]; - - if (!blind) { - submission.userfullname = participant.fullname; - submission.userprofileimageurl = participant.profileimageurl; - } - - submission.manyGroups = !!participant.groups && participant.groups.length > 1; - submission.noGroups = !!participant.groups && participant.groups.length == 0; - if (participant.groupname) { - submission.groupid = participant.groupid!; - submission.groupname = participant.groupname; - } - - let promise = Promise.resolve(); - if (submission.userid && submission.userid > 0 && blind) { - // Blind but not blinded! (Moodle < 3.1.1, 3.2). - delete submission.userid; - - promise = AddonModAssign.getAssignmentUserMappings(assign.id, submission.submitid, modOptions) - .then((blindId) => { - submission.blindid = blindId; - - return; - }); - } - - promises.push(promise.then(() => { - // Add to the list. - if (submission.userfullname || submission.blindid) { - result.push(submission); + const foundSubmission = submissions.find((submission) => { + if (teamsubmission) { + return submission.groupid == groupId; } - return; - })); - }); + const submitId = submission.userid && submission.userid > 0 ? submission.userid : submission.blindid; - await Promise.all(promises); + return participant.id == submitId; + }); - // Create a submission for each participant left in the list (the participants already treated were removed). - CoreUtils.objectToArray(participants).forEach((participant: AddonModAssignParticipant) => { - const submission = this.createEmptySubmission(); + let submission: AddonModAssignSubmissionFormatted | undefined; + if (!foundSubmission) { + // Create submission if none. + submission = this.createEmptySubmission(); + submission.groupid = groupId; + submission.status = participant.submitted + ? AddonModAssignSubmissionStatusValues.SUBMITTED + : AddonModAssignSubmissionStatusValues.NEW; + } else { + submission = Object.assign({}, foundSubmission); + } submission.submitid = participant.id; @@ -476,16 +467,13 @@ export class AddonModAssignHelperProvider { submission.manyGroups = !!participant.groups && participant.groups.length > 1; submission.noGroups = !!participant.groups && participant.groups.length == 0; if (participant.groupname) { - submission.groupid = participant.groupid!; + submission.groupid = participant.groupid; submission.groupname = participant.groupname; } - submission.status = participant.submitted ? AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED : - AddonModAssignProvider.SUBMISSION_STATUS_NEW; - result.push(submission); + return submission; + }); - - return result; } /** @@ -737,8 +725,9 @@ export const AddonModAssignHelper = makeSingleton(AddonModAssignHelperProvider); * Assign submission with some calculated data. */ export type AddonModAssignSubmissionFormatted = - Omit & { + Omit & { userid?: number; // Student id. + groupid?: number; // Group id. blindid?: number; // Calculated in the app. Blindid of the user that did the submission. submitid?: number; // Calculated in the app. Userid or blindid of the user that did the submission. userfullname?: string; // Calculated in the app. Full name of the user that did the submission. diff --git a/src/addons/mod/assign/services/assign-offline.ts b/src/addons/mod/assign/services/assign-offline.ts index a2024439b..d57ce3d2e 100644 --- a/src/addons/mod/assign/services/assign-offline.ts +++ b/src/addons/mod/assign/services/assign-offline.ts @@ -20,6 +20,7 @@ import { CoreSites } from '@services/sites'; import { CoreTextUtils } from '@services/utils/text'; import { CoreTimeUtils } from '@services/utils/time'; import { makeSingleton } from '@singletons'; +import { CoreText } from '@singletons/text'; import { AddonModAssignOutcomes, AddonModAssignSavePluginData } from './assign'; import { AddonModAssignSubmissionsDBRecord, @@ -236,7 +237,7 @@ export class AddonModAssignOfflineProvider { const siteFolderPath = CoreFile.getSiteFolder(site.getId()); const submissionFolderPath = 'offlineassign/' + assignId + '/' + userId; - return CoreTextUtils.concatenatePaths(siteFolderPath, submissionFolderPath); + return CoreText.concatenatePaths(siteFolderPath, submissionFolderPath); } /** @@ -276,7 +277,7 @@ export class AddonModAssignOfflineProvider { async getSubmissionPluginFolder(assignId: number, pluginName: string, userId?: number, siteId?: string): Promise { const folderPath = await this.getSubmissionFolder(assignId, userId, siteId); - return CoreTextUtils.concatenatePaths(folderPath, pluginName); + return CoreText.concatenatePaths(folderPath, pluginName); } /** diff --git a/src/addons/mod/assign/services/assign-sync.ts b/src/addons/mod/assign/services/assign-sync.ts index 162165dee..99420a9a1 100644 --- a/src/addons/mod/assign/services/assign-sync.ts +++ b/src/addons/mod/assign/services/assign-sync.ts @@ -37,7 +37,7 @@ import { CoreCourseLogHelper } from '@features/course/services/log-helper'; import { CoreUtils } from '@services/utils/utils'; import { CoreApp } from '@services/app'; import { CoreNetworkError } from '@classes/errors/network-error'; -import { CoreGradesFormattedItem, CoreGradesFormattedRow, CoreGradesHelper } from '@features/grades/services/grades-helper'; +import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper'; import { AddonModAssignSubmissionDelegate } from './submission-delegate'; import { AddonModAssignFeedbackDelegate } from './feedback-delegate'; @@ -163,9 +163,10 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid async syncAssign(assignId: number, siteId?: string): Promise { siteId = siteId || CoreSites.getCurrentSiteId(); - if (this.isSyncing(assignId, siteId)) { + const currentSyncPromise = this.getOngoingSync(assignId, siteId); + if (currentSyncPromise) { // There's already a sync ongoing for this assign, return the promise. - return this.getOngoingSync(assignId, siteId)!; + return currentSyncPromise; } // Verify that assign isn't blocked. @@ -457,21 +458,20 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid } // If grade has been modified from gradebook, do not use offline. - const grades: CoreGradesFormattedItem[] | CoreGradesFormattedRow[] = - await CoreGradesHelper.getGradeModuleItems(courseId, assign.cmid, userId, undefined, siteId, true); + const grades = await CoreGradesHelper.getGradeModuleItems(courseId, assign.cmid, userId, undefined, siteId, true); const gradeInfo = await CoreCourse.getModuleBasicGradeInfo(assign.cmid, siteId); // Override offline grade and outcomes based on the gradebook data. - grades.forEach((grade: CoreGradesFormattedItem | CoreGradesFormattedRow) => { - if ('gradedategraded' in grade && (grade.gradedategraded || 0) >= offlineData.timemodified) { + grades.forEach((grade: CoreGradesFormattedItem) => { + if ((grade.gradedategraded || 0) >= offlineData.timemodified) { if (!grade.outcomeid && !grade.scaleid) { if (gradeInfo && gradeInfo.scale) { offlineData.grade = this.getSelectedScaleId(gradeInfo.scale, grade.grade || ''); } else { offlineData.grade = parseFloat(grade.grade || ''); } - } else if (gradeInfo && grade.outcomeid && AddonModAssign.isOutcomesEditEnabled() && gradeInfo.outcomes) { + } else if (gradeInfo && grade.outcomeid && gradeInfo.outcomes) { gradeInfo.outcomes.forEach((outcome, index) => { if (outcome.scale && grade.itemnumber == index) { offlineData.outcomes[grade.itemnumber] = this.getSelectedScaleId( diff --git a/src/addons/mod/assign/services/assign.ts b/src/addons/mod/assign/services/assign.ts index 8ebc66911..d24c61664 100644 --- a/src/addons/mod/assign/services/assign.ts +++ b/src/addons/mod/assign/services/assign.ts @@ -17,7 +17,7 @@ import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@ import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreInterceptor } from '@classes/interceptor'; import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; -import { makeSingleton } from '@singletons'; +import { makeSingleton, Translate } from '@singletons'; import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; import { CoreTextUtils } from '@services/utils/text'; import { CoreGrades } from '@features/grades/services/grades'; @@ -34,6 +34,7 @@ import { CoreWSError } from '@classes/errors/wserror'; import { AddonModAssignAutoSyncData, AddonModAssignManualSyncData, AddonModAssignSyncProvider } from './assign-sync'; import { CoreFormFields } from '@singletons/form'; import { CoreFileHelper } from '@services/file-helper'; +import { CoreIonicColorNames } from '@singletons/colors'; const ROOT_CACHE_KEY = 'mmaModAssign:'; @@ -48,6 +49,7 @@ declare module '@singletons/events' { [AddonModAssignProvider.SUBMISSION_SAVED_EVENT]: AddonModAssignSubmissionSavedEventData; [AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT]: AddonModAssignSubmittedForGradingEventData; [AddonModAssignProvider.GRADED_EVENT]: AddonModAssignGradedEventData; + [AddonModAssignProvider.STARTED_EVENT]: AddonModAssignStartedEventData; [AddonModAssignSyncProvider.MANUAL_SYNCED]: AddonModAssignManualSyncData; [AddonModAssignSyncProvider.AUTO_SYNCED]: AddonModAssignAutoSyncData; } @@ -64,23 +66,6 @@ export class AddonModAssignProvider { static readonly SUBMISSION_COMPONENT = 'mmaModAssignSubmission'; static readonly UNLIMITED_ATTEMPTS = -1; - // Submission status. - static readonly SUBMISSION_STATUS_NEW = 'new'; - static readonly SUBMISSION_STATUS_REOPENED = 'reopened'; - static readonly SUBMISSION_STATUS_DRAFT = 'draft'; - static readonly SUBMISSION_STATUS_SUBMITTED = 'submitted'; - - // "Re-open" methods (to retry the assign). - static readonly ATTEMPT_REOPEN_METHOD_NONE = 'none'; - static readonly ATTEMPT_REOPEN_METHOD_MANUAL = 'manual'; - - // Grading status. - static readonly GRADING_STATUS_GRADED = 'graded'; - static readonly GRADING_STATUS_NOT_GRADED = 'notgraded'; - static readonly MARKING_WORKFLOW_STATE_RELEASED = 'released'; - static readonly NEED_GRADING = 'needgrading'; - static readonly GRADED_FOLLOWUP_SUBMIT = 'gradedfollowupsubmit'; - // Group submissions warnings. static readonly WARN_GROUPS_REQUIRED = 'warnrequired'; static readonly WARN_GROUPS_OPTIONAL = 'warnoptional'; @@ -89,8 +74,7 @@ export class AddonModAssignProvider { static readonly SUBMISSION_SAVED_EVENT = 'addon_mod_assign_submission_saved'; static readonly SUBMITTED_FOR_GRADING_EVENT = 'addon_mod_assign_submitted_for_grading'; static readonly GRADED_EVENT = 'addon_mod_assign_graded'; - - protected gradingOfflineEnabled: {[siteId: string]: boolean} = {}; + static readonly STARTED_EVENT = 'addon_mod_assign_started'; /** * Check if the user can submit in offline. This should only be used if submissionStatus.lastattempt.cansubmit cannot @@ -110,17 +94,17 @@ export class AddonModAssignProvider { const teamSubmission = submissionStatus.lastattempt?.teamsubmission; if (teamSubmission) { - if (teamSubmission.status === AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED) { + if (teamSubmission.status === AddonModAssignSubmissionStatusValues.SUBMITTED) { // The assignment submission has been completed. return false; - } else if (userSubmission && userSubmission.status === AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED) { + } else if (userSubmission && userSubmission.status === AddonModAssignSubmissionStatusValues.SUBMITTED) { // The user has already clicked the submit button on the team submission. return false; } else if (assign.preventsubmissionnotingroup && !submissionStatus.lastattempt?.submissiongroup) { return false; } } else if (userSubmission) { - if (userSubmission.status === AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED) { + if (userSubmission.status === AddonModAssignSubmissionStatusValues.SUBMITTED) { // The assignment submission has been completed. return false; } @@ -151,7 +135,7 @@ export class AddonModAssignProvider { return { isBlind: !userId ? false : !!isBlind, - groupId: site.isVersionGreaterEqualThan('3.5') ? groupId || 0 : 0, + groupId: groupId || 0, userId: userId || site.getUserId(), }; } @@ -218,7 +202,7 @@ export class AddonModAssignProvider { } } - throw new CoreError('Assignment not found'); + throw new CoreError(Translate.instant('core.course.modulenotfound')); } /** @@ -349,17 +333,17 @@ export class AddonModAssignProvider { * @param status Grading status name * @return The color name. */ - getSubmissionGradingStatusColor(status?: string): string { + getSubmissionGradingStatusColor(status?: AddonModAssignGradingStates): CoreIonicColorNames { if (!status) { - return ''; + return CoreIonicColorNames.NONE; } - if (status == AddonModAssignProvider.GRADING_STATUS_GRADED || - status == AddonModAssignProvider.MARKING_WORKFLOW_STATE_RELEASED) { - return 'success'; + if (status == AddonModAssignGradingStates.GRADED + || status == AddonModAssignGradingStates.MARKING_WORKFLOW_STATE_RELEASED) { + return CoreIonicColorNames.SUCCESS; } - return 'danger'; + return CoreIonicColorNames.DANGER; } /** @@ -368,13 +352,14 @@ export class AddonModAssignProvider { * @param status Grading Status name * @return The status translation identifier. */ - getSubmissionGradingStatusTranslationId(status?: string): string | undefined { + getSubmissionGradingStatusTranslationId(status?: AddonModAssignGradingStates): string | undefined { if (!status) { return; } - if (status == AddonModAssignProvider.GRADING_STATUS_GRADED || status == AddonModAssignProvider.GRADING_STATUS_NOT_GRADED - || status == AddonModAssignProvider.GRADED_FOLLOWUP_SUBMIT) { + if (status == AddonModAssignGradingStates.GRADED + || status == AddonModAssignGradingStates.NOT_GRADED + || status == AddonModAssignGradingStates.GRADED_FOLLOWUP_SUBMIT) { return 'addon.mod_assign.' + status; } @@ -606,20 +591,20 @@ export class AddonModAssignProvider { * @param status Status name * @return The color name. */ - getSubmissionStatusColor(status: string): string { + getSubmissionStatusColor(status: AddonModAssignSubmissionStatusValues): CoreIonicColorNames { switch (status) { - case 'submitted': - return 'success'; - case 'draft': - return 'info'; - case 'new': - case 'noattempt': - case 'noonlinesubmissions': - case 'nosubmission': - case 'gradedfollowupsubmit': - return 'danger'; + case AddonModAssignSubmissionStatusValues.SUBMITTED: + return CoreIonicColorNames.SUCCESS; + case AddonModAssignSubmissionStatusValues.DRAFT: + return CoreIonicColorNames.INFO; + case AddonModAssignSubmissionStatusValues.NEW: + case AddonModAssignSubmissionStatusValues.NO_ATTEMPT: + case AddonModAssignSubmissionStatusValues.NO_ONLINE_SUBMISSIONS: + case AddonModAssignSubmissionStatusValues.NO_SUBMISSION: + case AddonModAssignSubmissionStatusValues.GRADED_FOLLOWUP_SUBMIT: + return CoreIonicColorNames.DANGER; default: - return 'light'; + return CoreIonicColorNames.LIGHT; } } @@ -662,10 +647,6 @@ export class AddonModAssignProvider { groupId = groupId || 0; const site = await CoreSites.getSite(options.siteId); - if (!site.wsAvailable('mod_assign_list_participants')) { - // Silently fail if is not available. (needs Moodle version >= 3.2) - throw new CoreError('mod_assign_list_participants WS is only available 3.2 onwards'); - } const params: AddonModAssignListParticipantsWSParams = { assignid: assignId, @@ -836,47 +817,6 @@ export class AddonModAssignProvider { await site.invalidateWsCacheForKeyStartingWith(this.listParticipantsPrefixCacheKey(assignId)); } - /** - * Convenience function to check if grading offline is enabled. - * - * @param siteId Site ID. If not defined, current site. - * @return Promise resolved with boolean: whether grading offline is enabled. - */ - protected async isGradingOfflineEnabled(siteId?: string): Promise { - siteId = siteId || CoreSites.getCurrentSiteId(); - - if (typeof this.gradingOfflineEnabled[siteId] != 'undefined') { - return this.gradingOfflineEnabled[siteId]; - } - - this.gradingOfflineEnabled[siteId] = await CoreGrades.isGradeItemsAvailable(siteId); - - return this.gradingOfflineEnabled[siteId]; - } - - /** - * Outcomes only can be edited if mod_assign_submit_grading_form is available. - * - * @param siteId Site ID. If not defined, current site. - * @return Promise resolved with true if outcomes edit is enabled, rejected or resolved with false otherwise. - * @since 3.2 - */ - async isOutcomesEditEnabled(siteId?: string): Promise { - const site = await CoreSites.getSite(siteId); - - return site.wsAvailable('mod_assign_submit_grading_form'); - } - - /** - * Check if assignments plugin is enabled in a certain site. - * - * @param siteId Site ID. If not defined, current site. - * @return Whether the plugin is enabled. - */ - isPluginEnabled(): boolean { - return true; - } - /** * Check if a submission is open. This function is based on Moodle's submissions_open. * @@ -925,7 +865,7 @@ export class AddonModAssignProvider { } if (submission) { - if (assign.submissiondrafts && submission.status == AddonModAssignProvider.SUBMISSION_STATUS_SUBMITTED) { + if (assign.submissiondrafts && submission.status == AddonModAssignSubmissionStatusValues.SUBMITTED) { // Drafts are tracked and the student has submitted the assignment. return false; } @@ -1017,13 +957,17 @@ export class AddonModAssignProvider { * @return Promise resolved with boolean: whether it needs to be graded or not. */ async needsSubmissionToBeGraded(submission: AddonModAssignSubmissionFormatted, assignId: number): Promise { + if (submission.status != AddonModAssignSubmissionStatusValues.SUBMITTED) { + return false; + } + if (!submission.gradingstatus) { // This should not happen, but it's better to show rather than not showing any of the submissions. return true; } - if (submission.gradingstatus != AddonModAssignProvider.GRADING_STATUS_GRADED && - submission.gradingstatus != AddonModAssignProvider.MARKING_WORKFLOW_STATE_RELEASED) { + if (submission.gradingstatus != AddonModAssignGradingStates.GRADED && + submission.gradingstatus != AddonModAssignGradingStates.MARKING_WORKFLOW_STATE_RELEASED) { // Not graded. return true; } @@ -1127,6 +1071,35 @@ export class AddonModAssignProvider { } } + /** + * Start a submission. + * + * @param assignId Assign ID. + * @param siteId Site ID. If not defined, use current site. + * @return Promise resolved when done. + */ + async startSubmission(assignId: number, siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + const params: AddonModAssignStartSubmissionWSParams = { + assignid: assignId, + }; + + const result = await site.write('mod_assign_start_submission', params); + + if (!result.warnings?.length) { + return; + } + + // Ignore some warnings. + const warning = result.warnings.find(warning => + warning.warningcode !== 'timelimitnotenabled' && warning.warningcode !== 'opensubmissionexists'); + + if (warning) { + throw new CoreWSError(warning); + } + } + /** * Submit the current user assignment for grading. * @@ -1261,25 +1234,6 @@ export class AddonModAssignProvider { return false; }; - // Grading offline is only allowed if WS of grade items is enabled to avoid inconsistency. - const enabled = await this.isGradingOfflineEnabled(siteId); - if (!enabled) { - await this.submitGradingFormOnline( - assignId, - userId, - grade, - attemptNumber, - addAttempt, - workflowState, - applyToAll, - outcomes, - pluginData, - siteId, - ); - - return true; - } - if (!CoreApp.isOnline()) { // App is offline, store the action. return storeOffline(); @@ -1345,58 +1299,35 @@ export class AddonModAssignProvider { const site = await CoreSites.getSite(siteId); userId = userId || site.getUserId(); - if (site.wsAvailable('mod_assign_submit_grading_form')) { - // WS available @since 3.2. + const jsonData = { + grade, + attemptnumber: attemptNumber, + addattempt: addAttempt ? 1 : 0, + workflowstate: workflowState, + applytoall: applyToAll ? 1 : 0, + }; - const jsonData = { - grade, - attemptnumber: attemptNumber, - addattempt: addAttempt ? 1 : 0, - workflowstate: workflowState, - applytoall: applyToAll ? 1 : 0, - }; - - for (const index in outcomes) { - jsonData['outcome_' + index + '[' + userId + ']'] = outcomes[index]; - } - - for (const index in pluginData) { - jsonData[index] = pluginData[index]; - } - - const serialized = CoreInterceptor.serialize(jsonData, true); - const params: AddonModAssignSubmitGradingFormWSParams = { - assignmentid: assignId, - userid: userId, - jsonformdata: JSON.stringify(serialized), - }; - - const warnings = await site.write('mod_assign_submit_grading_form', params); - - if (warnings.length) { - // The WebService returned warnings, reject. - throw new CoreWSError(warnings[0]); - } - - return; + for (const index in outcomes) { + jsonData['outcome_' + index + '[' + userId + ']'] = outcomes[index]; } - // WS not available, fallback to save_grade. - const params: AddonModAssignSaveGradeWSParams = { + for (const index in pluginData) { + jsonData[index] = pluginData[index]; + } + + const serialized = CoreInterceptor.serialize(jsonData, true); + const params: AddonModAssignSubmitGradingFormWSParams = { assignmentid: assignId, userid: userId, - grade: grade, - attemptnumber: attemptNumber, - addattempt: addAttempt, - workflowstate: workflowState, - applytoall: applyToAll, - plugindata: pluginData, - }; - const preSets: CoreSiteWSPreSets = { - responseExpected: false, + jsonformdata: JSON.stringify(serialized), }; - await site.write('mod_assign_save_grade', params, preSets); + const warnings = await site.write('mod_assign_submit_grading_form', params); + + if (warnings.length) { + // The WebService returned warnings, reject. + throw new CoreWSError(warnings[0]); + } } } @@ -1431,26 +1362,31 @@ export type AddonModAssignAssign = { timemodified: number; // Last time assignment was modified. completionsubmit: number; // If enabled, set activity as complete following submission. cutoffdate: number; // Date after which submission is not accepted without an extension. - gradingduedate?: number; // @since 3.3. The expected date for marking the submissions. + gradingduedate?: number; // The expected date for marking the submissions. teamsubmission: number; // If enabled, students submit as a team. requireallteammemberssubmit: number; // If enabled, all team members must submit. teamsubmissiongroupingid: number; // The grouping id for the team submission groups. blindmarking: number; // If enabled, hide identities until reveal identities actioned. hidegrader?: number; // @since 3.7. If enabled, hide grader to student. revealidentities: number; // Show identities for a blind marking assignment. - attemptreopenmethod: string; // Method used to control opening new attempts. + attemptreopenmethod: AddonModAssignAttemptReopenMethodValues; // Method used to control opening new attempts. maxattempts: number; // Maximum number of attempts allowed. markingworkflow: number; // Enable marking workflow. markingallocation: number; // Enable marking allocation. requiresubmissionstatement: number; // Student must accept submission statement. - preventsubmissionnotingroup?: number; // @since 3.2. Prevent submission not in group. - submissionstatement?: string; // @since 3.2. Submission statement formatted. - submissionstatementformat?: number; // @since 3.2. Submissionstatement format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). + preventsubmissionnotingroup?: number; // Prevent submission not in group. + submissionstatement?: string; // Submission statement formatted. + submissionstatementformat?: number; // Submissionstatement format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). configs: AddonModAssignConfig[]; // Configuration settings. intro?: string; // Assignment intro, not allways returned because it deppends on the activity configuration. introformat?: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). - introfiles?: CoreWSExternalFile[]; // @since 3.2. + introfiles?: CoreWSExternalFile[]; introattachments?: CoreWSExternalFile[]; + activity?: string; // @since 4.0. Description of activity. + activityformat?: number; // @since 4.0. Format of activity. + activityattachments?: CoreWSExternalFile[]; // @since 4.0. Files from activity field. + timelimit?: number; // @since 4.0. Time limit to complete assigment. + submissionattachments?: number; // @since 4.0. Flag to only show files during submission. }; /** @@ -1489,12 +1425,13 @@ export type AddonModAssignSubmission = { attemptnumber: number; // Attempt number. timecreated: number; // Submission creation time. timemodified: number; // Submission last modified time. - status: string; // Submission status. + status: AddonModAssignSubmissionStatusValues; // Submission status. groupid: number; // Group id. assignment?: number; // Assignment id. latest?: number; // Latest attempt. plugins?: AddonModAssignPlugin[]; // Plugins. - gradingstatus?: string; // @since 3.2. Grading status. + gradingstatus?: AddonModAssignGradingStates; // Grading status. + timestarted?: number; // @since 4.0. Submission start time. }; /** @@ -1539,12 +1476,13 @@ export type AddonModAssignSubmissionAttempt = { locked: boolean; // Whether new submissions are locked. graded: boolean; // Whether the submission is graded. canedit: boolean; // Whether the user can edit the current submission. - caneditowner?: boolean; // @since 3.2. Whether the owner of the submission can edit it. + caneditowner?: boolean; // Whether the owner of the submission can edit it. cansubmit: boolean; // Whether the user can submit. extensionduedate: number; // Extension due date. blindmarking: boolean; // Whether blind marking is enabled. - gradingstatus: string; // Grading status. + gradingstatus: AddonModAssignGradingStates; // Grading status. usergroups: number[]; // User groups in the course. + timelimit?: number; // @since 4.0. Time limit for submission. }; /** @@ -1610,7 +1548,7 @@ export type AddonModAssignParticipant = { interests?: string; // User interests (separated by commas). firstaccess?: number; // First access to the site (0 if never). lastaccess?: number; // Last access to the site (0 if never). - suspended?: boolean; // @since 3.2. Suspend user account, either false to enable user login or true to disable it. + suspended?: boolean; // Suspend user account, either false to enable user login or true to disable it. description?: string; // User profile description. descriptionformat?: number; // Int format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). city?: string; // Home city of the user. @@ -1647,7 +1585,7 @@ export type AddonModAssignParticipant = { }[]; submitted: boolean; // Have they submitted their assignment. requiregrading: boolean; // Is their submission waiting for grading. - grantedextension?: boolean; // @since 3.3. Have they been granted an extension. + grantedextension?: boolean; // Have they been granted an extension. groupid?: number; // For group assignments this is the group id. groupname?: string; // For group assignments this is the group name. }; @@ -1704,6 +1642,14 @@ export type AddonModAssignGetSubmissionStatusWSResponse = { lastattempt?: AddonModAssignSubmissionAttempt; // Last attempt information. feedback?: AddonModAssignSubmissionFeedback; // Feedback for the last attempt. previousattempts?: AddonModAssignSubmissionPreviousAttempt[]; // List all the previous attempts did by the user. + assignmentdata?: { // @since 4.0. Extra information about assignment. + attachments?: { // Intro and activity attachments. + intro?: CoreWSExternalFile[]; // Intro attachments files. + activity?: CoreWSExternalFile[]; // Activity attachments files. + }; + activity?: string; // Text of activity. + activityformat?: number; // Format of activity. + }; warnings?: CoreWSExternalWarning[]; }; @@ -1816,42 +1762,22 @@ type AddonModAssignSubmitGradingFormWSParams = { }; /** - * Params of mod_assign_save_grade WS. + * Params of mod_assign_start_submission WS. + * + * @since 4.0 */ -type AddonModAssignSaveGradeWSParams = { - assignmentid: number; // The assignment id to operate on. - userid: number; // The student id to operate on. - grade: number; // The new grade for this user. Ignored if advanced grading used. - attemptnumber: number; // The attempt number (-1 means latest attempt). - addattempt: boolean; // Allow another attempt if the attempt reopen method is manual. - workflowstate: string; // The next marking workflow state. - applytoall: boolean; // If true, this grade will be applied to all members of the group (for group assignments). - plugindata?: AddonModAssignSavePluginData; // Plugin data. - advancedgradingdata?: { - guide?: { - criteria: { - criterionid: number; // Criterion id. - fillings?: { // Filling. - criterionid: number; // Criterion id. - levelid?: number; // Level id. - remark?: string; // Remark. - remarkformat?: number; // Remark format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). - score: number; // Maximum score. - }[]; - }[]; - }; // Items. - rubric?: { - criteria: { - criterionid: number; // Criterion id. - fillings?: { // Filling. - criterionid: number; // Criterion id. - levelid?: number; // Level id. - remark?: string; // Remark. - remarkformat?: number; // Remark format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). - }[]; - }[]; - }; // Items. - }; // Advanced grading data. +type AddonModAssignStartSubmissionWSParams = { + assignid: number; // Assignment instance id. +}; + +/** + * Data returned by mod_assign_start_submission WS. + * + * @since 4.0 + */ +export type AddonModAssignStartSubmissionWSResponse = { + submissionid: number; // New submission ID. + warnings?: CoreWSExternalWarning[]; }; /** @@ -1877,3 +1803,48 @@ export type AddonModAssignSubmissionSavedEventData = AddonModAssignSubmittedForG * Data sent by GRADED_EVENT event. */ export type AddonModAssignGradedEventData = AddonModAssignSubmittedForGradingEventData; + +/** + * Data sent by STARTED_EVENT event. + */ +export type AddonModAssignStartedEventData = { + assignmentId: number; +}; + +/** + * Submission status. + * Constants on LMS starting with ASSIGN_SUBMISSION_STATUS_ + */ +export enum AddonModAssignSubmissionStatusValues { + SUBMITTED = 'submitted', + DRAFT = 'draft', + NEW = 'new', + REOPENED = 'reopened', + // Added by App Statuses. + NO_ATTEMPT = 'noattempt', + NO_ONLINE_SUBMISSIONS = 'noonlinesubmissions', + NO_SUBMISSION = 'nosubmission', + GRADED_FOLLOWUP_SUBMIT = 'gradedfollowupsubmit', +}; + +/** + * Grading status. + * Constants on LMS starting with ASSIGN_GRADING_STATUS_ + */ +export enum AddonModAssignGradingStates { + GRADED = 'graded', + NOT_GRADED = 'notgraded', + // Added by App Statuses. + MARKING_WORKFLOW_STATE_RELEASED = 'released', // with ASSIGN_MARKING_WORKFLOW_STATE_RELEASED + GRADED_FOLLOWUP_SUBMIT = 'gradedfollowupsubmit', +}; + +/** + * Reopen attempt methods. + * Constants on LMS starting with ASSIGN_ATTEMPT_REOPEN_METHOD_ + */ +export enum AddonModAssignAttemptReopenMethodValues { + NONE = 'none', + MANUAL = 'manual', + UNTILPASS = 'untilpass', +}; diff --git a/src/addons/mod/assign/services/handlers/module.ts b/src/addons/mod/assign/services/handlers/module.ts index 8ef54dc73..bb8f569fd 100644 --- a/src/addons/mod/assign/services/handlers/module.ts +++ b/src/addons/mod/assign/services/handlers/module.ts @@ -12,26 +12,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { CoreConstants } from '@/core/constants'; +import { CoreConstants, ModPurpose } from '@/core/constants'; import { Injectable, Type } from '@angular/core'; -import { CoreCourseModuleHandler, CoreCourseModuleHandlerData } from '@features/course/services/module-delegate'; +import { CoreCourseModuleHandler } from '@features/course/services/module-delegate'; import { AddonModAssignIndexComponent } from '../../components/index'; import { makeSingleton } from '@singletons'; -import { CoreCourse, CoreCourseAnyModuleData } from '@features/course/services/course'; -import { CoreCourseModule } from '@features/course/services/course-helper'; -import { CoreNavigationOptions, CoreNavigator } from '@services/navigator'; -import { AddonModAssign } from '../assign'; +import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler'; /** * Handler to support assign modules. */ @Injectable({ providedIn: 'root' }) -export class AddonModAssignModuleHandlerService implements CoreCourseModuleHandler { +export class AddonModAssignModuleHandlerService extends CoreModuleHandlerBase implements CoreCourseModuleHandler { static readonly PAGE_NAME = 'mod_assign'; name = 'AddonModAssign'; modName = 'assign'; + protected pageName = AddonModAssignModuleHandlerService.PAGE_NAME; supportedFeatures = { [CoreConstants.FEATURE_GROUPS]: true, @@ -46,45 +44,11 @@ export class AddonModAssignModuleHandlerService implements CoreCourseModuleHandl [CoreConstants.FEATURE_ADVANCED_GRADING]: true, [CoreConstants.FEATURE_PLAGIARISM]: true, [CoreConstants.FEATURE_COMMENT]: true, + [CoreConstants.FEATURE_MOD_PURPOSE]: ModPurpose.MOD_PURPOSE_ASSESSMENT, }; /** - * Check if the handler is enabled on a site level. - * - * @return Whether or not the handler is enabled on a site level. - */ - async isEnabled(): Promise { - return AddonModAssign.isPluginEnabled(); - } - - /** - * Get the data required to display the module in the course contents view. - * - * @param module The module object. - * @return Data to render the module. - */ - getData(module: CoreCourseAnyModuleData): CoreCourseModuleHandlerData { - return { - icon: CoreCourse.getModuleIconSrc(this.modName, 'modicon' in module ? module.modicon : undefined), - title: module.name, - class: 'addon-mod_assign-handler', - showDownloadButton: true, - action(event: Event, module: CoreCourseModule, courseId: number, options?: CoreNavigationOptions): void { - options = options || {}; - options.params = options.params || {}; - Object.assign(options.params, { module }); - const routeParams = '/' + courseId + '/' + module.id; - - CoreNavigator.navigateToSitePath(AddonModAssignModuleHandlerService.PAGE_NAME + routeParams, options); - }, - }; - } - - /** - * Get the component to render the module. This is needed to support singleactivity course format. - * The component returned must implement CoreCourseModuleMainComponent. - * - * @return The component to use, undefined if not found. + * @inheritdoc */ async getMainComponent(): Promise | undefined> { return AddonModAssignIndexComponent; diff --git a/src/addons/mod/assign/services/handlers/prefetch.ts b/src/addons/mod/assign/services/handlers/prefetch.ts index 2c909584e..d44a3648a 100644 --- a/src/addons/mod/assign/services/handlers/prefetch.ts +++ b/src/addons/mod/assign/services/handlers/prefetch.ts @@ -28,13 +28,13 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/ import { CoreCourse, CoreCourseAnyModuleData, CoreCourseCommonModWSOptions } from '@features/course/services/course'; import { CoreWSFile } from '@services/ws'; import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../assign-helper'; -import { CoreCourseHelper } from '@features/course/services/course-helper'; import { CoreUtils } from '@services/utils/utils'; import { CoreFilepool } from '@services/filepool'; import { CoreGroups } from '@services/groups'; import { AddonModAssignSync, AddonModAssignSyncResult } from '../assign-sync'; import { CoreUser } from '@features/user/services/user'; import { CoreGradesHelper } from '@features/grades/services/grades-helper'; +import { CoreCourses } from '@features/courses/services/courses'; /** * Handler to prefetch assigns. @@ -87,9 +87,10 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref try { const assign = await AddonModAssign.getAssignment(courseId, module.id, { siteId }); - // Get intro files and attachments. + // Get intro files, attachments and activity files. let files: CoreWSFile[] = assign.introattachments || []; files = files.concat(this.getIntroFilesFromInstance(module, assign)); + files = files.concat(assign.activityattachments || []); // Now get the files in the submissions. const submissionData = await AddonModAssign.getSubmissions(assign.id, { cmId: module.id, siteId }); @@ -100,19 +101,26 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref await AddonModAssignHelper.getSubmissionsUserData(assign, submissionData.submissions, 0, { siteId }); // Get all the files in the submissions. - const promises = submissions.map((submission) => - this.getSubmissionFiles(assign, submission.submitid!, !!submission.blindid, siteId).then((submissionFiles) => { - files = files.concat(submissionFiles); + const promises = submissions.map(async (submission) => { + try { + const submissionFiles = await this.getSubmissionFiles( + assign, + submission.submitid!, + !!submission.blindid, + true, + siteId, + ); - return; - }).catch((error) => { + files = files.concat(submissionFiles); + } catch (error) { if (error && error.errorcode == 'nopermission') { // The user does not have persmission to view this submission, ignore it. return; } throw error; - })); + } + }); await Promise.all(promises); } else { @@ -120,7 +128,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref const userId = CoreSites.getCurrentSiteUserId(); const blindMarking = !!assign.blindmarking && !assign.revealidentities; - const submissionFiles = await this.getSubmissionFiles(assign, userId, blindMarking, siteId); + const submissionFiles = await this.getSubmissionFiles(assign, userId, blindMarking, false, siteId); files = files.concat(submissionFiles); } @@ -137,6 +145,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref * @param assign Assign. * @param submitId User ID of the submission to get. * @param blindMarking True if blind marking, false otherwise. + * @param canViewAllSubmissions Whether the user can view all submissions. * @param siteId Site ID. If not defined, current site. * @return Promise resolved with array of files. */ @@ -144,6 +153,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref assign: AddonModAssignAssign, submitId: number, blindMarking: boolean, + canViewAllSubmissions: boolean, siteId?: string, ): Promise { @@ -154,8 +164,15 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref }); const userSubmission = AddonModAssign.getSubmissionObjectFromAttempt(assign, submissionStatus.lastattempt); + // Get intro and activity files from the submission status if it's a student. + // It's ok if they were already obtained from the assignment instance, they won't be downloaded twice. + const files = canViewAllSubmissions ? + [] : + (submissionStatus.assignmentdata?.attachments?.intro || []) + .concat(submissionStatus.assignmentdata?.attachments?.activity || []); + if (!submissionStatus.lastattempt || !userSubmission) { - return []; + return files; } const promises: Promise[] = []; @@ -176,7 +193,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref const filesLists = await Promise.all(promises); - return [].concat.apply([], filesLists); + return files.concat.apply(files, filesLists); } /** @@ -201,15 +218,6 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref return CoreCourse.invalidateModule(module.id); } - /** - * Whether or not the handler is enabled on a site level. - * - * @return A boolean, or a promise resolved with a boolean, indicating if the handler is enabled. - */ - async isEnabled(): Promise { - return AddonModAssign.isPluginEnabled(); - } - /** * @inheritdoc */ @@ -251,7 +259,9 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref promises.push(this.prefetchSubmissions(assign, courseId, module.id, userId, siteId)); - promises.push(CoreCourseHelper.getModuleCourseIdByInstance(assign.id, 'assign', siteId)); + promises.push(CoreCourse.getModuleBasicInfoByInstance(assign.id, 'assign', { siteId })); + // Get course data, needed to determine upload max size if it's configured to be course limit. + promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId))); // Download intro files and attachments. Do not call getFiles because it'd call some WS twice. let files: CoreWSFile[] = assign.introattachments || []; @@ -260,7 +270,6 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref promises.push(CoreFilepool.addFilesToQueue(siteId, files, this.component, module.id)); await Promise.all(promises); - } /** @@ -388,10 +397,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref // Participiants already fetched, we don't need to ignore cache now. const participants = await AddonModAssignHelper.getParticipants(assign, group.id, { siteId }); - // Fail silently (Moodle < 3.2). - await CoreUtils.ignoreErrors( - CoreUser.prefetchUserAvatars(participants, 'profileimageurl', siteId), - ); + await CoreUser.prefetchUserAvatars(participants, 'profileimageurl', siteId); return; })); @@ -524,7 +530,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref * @return Promise resolved when done. */ sync(module: CoreCourseAnyModuleData, courseId: number, siteId?: string): Promise { - return AddonModAssignSync.syncAssign(module.instance!, siteId); + return AddonModAssignSync.syncAssign(module.instance, siteId); } } diff --git a/src/addons/mod/assign/services/handlers/push-click.ts b/src/addons/mod/assign/services/handlers/push-click.ts index 1973435e2..1b5714c8c 100644 --- a/src/addons/mod/assign/services/handlers/push-click.ts +++ b/src/addons/mod/assign/services/handlers/push-click.ts @@ -54,7 +54,10 @@ export class AddonModAssignPushClickHandlerService implements CorePushNotificati const moduleId = Number(contextUrlParams.id); await CoreUtils.ignoreErrors(AddonModAssign.invalidateContent(moduleId, courseId, notification.site)); - await CoreCourseHelper.navigateToModule(moduleId, notification.site, courseId); + await CoreCourseHelper.navigateToModule(moduleId, { + courseId, + siteId: notification.site, + }); } } diff --git a/src/addons/mod/assign/submission/comments/comments.module.ts b/src/addons/mod/assign/submission/comments/comments.module.ts index 361d3a96e..49de6435e 100644 --- a/src/addons/mod/assign/submission/comments/comments.module.ts +++ b/src/addons/mod/assign/submission/comments/comments.module.ts @@ -31,8 +31,7 @@ import { CoreCommentsComponentsModule } from '@features/comments/components/comp { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { AddonModAssignSubmissionDelegate.registerHandler(AddonModAssignSubmissionCommentsHandler.instance); }, }, diff --git a/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html b/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html index 882718fc8..157d9f527 100644 --- a/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html +++ b/src/addons/mod/assign/submission/comments/component/addon-mod-assign-submission-comments.html @@ -1,8 +1,8 @@

{{plugin.name}}

- +
diff --git a/src/addons/mod/assign/submission/comments/services/handler.ts b/src/addons/mod/assign/submission/comments/services/handler.ts index 54ea486f3..a14f9c7a3 100644 --- a/src/addons/mod/assign/submission/comments/services/handler.ts +++ b/src/addons/mod/assign/submission/comments/services/handler.ts @@ -16,7 +16,6 @@ import { AddonModAssignAssign, AddonModAssignSubmission, AddonModAssignPlugin } import { AddonModAssignSubmissionHandler } from '@addons/mod/assign/services/submission-delegate'; import { Injectable, Type } from '@angular/core'; import { CoreComments } from '@features/comments/services/comments'; -import { CoreUtils } from '@services/utils/utils'; import { makeSingleton } from '@singletons'; import { AddonModAssignSubmissionCommentsComponent } from '../component/comments'; @@ -87,18 +86,14 @@ export class AddonModAssignSubmissionCommentsHandlerService implements AddonModA plugin: AddonModAssignPlugin, siteId?: string, ): Promise { - - // Fail silently (Moodle < 3.1.1, 3.2) - await CoreUtils.ignoreErrors( - CoreComments.getComments( - 'module', - assign.cmid, - 'assignsubmission_comments', - submission.id, - 'submission_comments', - 0, - siteId, - ), + await CoreComments.getComments( + 'module', + assign.cmid, + 'assignsubmission_comments', + submission.id, + 'submission_comments', + 0, + siteId, ); } diff --git a/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html b/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html index 92517dd92..316e4df80 100644 --- a/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html +++ b/src/addons/mod/assign/submission/file/component/addon-mod-assign-submission-file.html @@ -2,7 +2,7 @@

{{ plugin.name }}

-
+
@@ -11,9 +11,11 @@
-

{{ plugin.name }}

+ +

{{ plugin.name }}

+
-
diff --git a/src/addons/mod/assign/submission/file/file.module.ts b/src/addons/mod/assign/submission/file/file.module.ts index ce4501efe..a71426556 100644 --- a/src/addons/mod/assign/submission/file/file.module.ts +++ b/src/addons/mod/assign/submission/file/file.module.ts @@ -29,8 +29,7 @@ import { AddonModAssignSubmissionDelegate } from '../../services/submission-dele { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { AddonModAssignSubmissionDelegate.registerHandler(AddonModAssignSubmissionFileHandler.instance); }, }, diff --git a/src/addons/mod/assign/submission/file/services/handler.ts b/src/addons/mod/assign/submission/file/services/handler.ts index f1b52ea2f..7c684ea89 100644 --- a/src/addons/mod/assign/submission/file/services/handler.ts +++ b/src/addons/mod/assign/submission/file/services/handler.ts @@ -187,7 +187,8 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig plugin: AddonModAssignPlugin, ): Promise { // Check if there's any change. - if (this.hasDataChanged(assign, submission, plugin)) { + const hasChanged = await this.hasDataChanged(assign, submission, plugin); + if (hasChanged) { const files = CoreFileSession.getFiles(AddonModAssignProvider.COMPONENT, assign.id); return CoreFileHelper.getTotalFilesSize(files); diff --git a/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html b/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html index 6660c6c4f..549976d19 100644 --- a/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html +++ b/src/addons/mod/assign/submission/onlinetext/component/addon-mod-assign-submission-onlinetext.html @@ -4,9 +4,8 @@

{{ plugin.name }}

{{ 'addon.mod_assign.numwords' | translate: {'$a': words} }}

- +

@@ -15,20 +14,22 @@
-

{{ plugin.name }}

+ +

{{ plugin.name }}

+
-

{{ 'addon.mod_assign.wordlimit' | translate }}

+

{{ 'addon.mod_assign.wordlimit' | translate }}

{{ 'core.numwords' | translate: {'$a': words + ' / ' + wordLimit} }}

{{ plugin.name }} - +
diff --git a/src/addons/mod/assign/submission/onlinetext/onlinetext.module.ts b/src/addons/mod/assign/submission/onlinetext/onlinetext.module.ts index a3d79b5c8..fd2fc8338 100644 --- a/src/addons/mod/assign/submission/onlinetext/onlinetext.module.ts +++ b/src/addons/mod/assign/submission/onlinetext/onlinetext.module.ts @@ -31,8 +31,7 @@ import { AddonModAssignSubmissionDelegate } from '../../services/submission-dele { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { AddonModAssignSubmissionDelegate.registerHandler(AddonModAssignSubmissionOnlineTextHandler.instance); }, }, diff --git a/src/addons/mod/assign/submission/onlinetext/services/handler.ts b/src/addons/mod/assign/submission/onlinetext/services/handler.ts index 56f86d63a..90c65eaaa 100644 --- a/src/addons/mod/assign/submission/onlinetext/services/handler.ts +++ b/src/addons/mod/assign/submission/onlinetext/services/handler.ts @@ -24,7 +24,6 @@ import { AddonModAssignSubmissionHandler } from '@addons/mod/assign/services/sub import { Injectable, Type } from '@angular/core'; import { CoreError } from '@classes/errors/error'; import { CoreFileHelper } from '@services/file-helper'; -import { CoreSites } from '@services/sites'; import { CoreTextUtils } from '@services/utils/text'; import { CoreUtils } from '@services/utils/utils'; import { CoreWSFile } from '@services/ws'; @@ -224,11 +223,7 @@ export class AddonModAssignSubmissionOnlineTextHandlerService implements AddonMo * @return Whether or not the handler is enabled for edit on a site level. */ isEnabledForEdit(): boolean { - // There's a bug in Moodle 3.1.0 that doesn't allow submitting HTML, so we'll disable this plugin in that case. - // Bug was fixed in 3.1.1 minor release and in 3.2. - const currentSite = CoreSites.getCurrentSite(); - - return !!currentSite?.isVersionGreaterEqualThan('3.1.1') || !!currentSite?.checkIfAppUsesLocalMobile(); + return true; } /** diff --git a/src/addons/mod/bigbluebuttonbn/bigbluebuttonbn-lazy.module.ts b/src/addons/mod/bigbluebuttonbn/bigbluebuttonbn-lazy.module.ts new file mode 100644 index 000000000..e2152edb4 --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/bigbluebuttonbn-lazy.module.ts @@ -0,0 +1,38 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from '@angular/core'; +import { RouterModule, Routes } from '@angular/router'; +import { CoreSharedModule } from '@/core/shared.module'; +import { AddonModBBBComponentsModule } from './components/components.module'; +import { AddonModBBBIndexPage } from './pages/index/index'; + +const routes: Routes = [ + { + path: ':courseId/:cmId', + component: AddonModBBBIndexPage, + }, +]; + +@NgModule({ + imports: [ + RouterModule.forChild(routes), + CoreSharedModule, + AddonModBBBComponentsModule, + ], + declarations: [ + AddonModBBBIndexPage, + ], +}) +export class AddonModBBBLazyModule {} diff --git a/src/addons/mod/bigbluebuttonbn/bigbluebuttonbn.module.ts b/src/addons/mod/bigbluebuttonbn/bigbluebuttonbn.module.ts new file mode 100644 index 000000000..f80d7b44f --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/bigbluebuttonbn.module.ts @@ -0,0 +1,54 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { APP_INITIALIZER, NgModule, Type } from '@angular/core'; +import { Routes } from '@angular/router'; +import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate'; +import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate'; +import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module'; +import { AddonModBBBComponentsModule } from './components/components.module'; +import { AddonModBBBService } from './services/bigbluebuttonbn'; +import { AddonModBBBIndexLinkHandler } from './services/handlers/index-link'; +import { AddonModBBBListLinkHandler } from './services/handlers/list-link'; +import { AddonModBBBModuleHandler, ADDON_MOD_BBB_MAIN_MENU_PAGE_NAME } from './services/handlers/module'; + +export const ADDON_MOD_BBB_SERVICES: Type[] = [ + AddonModBBBService, +]; + +const routes: Routes = [ + { + path: ADDON_MOD_BBB_MAIN_MENU_PAGE_NAME, + loadChildren: () => import('./bigbluebuttonbn-lazy.module').then(m => m.AddonModBBBLazyModule), + }, +]; + +@NgModule({ + imports: [ + CoreMainMenuTabRoutingModule.forChild(routes), + AddonModBBBComponentsModule, + ], + providers: [ + { + provide: APP_INITIALIZER, + multi: true, + useValue: () => { + CoreCourseModuleDelegate.registerHandler(AddonModBBBModuleHandler.instance); + CoreContentLinksDelegate.registerHandler(AddonModBBBIndexLinkHandler.instance); + CoreContentLinksDelegate.registerHandler(AddonModBBBListLinkHandler.instance); + }, + }, + ], +}) +export class AddonModBBBModule {} diff --git a/src/addons/mod/bigbluebuttonbn/components/components.module.ts b/src/addons/mod/bigbluebuttonbn/components/components.module.ts new file mode 100644 index 000000000..d786b230c --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/components/components.module.ts @@ -0,0 +1,34 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { NgModule } from '@angular/core'; +import { AddonModBBBIndexComponent } from './index/index'; +import { CoreSharedModule } from '@/core/shared.module'; +import { CoreCourseComponentsModule } from '@features/course/components/components.module'; + +@NgModule({ + declarations: [ + AddonModBBBIndexComponent, + ], + imports: [ + CoreSharedModule, + CoreCourseComponentsModule, + ], + providers: [ + ], + exports: [ + AddonModBBBIndexComponent, + ], +}) +export class AddonModBBBComponentsModule {} diff --git a/src/addons/mod/bigbluebuttonbn/components/index/index.html b/src/addons/mod/bigbluebuttonbn/components/index/index.html new file mode 100644 index 000000000..98308626b --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/components/index/index.html @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + {{ 'addon.mod_bigbluebuttonbn.view_groups_selection_warning' | translate }} + + + + + + {{ 'core.groupsseparate' | translate }} + {{ 'core.groupsvisible' | translate }} + + + + {{groupOpt.name}} + + + + + + + + +

{{ 'addon.mod_bigbluebuttonbn.mod_form_field_openingtime' | translate }}

+
+

{{ meetingInfo.openingtime * 1000 | coreFormatDate }}

+
+ + +

{{ 'addon.mod_bigbluebuttonbn.mod_form_field_closingtime' | translate }}

+
+

{{ meetingInfo.closingtime * 1000 | coreFormatDate }}

+
+ + + +

{{ 'addon.mod_bigbluebuttonbn.view_message_conference_room_ready' | translate }}

+
+
+ + + + +

{{ 'addon.mod_bigbluebuttonbn.view_message_conference_in_progress' | translate }}

+
+
+ + + +

{{ 'addon.mod_bigbluebuttonbn.view_message_session_started_at' | translate }}

+
+

{{ meetingInfo.startedat * 1000 | coreFormatDate: "strftimetime" }}

+
+ + + +

+ {{ 'addon.mod_bigbluebuttonbn.view_message_moderators' | translate }} +

+

+ {{ 'addon.mod_bigbluebuttonbn.view_message_moderator' | translate }} +

+
+

{{ meetingInfo.moderatorcount }}

+
+ + + +

+ {{ 'addon.mod_bigbluebuttonbn.view_message_viewers' | translate }} +

+

+ {{ 'addon.mod_bigbluebuttonbn.view_message_viewer' | translate }} +

+
+

{{ meetingInfo.participantcount }}

+
+
+ + + + + {{ meetingInfo.statusmessage }} + + +
+ +
+
+ + {{ 'addon.mod_bigbluebuttonbn.view_conference_action_end' | translate }} + + + {{ 'addon.mod_bigbluebuttonbn.view_conference_action_join' | translate }} + +
+ + + +
+
diff --git a/src/addons/mod/bigbluebuttonbn/components/index/index.scss b/src/addons/mod/bigbluebuttonbn/components/index/index.scss new file mode 100644 index 000000000..c6f581f99 --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/components/index/index.scss @@ -0,0 +1,3 @@ +ion-item > p[slot="end"] { + font-size: var(--text-size); +} diff --git a/src/addons/mod/bigbluebuttonbn/components/index/index.ts b/src/addons/mod/bigbluebuttonbn/components/index/index.ts new file mode 100644 index 000000000..444de98c2 --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/components/index/index.ts @@ -0,0 +1,226 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Component, OnInit, Optional } from '@angular/core'; +import { CoreCourseModuleMainActivityComponent } from '@features/course/classes/main-activity-component'; +import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; +import { IonContent } from '@ionic/angular'; +import { CoreGroupInfo, CoreGroups } from '@services/groups'; +import { CoreDomUtils } from '@services/utils/dom'; +import { CoreUtils } from '@services/utils/utils'; +import { Translate } from '@singletons'; +import { AddonModBBB, AddonModBBBData, AddonModBBBMeetingInfoWSResponse, AddonModBBBService } from '../../services/bigbluebuttonbn'; + +/** + * Component that displays a Big Blue Button activity. + */ +@Component({ + selector: 'addon-mod-bbb-index', + templateUrl: 'index.html', + styleUrls: ['index.scss'], +}) +export class AddonModBBBIndexComponent extends CoreCourseModuleMainActivityComponent implements OnInit { + + component = AddonModBBBService.COMPONENT; + moduleName = 'bigbluebuttonbn'; + bbb?: AddonModBBBData; + groupInfo?: CoreGroupInfo; + groupId = 0; + meetingInfo?: AddonModBBBMeetingInfoWSResponse; + + constructor( + protected content?: IonContent, + @Optional() courseContentsPage?: CoreCourseContentsPage, + ) { + super('AddonModBBBIndexComponent', content, courseContentsPage); + } + + /** + * @inheritdoc + */ + async ngOnInit(): Promise { + super.ngOnInit(); + + await this.loadContent(); + } + + /** + * @inheritdoc + */ + protected async fetchContent(): Promise { + this.bbb = await AddonModBBB.getBBB(this.courseId, this.module.id); + + this.description = this.bbb.intro; + this.dataRetrieved.emit(this.bbb); + + this.groupInfo = await CoreGroups.getActivityGroupInfo(this.module.id, false); + + this.groupId = CoreGroups.validateGroupId(this.groupId, this.groupInfo); + + await this.fetchMeetingInfo(); + } + + /** + * Get meeting info. + * + * @return Promise resolved when done. + */ + async fetchMeetingInfo(): Promise { + if (!this.bbb) { + return; + } + + try { + this.meetingInfo = await AddonModBBB.getMeetingInfo(this.bbb.id, this.groupId, { + cmId: this.module.id, + }); + + if (this.meetingInfo.statusrunning && this.meetingInfo.userlimit > 0) { + const count = (this.meetingInfo.participantcount || 0) + (this.meetingInfo.moderatorcount || 0); + if (count === this.meetingInfo.userlimit) { + this.meetingInfo.statusmessage = Translate.instant('addon.mod_bigbluebuttonbn.userlimitreached'); + } + } + } catch (error) { + if (error && error.errorcode === 'restrictedcontextexception') { + error.message = Translate.instant('addon.mod_bigbluebuttonbn.view_nojoin'); + } + + throw error; + } + } + + /** + * @inheritdoc + */ + protected async logActivity(): Promise { + if (!this.bbb) { + return; // Shouldn't happen. + } + + await AddonModBBB.logView(this.bbb.id, this.bbb.name); + } + + /** + * Update meeting info. + * + * @return Promise resolved when done. + */ + async updateMeetingInfo(): Promise { + if (!this.bbb) { + return; + } + + this.showLoading = true; + + try { + await AddonModBBB.invalidateAllGroupsMeetingInfo(this.bbb.id); + + await this.fetchMeetingInfo(); + } finally { + this.showLoading = false; + } + } + + /** + * @inheritdoc + */ + protected async invalidateContent(): Promise { + const promises: Promise[] = []; + + promises.push(AddonModBBB.invalidateBBBs(this.courseId)); + promises.push(CoreGroups.invalidateActivityGroupInfo(this.module.id)); + + if (this.bbb) { + promises.push(AddonModBBB.invalidateAllGroupsMeetingInfo(this.bbb.id)); + } + + await Promise.all(promises); + } + + /** + * Group changed, reload some data. + * + * @return Promise resolved when done. + */ + async groupChanged(): Promise { + this.showLoading = true; + + try { + await this.fetchMeetingInfo(); + } catch (error) { + CoreDomUtils.showErrorModal(error); + } finally { + this.showLoading = false; + } + } + + /** + * Join the room. + * + * @return Promise resolved when done. + */ + async joinRoom(): Promise { + const modal = await CoreDomUtils.showModalLoading(); + + try { + const joinUrl = await AddonModBBB.getJoinUrl(this.module.id, this.groupId); + + CoreUtils.openInBrowser(joinUrl, { + showBrowserWarning: false, + }); + + this.updateMeetingInfo(); + } catch (error) { + CoreDomUtils.showErrorModal(error); + } finally { + modal.dismiss(); + } + } + + /** + * End the meeting. + * + * @return Promise resolved when done. + */ + async endMeeting(): Promise { + if (!this.bbb) { + return; + } + + try { + await CoreDomUtils.showConfirm( + Translate.instant('addon.mod_bigbluebuttonbn.end_session_confirm'), + Translate.instant('addon.mod_bigbluebuttonbn.end_session_confirm_title'), + Translate.instant('core.yes'), + ); + } catch { + // User canceled. + return; + } + + const modal = await CoreDomUtils.showModalLoading(); + + try { + await AddonModBBB.endMeeting(this.bbb.id, this.groupId); + + this.updateMeetingInfo(); + } catch (error) { + CoreDomUtils.showErrorModal(error); + } finally { + modal.dismiss(); + } + } + +} diff --git a/src/addons/mod/bigbluebuttonbn/lang.json b/src/addons/mod/bigbluebuttonbn/lang.json new file mode 100644 index 000000000..380c2a357 --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/lang.json @@ -0,0 +1,19 @@ +{ + "end_session_confirm": "Are you sure you want to end the session?", + "end_session_confirm_title": "Really end session?", + "mod_form_field_closingtime": "Close", + "mod_form_field_openingtime": "Open", + "userlimitreached": "The number of users allowed in a session has been reached.", + "view_conference_action_end": "End session", + "view_conference_action_join": "Join session", + "view_error_unable_join_student": "Unable to connect to the BigBlueButton server.", + "view_groups_selection_warning": "There is a room for each group and you have access to more than one. Be sure to select the correct one.", + "view_message_conference_in_progress": "The session is in progress.", + "view_message_conference_room_ready": "This room is ready. You can join the session now.", + "view_message_moderator": "moderator", + "view_message_moderators": "moderators", + "view_message_session_started_at": "This session started at", + "view_message_viewer": "viewer", + "view_message_viewers": "viewers", + "view_nojoin": "You do not have a role that is allowed to join this session." +} diff --git a/src/addons/mod/bigbluebuttonbn/pages/index/index.html b/src/addons/mod/bigbluebuttonbn/pages/index/index.html new file mode 100644 index 000000000..273ff5994 --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/pages/index/index.html @@ -0,0 +1,23 @@ + + + + + + +

+ + +

+
+ + + +
+
+ + + + + + + diff --git a/src/addons/mod/bigbluebuttonbn/pages/index/index.ts b/src/addons/mod/bigbluebuttonbn/pages/index/index.ts new file mode 100644 index 000000000..3b5c6ddf7 --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/pages/index/index.ts @@ -0,0 +1,30 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Component, ViewChild } from '@angular/core'; +import { CoreCourseModuleMainActivityPage } from '@features/course/classes/main-activity-page'; +import { AddonModBBBIndexComponent } from '../../components/index/index'; + +/** + * Page that displays a Big Blue Button activity. + */ +@Component({ + selector: 'page-addon-mod-bbb-index', + templateUrl: 'index.html', +}) +export class AddonModBBBIndexPage extends CoreCourseModuleMainActivityPage { + + @ViewChild(AddonModBBBIndexComponent) activityComponent?: AddonModBBBIndexComponent; + +} diff --git a/src/addons/mod/bigbluebuttonbn/services/bigbluebuttonbn.ts b/src/addons/mod/bigbluebuttonbn/services/bigbluebuttonbn.ts new file mode 100644 index 000000000..4889b310d --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/services/bigbluebuttonbn.ts @@ -0,0 +1,382 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { CoreError } from '@classes/errors/error'; +import { CoreWSError } from '@classes/errors/wserror'; +import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; +import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; +import { CoreCourseLogHelper } from '@features/course/services/log-helper'; +import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; +import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; +import { makeSingleton, Translate } from '@singletons'; + +const ROOT_CACHE_KEY = 'AddonModBBB:'; + +/** + * Service that provides some features for Big Blue Button activity. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModBBBService { + + static readonly COMPONENT = 'mmaModBigBlueButtonBN'; + + /** + * End a meeting. + * + * @param id BBB ID. + * @param groupId Group ID, 0 means that the function will determine the user group. + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved when done. + */ + async endMeeting( + id: number, + groupId: number = 0, + siteId?: string, + ): Promise { + const site = await CoreSites.getSite(siteId); + + const params: AddonModBBBEndMeetingWSParams = { + bigbluebuttonbnid: id, + groupid: groupId, + }; + + await site.write('mod_bigbluebuttonbn_end_meeting', params); + } + + /** + * Get a BBB activity. + * + * @param courseId Course ID. + * @param cmId Course module ID. + * @param options Other options. + * @return Promise resolved when the activity is retrieved. + */ + async getBBB(courseId: number, cmId: number, options: CoreSitesCommonWSOptions = {}): Promise { + const site = await CoreSites.getSite(options.siteId); + + const params: AddonModBBBGetBigBlueButtonBNsByCoursesWSParams = { + courseids: [courseId], + }; + const preSets: CoreSiteWSPreSets = { + cacheKey: this.getBBBsCacheKey(courseId), + updateFrequency: CoreSite.FREQUENCY_RARELY, + component: AddonModBBBService.COMPONENT, + ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. + }; + + const response = await site.read( + 'mod_bigbluebuttonbn_get_bigbluebuttonbns_by_courses', + params, + preSets, + ); + + const bbb = response.bigbluebuttonbns.find((bbb) => bbb.coursemodule == cmId); + if (bbb) { + return bbb; + } + + throw new CoreError(Translate.instant('core.course.modulenotfound')); + } + + /** + * Get cache key for get BBB WS call. + * + * @param courseId Course ID. + * @return Cache key. + */ + protected getBBBsCacheKey(courseId: number): string { + return ROOT_CACHE_KEY + 'bbb:' + courseId; + } + + /** + * Get join URL for a BBB activity. + * + * @param cmId Course module ID. + * @param groupId Group ID, 0 means that the function will determine the user group. + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved with the list of messages. + */ + async getJoinUrl( + cmId: number, + groupId: number = 0, + siteId?: string, + ): Promise { + const site = await CoreSites.getSite(siteId); + + const params: AddonModBBBGetJoinUrlWSParams = { + cmid: cmId, + groupid: groupId, + }; + + // Don't use cache. + const response = await site.write( + 'mod_bigbluebuttonbn_get_join_url', + params, + ); + + if (response.warnings?.length) { + throw new CoreWSError(response.warnings[0]); + } + + if (!response.join_url) { + // Shouldn't happen, if there are no warning the app should always receive the URL. + throw new CoreError( + Translate.instant('addon.mod_bigbluebuttonbn.view_error_unable_join_studentview_error_unable_join_student'), + ); + } + + return response.join_url; + } + + /** + * Get meeting info for a BBB activity. + * + * @param id BBB ID. + * @param groupId Group ID, 0 means that the function will determine the user group. + * @param options Other options. + * @return Promise resolved with the list of messages. + */ + async getMeetingInfo( + id: number, + groupId: number = 0, + options: CoreCourseCommonModWSOptions = {}, + ): Promise { + const site = await CoreSites.getSite(options.siteId); + + const params: AddonModBBBMeetingInfoWSParams = { + bigbluebuttonbnid: id, + groupid: groupId, + }; + const preSets: CoreSiteWSPreSets = { + cacheKey: this.getMeetingInfoCacheKey(id, groupId), + component: AddonModBBBService.COMPONENT, + componentId: options.cmId, + ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. + }; + + return await site.read( + 'mod_bigbluebuttonbn_meeting_info', + params, + preSets, + ); + } + + /** + * Get cache key for meeting info WS call. + * + * @param id BBB ID. + * @param groupId Group ID, 0 means that the function will determine the user group. + * @return Cache key. + */ + protected getMeetingInfoCacheKey(id: number, groupId: number = 0): string { + return this.getMeetingInfoCacheKeyPrefix(id) + groupId; + } + + /** + * Get cache key prefix for meeting info WS call. + * + * @param id BBB ID. + * @return Cache key prefix. + */ + protected getMeetingInfoCacheKeyPrefix(id: number): string { + return ROOT_CACHE_KEY + 'meetingInfo:' + id + ':'; + } + + /** + * Report a BBB as being viewed. + * + * @param id BBB instance ID. + * @param name Name of the BBB. + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved when the WS call is successful. + */ + async logView(id: number, name?: string, siteId?: string): Promise { + const params: AddonModBBBViewBigBlueButtonBNWSParams = { + bigbluebuttonbnid: id, + }; + + await CoreCourseLogHelper.logSingle( + 'mod_bigbluebuttonbn_view_bigbluebuttonbn', + params, + AddonModBBBService.COMPONENT, + id, + name, + 'bigbluebuttonbn', + {}, + siteId, + ); + } + + /** + * Invalidate BBBs. + * + * @param courseId Course ID. + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved when the data is invalidated. + */ + async invalidateBBBs(courseId: number, siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + await site.invalidateWsCacheForKey(this.getBBBsCacheKey(courseId)); + } + + /** + * Invalidate meeting info for a certain group. + * + * @param id BBB ID. + * @param groupId Group ID, 0 means that the function will determine the user group. + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved when the data is invalidated. + */ + async invalidateMeetingInfo(id: number, groupId: number = 0, siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + await site.invalidateWsCacheForKey(this.getMeetingInfoCacheKey(id, groupId)); + } + + /** + * Invalidate meeting info for all groups. + * + * @param id BBB ID. + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved when the data is invalidated. + */ + async invalidateAllGroupsMeetingInfo(id: number, siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + await site.invalidateWsCacheForKeyStartingWith(this.getMeetingInfoCacheKeyPrefix(id)); + } + + /** + * Returns whether or not the BBB plugin is enabled for a certain site. + * + * @param siteId Site ID. If not defined, current site. + * @return Promise resolved with true if enabled, resolved with false or rejected otherwise. + * @since 4.0, but the WebServices were backported to the plugin so it can be supported in older versions. + */ + async isPluginEnabled(siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + return site.wsAvailable('mod_bigbluebuttonbn_meeting_info'); + } + +} + +export const AddonModBBB = makeSingleton(AddonModBBBService); + +/** + * Params of mod_bigbluebuttonbn_get_bigbluebuttonbns_by_courses WS. + */ +export type AddonModBBBGetBigBlueButtonBNsByCoursesWSParams = { + courseids?: number[]; // Array of course ids. +}; + +/** + * Data returned by mod_bigbluebuttonbn_get_bigbluebuttonbns_by_courses WS. + */ +export type AddonModBBBGetBigBlueButtonBNsByCoursesWSResponse = { + bigbluebuttonbns: AddonModBBBData[]; + warnings?: CoreWSExternalWarning[]; +}; + +/** + * BBB data returned by mod_bigbluebuttonbn_get_bigbluebuttonbns_by_courses. + */ +export type AddonModBBBData = { + id: number; // Module id. + coursemodule: number; // Course module id. + course: number; // Course id. + name: string; // Name. + intro: string; // Description. + meetingid: string; // Meeting id. + introformat?: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). + introfiles: CoreWSExternalFile[]; + timemodified: number; // Last time the instance was modified. + section: number; // Course section id. + visible: number; // Module visibility. + groupmode: number; // Group mode. + groupingid: number; // Grouping id. +}; + +/** + * Params of mod_bigbluebuttonbn_meeting_info WS. + */ +export type AddonModBBBMeetingInfoWSParams = { + bigbluebuttonbnid: number; // Bigbluebuttonbn instance id. + groupid?: number; // Bigbluebuttonbn group id. + updatecache?: boolean; // Update cache ?. +}; + +/** + * Data returned by mod_bigbluebuttonbn_meeting_info WS. + */ +export type AddonModBBBMeetingInfoWSResponse = { + cmid: number; // CM id. + userlimit: number; // User limit. + bigbluebuttonbnid: string; // Bigbluebuttonbn instance id. + meetingid: string; // Meeting id. + openingtime?: number; // Opening time. + closingtime?: number; // Closing time. + statusrunning?: boolean; // Status running. + statusclosed?: boolean; // Status closed. + statusopen?: boolean; // Status open. + statusmessage?: string; // Status message. + startedat?: number; // Started at. + moderatorcount?: number; // Moderator count. + participantcount?: number; // Participant count. + moderatorplural?: boolean; // Several moderators ?. + participantplural?: boolean; // Several participants ?. + canjoin: boolean; // Can join. + ismoderator: boolean; // Is moderator. + presentations: { + url: string; // Presentation URL. + iconname: string; // Icon name. + icondesc: string; // Icon text. + name: string; // Presentation name. + }[]; + joinurl: string; // Join URL. +}; + +/** + * Params of mod_bigbluebuttonbn_get_join_url WS. + */ +export type AddonModBBBGetJoinUrlWSParams = { + cmid: number; // Course module id. + groupid?: number; // Bigbluebuttonbn group id. +}; + +/** + * Data returned by mod_bigbluebuttonbn_get_join_url WS. + */ +export type AddonModBBBGetJoinUrlWSResponse = { + // eslint-disable-next-line @typescript-eslint/naming-convention + join_url?: string; // Can join session. + warnings?: CoreWSExternalWarning[]; +}; + +/** + * Params of mod_bigbluebuttonbn_view_bigbluebuttonbn WS. + */ +export type AddonModBBBViewBigBlueButtonBNWSParams = { + bigbluebuttonbnid: number; // Bigbluebuttonbn instance id. +}; + +/** + * Params of mod_bigbluebuttonbn_end_meeting WS. + */ +export type AddonModBBBEndMeetingWSParams = { + bigbluebuttonbnid: number; // Bigbluebuttonbn instance id. + groupid?: number; // Bigbluebuttonbn group id. +}; diff --git a/src/addons/mod/bigbluebuttonbn/services/handlers/index-link.ts b/src/addons/mod/bigbluebuttonbn/services/handlers/index-link.ts new file mode 100644 index 000000000..2c89a1398 --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/services/handlers/index-link.ts @@ -0,0 +1,33 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { CoreContentLinksModuleIndexHandler } from '@features/contentlinks/classes/module-index-handler'; +import { makeSingleton } from '@singletons'; + +/** + * Handler to treat links to Big Blue Button activity. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModBBBIndexLinkHandlerService extends CoreContentLinksModuleIndexHandler { + + name = 'AddonModBBBIndexLinkHandlerService'; + + constructor() { + super('AddonModBBB', 'bigbluebuttonbn', 'bn'); + } + +} + +export const AddonModBBBIndexLinkHandler = makeSingleton(AddonModBBBIndexLinkHandlerService); diff --git a/src/addons/mod/bigbluebuttonbn/services/handlers/list-link.ts b/src/addons/mod/bigbluebuttonbn/services/handlers/list-link.ts new file mode 100644 index 000000000..3933fc7ea --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/services/handlers/list-link.ts @@ -0,0 +1,33 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { CoreContentLinksModuleListHandler } from '@features/contentlinks/classes/module-list-handler'; +import { makeSingleton } from '@singletons'; + +/** + * Handler to treat links to Big Blue Button list page. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModBBBListLinkHandlerService extends CoreContentLinksModuleListHandler { + + name = 'AddonModBBBListLinkHandler'; + + constructor() { + super('AddonModBBB', 'bigbluebuttonbn'); + } + +} + +export const AddonModBBBListLinkHandler = makeSingleton(AddonModBBBListLinkHandlerService); diff --git a/src/addons/mod/bigbluebuttonbn/services/handlers/module.ts b/src/addons/mod/bigbluebuttonbn/services/handlers/module.ts new file mode 100644 index 000000000..2f543185a --- /dev/null +++ b/src/addons/mod/bigbluebuttonbn/services/handlers/module.ts @@ -0,0 +1,105 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { CoreConstants, ModPurpose } from '@/core/constants'; +import { Injectable, Type } from '@angular/core'; +import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler'; +import { CoreCourseModuleData } from '@features/course/services/course-helper'; +import { CoreCourseModuleHandler, CoreCourseModuleHandlerData } from '@features/course/services/module-delegate'; +import { CoreSitePluginsModuleHandler } from '@features/siteplugins/classes/handlers/module-handler'; +import { CoreSitePlugins } from '@features/siteplugins/services/siteplugins'; +import { makeSingleton } from '@singletons'; +import { AddonModBBBIndexComponent } from '../../components/index'; +import { AddonModBBB } from '../bigbluebuttonbn'; + +export const ADDON_MOD_BBB_MAIN_MENU_PAGE_NAME = 'mod_bigbluebuttonbn'; + +/** + * Handler to support Big Blue Button activities. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModBBBModuleHandlerService extends CoreModuleHandlerBase implements CoreCourseModuleHandler { + + name = 'AddonModBBB'; + modName = 'bigbluebuttonbn'; + protected pageName = ADDON_MOD_BBB_MAIN_MENU_PAGE_NAME; + protected sitePluginHandler?: CoreSitePluginsModuleHandler; + + supportedFeatures = { + [CoreConstants.FEATURE_GROUPS]: true, + [CoreConstants.FEATURE_GROUPINGS]: true, + [CoreConstants.FEATURE_MOD_INTRO]: true, + [CoreConstants.FEATURE_COMPLETION_TRACKS_VIEWS]: true, + [CoreConstants.FEATURE_GRADE_HAS_GRADE]: false, + [CoreConstants.FEATURE_GRADE_OUTCOMES]: true, + [CoreConstants.FEATURE_BACKUP_MOODLE2]: true, + [CoreConstants.FEATURE_SHOW_DESCRIPTION]: true, + [CoreConstants.FEATURE_MOD_PURPOSE]: ModPurpose.MOD_PURPOSE_OTHER, + }; + + /** + * @inheritdoc + */ + async isEnabled(): Promise { + const enabled = await AddonModBBB.isPluginEnabled(); + + if (enabled) { + delete this.sitePluginHandler; + this.name = 'AddonModBBB'; + + return true; + } + + // Native support not available in this site. Check if it's supported by site plugin. + this.sitePluginHandler = CoreSitePlugins.getModuleHandlerInstance(this.modName); + // Change the handler name to be able to retrieve the plugin data in component. + this.name = this.sitePluginHandler?.name || this.name; + + return !!this.sitePluginHandler; + } + + /** + * @inheritdoc + */ + async getData( + module: CoreCourseModuleData, + courseId: number, + sectionId?: number, + forCoursePage?: boolean, + ): Promise { + if (this.sitePluginHandler) { + return this.sitePluginHandler.getData(module, courseId, sectionId, forCoursePage); + } + + const data = await super.getData(module, courseId, sectionId, forCoursePage); + + data.showDownloadButton = false; + + return data; + } + + /** + * @inheritdoc + */ + async getMainComponent(): Promise> { + if (this.sitePluginHandler) { + return this.sitePluginHandler.getMainComponent(); + } + + return AddonModBBBIndexComponent; + } + +} + +export const AddonModBBBModuleHandler = makeSingleton(AddonModBBBModuleHandlerService); diff --git a/src/addons/mod/book/book-lazy.module.ts b/src/addons/mod/book/book-lazy.module.ts index 974dce981..0c81566fc 100644 --- a/src/addons/mod/book/book-lazy.module.ts +++ b/src/addons/mod/book/book-lazy.module.ts @@ -23,6 +23,10 @@ const routes: Routes = [ path: ':courseId/:cmId', component: AddonModBookIndexPage, }, + { + path: ':courseId/:cmId/contents', + loadChildren: () => import('./pages/contents/contents.module').then(m => m.AddonModBookContentsPageModule), + }, ]; @NgModule({ diff --git a/src/addons/mod/book/book.module.ts b/src/addons/mod/book/book.module.ts index 3123cf6b6..351e3ee18 100644 --- a/src/addons/mod/book/book.module.ts +++ b/src/addons/mod/book/book.module.ts @@ -26,6 +26,8 @@ import { AddonModBookListLinkHandler } from './services/handlers/list-link'; import { AddonModBookPrefetchHandler } from './services/handlers/prefetch'; import { AddonModBookTagAreaHandler } from './services/handlers/tag-area'; import { AddonModBookProvider } from './services/book'; +import { CORE_SITE_SCHEMAS } from '@services/sites'; +import { BOOK_SITE_SCHEMA } from './services/database/book'; export const ADDON_MOD_BOOK_SERVICES: Type[] = [ AddonModBookProvider, @@ -44,11 +46,15 @@ const routes: Routes = [ AddonModBookComponentsModule, ], providers: [ + { + provide: CORE_SITE_SCHEMAS, + useValue: [BOOK_SITE_SCHEMA], + multi: true, + }, { provide: APP_INITIALIZER, multi: true, - deps: [], - useFactory: () => () => { + useValue: () => { CoreCourseModuleDelegate.registerHandler(AddonModBookModuleHandler.instance); CoreContentLinksDelegate.registerHandler(AddonModBookIndexLinkHandler.instance); CoreContentLinksDelegate.registerHandler(AddonModBookListLinkHandler.instance); diff --git a/src/addons/mod/book/components/components.module.ts b/src/addons/mod/book/components/components.module.ts index 0254605d5..d31d09782 100644 --- a/src/addons/mod/book/components/components.module.ts +++ b/src/addons/mod/book/components/components.module.ts @@ -16,7 +16,6 @@ import { NgModule } from '@angular/core'; import { CoreSharedModule } from '@/core/shared.module'; import { CoreCourseComponentsModule } from '@features/course/components/components.module'; -import { CoreTagComponentsModule } from '@features/tag/components/components.module'; import { AddonModBookIndexComponent } from './index/index'; import { AddonModBookTocComponent } from './toc/toc'; @@ -29,7 +28,6 @@ import { AddonModBookTocComponent } from './toc/toc'; imports: [ CoreSharedModule, CoreCourseComponentsModule, - CoreTagComponentsModule, ], exports: [ AddonModBookIndexComponent, diff --git a/src/addons/mod/book/components/index/addon-mod-book-index.html b/src/addons/mod/book/components/index/addon-mod-book-index.html index 27ce5e752..380582d58 100644 --- a/src/addons/mod/book/components/index/addon-mod-book-index.html +++ b/src/addons/mod/book/components/index/addon-mod-book-index.html @@ -1,59 +1,47 @@ - - + + - - - - - - - - - - + - + - - - + - - + +

{{ 'addon.mod_book.toc' | translate }}

+
-
-
- - + + +

+ {{chapter.indexNumber}}  + •  + + +

+
+
+ - -
- {{ 'core.tag.tags' | translate }}: - +
+
+ + {{ 'core.start' | translate }} + {{ 'core.resume' | translate }} +
- + +
- diff --git a/src/addons/mod/book/components/index/index.ts b/src/addons/mod/book/components/index/index.ts index 76c994b86..82747aa77 100644 --- a/src/addons/mod/book/components/index/index.ts +++ b/src/addons/mod/book/components/index/index.ts @@ -12,230 +12,113 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, Optional, Input, OnInit } from '@angular/core'; -import { IonContent } from '@ionic/angular'; -import { - CoreCourseModuleMainResourceComponent, CoreCourseResourceDownloadResult, -} from '@features/course/classes/main-resource-component'; -import { - AddonModBookProvider, - AddonModBookContentsMap, - AddonModBookTocChapter, - AddonModBookNavStyle, - AddonModBook, - AddonModBookBookWSData, -} from '../../services/book'; -import { CoreTag, CoreTagItem } from '@features/tag/services/tag'; -import { CoreDomUtils } from '@services/utils/dom'; +import { Component, Optional, OnInit, OnDestroy } from '@angular/core'; +import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component'; +import { AddonModBook, AddonModBookBookWSData, AddonModBookNumbering, AddonModBookTocChapter } from '../../services/book'; import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; -import { Translate } from '@singletons'; -import { CoreUtils } from '@services/utils/utils'; import { CoreCourse } from '@features/course/services/course'; -import { AddonModBookTocComponent } from '../toc/toc'; -import { CoreConstants } from '@/core/constants'; +import { CoreNavigator } from '@services/navigator'; /** - * Component that displays a book. + * Component that displays a book entry page. */ @Component({ selector: 'addon-mod-book-index', templateUrl: 'addon-mod-book-index.html', }) -export class AddonModBookIndexComponent extends CoreCourseModuleMainResourceComponent implements OnInit { +export class AddonModBookIndexComponent extends CoreCourseModuleMainResourceComponent implements OnInit, OnDestroy { - @Input() initialChapterId?: number; // The initial chapter ID to load. + showNumbers = true; + addPadding = true; + showBullets = false; + chapters: AddonModBookTocChapter[] = []; + hasStartedBook = false; - component = AddonModBookProvider.COMPONENT; - chapterContent?: string; - previousChapter?: AddonModBookTocChapter; - nextChapter?: AddonModBookTocChapter; - tagsEnabled = false; - displayNavBar = true; - previousNavBarTitle?: string; - nextNavBarTitle?: string; - warning = ''; - tags?: CoreTagItem[]; - - protected chapters: AddonModBookTocChapter[] = []; - protected currentChapter?: number; protected book?: AddonModBookBookWSData; - protected displayTitlesInNavBar = false; - protected contentsMap: AddonModBookContentsMap = {}; + protected checkCompletionAfterLog = false; - constructor( - protected content?: IonContent, - @Optional() courseContentsPage?: CoreCourseContentsPage, - ) { + constructor( @Optional() courseContentsPage?: CoreCourseContentsPage) { super('AddonModBookIndexComponent', courseContentsPage); } /** - * Component being initialized. + * @inheritdoc */ async ngOnInit(): Promise { super.ngOnInit(); - this.tagsEnabled = CoreTag.areTagsAvailableInSite(); this.loadContent(); } /** - * Show the TOC. + * @inheritdoc */ - async showToc(): Promise { - // Create the toc modal. - const modalData = await CoreDomUtils.openSideModal({ - component: AddonModBookTocComponent, - componentProps: { - moduleId: this.module.id, - chapters: this.chapters, - selected: this.currentChapter, + protected async fetchContent(): Promise { + await Promise.all([ + this.loadBook(), + this.loadTOC(), + ]); + } + + /** + * Load book data. + * + * @return Promise resolved when done. + */ + protected async loadBook(): Promise { + this.book = await AddonModBook.getBook(this.courseId, this.module.id); + + this.dataRetrieved.emit(this.book); + + this.description = this.book.intro; + this.showNumbers = this.book.numbering == AddonModBookNumbering.NUMBERS; + this.showBullets = this.book.numbering == AddonModBookNumbering.BULLETS; + this.addPadding = this.book.numbering != AddonModBookNumbering.NONE; + + const lastChapterViewed = await AddonModBook.getLastChapterViewed(this.book.id); + this.hasStartedBook = lastChapterViewed !== undefined; + } + + /** + * Load book TOC. + * + * @return Promise resolved when done. + */ + protected async loadTOC(): Promise { + const contents = await CoreCourse.getModuleContents(this.module, this.courseId); + + this.chapters = AddonModBook.getTocList(contents); + } + + /** + * @inheritdoc + */ + protected async logActivity(): Promise { + AddonModBook.logView(this.module.instance, undefined, this.module.name); + } + + /** + * Open the book in a certain chapter. + * + * @param chapterId Chapter to open, undefined for last chapter viewed. + */ + openBook(chapterId?: number): void { + CoreNavigator.navigate('contents', { + params: { + cmId: this.module.id, courseId: this.courseId, - book: this.book, + chapterId, }, }); - if (modalData) { - this.changeChapter(modalData); - } + this.hasStartedBook = true; } /** - * Change the current chapter. - * - * @param chapterId Chapter to load. - * @return Promise resolved when done. + * @inheritdoc */ - changeChapter(chapterId: number): void { - if (chapterId && chapterId != this.currentChapter) { - this.loaded = false; - this.refreshIcon = CoreConstants.ICON_LOADING; - this.loadChapter(chapterId, true); - } - } - - /** - * Perform the invalidate content function. - * - * @return Resolved when done. - */ - protected invalidateContent(): Promise { - return AddonModBook.invalidateContent(this.module.id, this.courseId); - } - - /** - * Download book contents and load the current chapter. - * - * @param refresh Whether we're refreshing data. - * @return Promise resolved when done. - */ - protected async fetchContent(refresh = false): Promise { - const promises: Promise[] = []; - let downloadResult: CoreCourseResourceDownloadResult | undefined; - - // Try to get the book data. Ignore errors since this WS isn't available in some Moodle versions. - promises.push(CoreUtils.ignoreErrors(AddonModBook.getBook(this.courseId, this.module.id)) - .then((book) => { - if (!book) { - return; - } - - this.book = book; - this.dataRetrieved.emit(book); - - this.description = book.intro; - this.displayNavBar = book.navstyle != AddonModBookNavStyle.TOC_ONLY; - this.displayTitlesInNavBar = book.navstyle == AddonModBookNavStyle.TEXT; - - return; - })); - - // Get module status to determine if it needs to be downloaded. - promises.push(this.downloadResourceIfNeeded(refresh).then((result) => { - downloadResult = result; - - return; - })); - - try { - await Promise.all(promises); - - this.contentsMap = AddonModBook.getContentsMap(this.module.contents); - this.chapters = AddonModBook.getTocList(this.module.contents); - - if (typeof this.currentChapter == 'undefined' && typeof this.initialChapterId != 'undefined' && this.chapters) { - // Initial chapter set. Validate that the chapter exists. - const chapter = this.chapters.find((chapter) => chapter.id == this.initialChapterId); - - if (chapter) { - this.currentChapter = this.initialChapterId; - } - } - - if (typeof this.currentChapter == 'undefined') { - // Load the first chapter. - this.currentChapter = AddonModBook.getFirstChapter(this.chapters); - } - - // Show chapter. - try { - await this.loadChapter(this.currentChapter!, refresh); - - this.warning = downloadResult?.failed ? this.getErrorDownloadingSomeFilesMessage(downloadResult.error!) : ''; - } catch { - // Ignore errors, they're handled inside the loadChapter function. - } - } finally { - this.fillContextMenu(refresh); - } - } - - /** - * Load a book chapter. - * - * @param chapterId Chapter to load. - * @param logChapterId Whether chapter ID should be passed to the log view function. - * @return Promise resolved when done. - */ - protected async loadChapter(chapterId: number, logChapterId: boolean): Promise { - this.currentChapter = chapterId; - this.content?.scrollToTop(); - - try { - const content = await AddonModBook.getChapterContent(this.contentsMap, chapterId, this.module.id); - - this.tags = this.tagsEnabled ? this.contentsMap[this.currentChapter].tags : []; - - this.chapterContent = content; - this.previousChapter = AddonModBook.getPreviousChapter(this.chapters, chapterId); - this.nextChapter = AddonModBook.getNextChapter(this.chapters, chapterId); - - this.previousNavBarTitle = this.previousChapter && this.displayTitlesInNavBar - ? Translate.instant('addon.mod_book.navprevtitle', { $a: this.previousChapter.title }) - : ''; - this.nextNavBarTitle = this.nextChapter && this.displayTitlesInNavBar - ? Translate.instant('addon.mod_book.navnexttitle', { $a: this.nextChapter.title }) - : ''; - - // Chapter loaded, log view. We don't return the promise because we don't want to block the user for this. - await CoreUtils.ignoreErrors(AddonModBook.logView( - this.module.instance!, - logChapterId ? chapterId : undefined, - this.module.name, - )); - - // Module is completed when last chapter is viewed, so we only check completion if the last is reached. - if (!this.nextChapter) { - CoreCourse.checkModuleCompletion(this.courseId, this.module.completiondata); - } - } catch (error) { - CoreDomUtils.showErrorModalDefault(error, 'addon.mod_book.errorchapter', true); - - throw error; - } finally { - this.loaded = true; - this.refreshIcon = CoreConstants.ICON_REFRESH; - } + ngOnDestroy(): void { + super.ngOnDestroy(); } } diff --git a/src/addons/mod/book/components/toc/toc.html b/src/addons/mod/book/components/toc/toc.html index 7028b51d4..42165ea28 100644 --- a/src/addons/mod/book/components/toc/toc.html +++ b/src/addons/mod/book/components/toc/toc.html @@ -1,6 +1,8 @@ -

{{ 'addon.mod_book.toc' | translate }}

+ +

{{ 'addon.mod_book.toc' | translate }}

+
@@ -12,14 +14,12 @@