diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..5cb872664 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Save all text files with linux line endings +* text=auto eol=lf diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6f0a3a3e7..2df17e701 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,13 +1,31 @@ version: 2 updates: - package-ecosystem: npm - directory: "/" + directory: "/frontend/" schedule: interval: daily time: "22:30" open-pull-requests-limit: 10 - package-ecosystem: cargo - directory: "/" + directory: "/webserver/" + schedule: + interval: daily + time: "22:30" + open-pull-requests-limit: 10 +- package-ecosystem: cargo + directory: "/crates/" + schedule: + interval: daily + time: "22:30" + open-pull-requests-limit: 10 +- package-ecosystem: cargo + directory: "/frontend/src-tauri/" + schedule: + interval: daily + time: "22:30" + open-pull-requests-limit: 10 +- package-ecosystem: cargo + directory: "/frontend/src-wasm/" schedule: interval: daily time: "22:30" diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml deleted file mode 100644 index c12bebd3c..000000000 --- a/.github/workflows/backend.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: checks - -on: - # Triggers the workflow on push or pull request events but only for the master and develop branches - push: - branches: [master, develop] - pull_request: - branches: [master, develop] - paths: - - '.github/workflows/backend.yml' - - 'src-tauri/**' - - '.gitignore' - - 'contrib/for-each-cargo' - -jobs: - backend: - runs-on: ubuntu-20.04 - container: a6543/cabr2_ci:latest - strategy: - fail-fast: true - steps: - - name: Checkout Project - uses: actions/checkout@v2 - - - name: Set Rust Toolchain - run: rustup default stable - - - name: Fix Build - run: mkdir -p dist/CaBr2 && echo "Hello" > dist/CaBr2/index.html - - - name: Linting Tauri app - run: cd src-tauri && cargo clippy --features tauri_app -- -D warnings - - - name: Linting webserver - run: cd src-tauri && cargo clippy --features webserver -- -D warnings - - - name: codespell - uses: codespell-project/actions-codespell@master - with: - check_filenames: true - check_hidden: true - skip: ./.git,./.gitignore,node_modules,dist,yarn.lock,target,./translations,*.html,./src,assets - ignore_words_list: crate,ser - - - name: Build Tauri app - run: cd src-tauri && cargo build --features tauri_app - - - name: Build webserver - run: cd src-tauri && cargo build --features webserver - - # TODO(692) reactivate when tests are written - # - name: Tests - # run: ./contrib/for-each-cargo test diff --git a/.github/workflows/crates.yml b/.github/workflows/crates.yml new file mode 100644 index 000000000..30503bf91 --- /dev/null +++ b/.github/workflows/crates.yml @@ -0,0 +1,36 @@ +name: checks + +on: + # Triggers the workflow on push or pull request events but only for the main and develop branches + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + paths: + - '.github/workflows/crates.yml' + - 'crates/**' + +jobs: + crates: + runs-on: ubuntu-20.04 + container: a6543/cabr2_ci:latest + strategy: + fail-fast: true + steps: + - name: Checkout Project + uses: actions/checkout@v2 + + - name: Set Rust Toolchain + run: rustup default stable + + - name: Check formatting crates + run: cd crates && cargo fmt -- --check + + - name: Lint crates + run: cd crates && cargo clippy --workspace --all-features -- --deny clippy::all --deny warnings + + - name: Build crates + run: cd crates && cargo build --workspace --all-features + + - name: Test crates + run: cd crates && cargo test --workspace --all-features diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml index aae0d18b1..4b99b677f 100644 --- a/.github/workflows/frontend.yml +++ b/.github/workflows/frontend.yml @@ -1,19 +1,19 @@ name: checks on: - # Triggers the workflow on push or pull request events but only for the master branch + # Triggers the workflow on push or pull request events but only for the main branch push: - branches: [master, develop] + branches: [main, develop] pull_request: - branches: [master, develop] + branches: [main, develop] paths: - - 'src/**' - - '*.json' - - '*.js' - - '.prettierignore' - - 'yarn.lock' - '.github/workflows/frontend.yml' - - 'src-wasm/**' + - 'frontend/src/**' + - 'frontend/*.json' + - 'frontend/*.js' + - 'frontend/.prettierignore' + - 'frontend/yarn.lock' + - 'frontend/src-wasm/**' jobs: frontend: @@ -30,27 +30,20 @@ jobs: run: rustup default stable - name: Install Dependencies - run: yarn install --frozen-lockfile + run: cd frontend && yarn install --frozen-lockfile - name: Check Formatting - run: yarn prettier -c src + run: cd frontend && yarn prettier -c src - name: Eslint - run: yarn lint + run: cd frontend && yarn lint - - name: codespell - uses: codespell-project/actions-codespell@master - with: - check_filenames: true - check_hidden: true - skip: ./.git,./.gitignore,node_modules,dist,yarn.lock,./src/assets,./translations,*.html,./src-tauri - ignore_words_list: crate,ser + - name: Build Tauri Frontend + run: cd frontend && yarn ng build --configuration production - name: Build WASM binary - run: yarn wasm_lib:release - - - name: Build Tauri Frontend - run: yarn ng build --configuration production + # debug compiles faster and everything gets checked in the dedicated wasm ci pipeline + run: cd frontend && yarn wasm_lib:debug - name: Build Web Frontend - run: yarn ng build --configuration webProd + run: cd frontend && yarn ng build --configuration webProd diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml new file mode 100644 index 000000000..6062d05de --- /dev/null +++ b/.github/workflows/spellcheck.yml @@ -0,0 +1,22 @@ +name: checks + +on: + # Triggers the workflow on push or pull request events but only for the main and develop branches + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + +jobs: + codespell: + runs-on: ubuntu-20.04 + strategy: + fail-fast: true + steps: + - name: codespell + uses: codespell-project/actions-codespell@master + with: + check_filenames: true + check_hidden: true + skip: ./.git,./.gitignore,node_modules,dist,yarn.lock,./src/assets,./translations + ignore_words_list: crate,ser diff --git a/.github/workflows/tauri-app-rust.yml b/.github/workflows/tauri-app-rust.yml new file mode 100644 index 000000000..6f6f58210 --- /dev/null +++ b/.github/workflows/tauri-app-rust.yml @@ -0,0 +1,40 @@ +name: checks + +on: + # Triggers the workflow on push or pull request events but only for the main and develop branches + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + paths: + - '.github/workflows/frontend-rust.yml' + - 'frontend/src-tauri/**' + +jobs: + frontend-rust: + runs-on: ubuntu-20.04 + container: a6543/cabr2_ci:latest + strategy: + fail-fast: true + steps: + - name: Checkout Project + uses: actions/checkout@v2 + + - name: Set Rust Toolchain + run: rustup default stable + + - name: Fix Build + run: mkdir -p frontend/dist/CaBr2 && echo "Hello" > frontend/dist/CaBr2/index.html + + - name: Check formatting Tauri app + run: cd frontend/src-tauri && cargo fmt -- --check + + - name: Lint Tauri app + run: cd frontend/src-tauri && cargo clippy --all-features -- --deny clippy::all --deny warnings + + - name: Build Tauri app + run: cd frontend/src-tauri && cargo build + + # TODO(692) reactivate when tests are written + # - name: Test Tauri app + # run: cd frontend/src-tauri && cargo test diff --git a/.github/workflows/wasm-lib.yml b/.github/workflows/wasm-lib.yml new file mode 100644 index 000000000..d5951cc01 --- /dev/null +++ b/.github/workflows/wasm-lib.yml @@ -0,0 +1,40 @@ +name: checks + +on: + # Triggers the workflow on push or pull request events but only for the main and develop branches + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + paths: + - '.github/workflows/wasm-lib.yml' + - 'frontend/src-wasm/**' + +jobs: + wasm-lib: + runs-on: ubuntu-20.04 + container: a6543/cabr2_ci:latest + strategy: + fail-fast: true + steps: + - name: Checkout Project + uses: actions/checkout@v2 + + - name: Set Rust Toolchain + run: rustup default stable + + - name: Check formatting WASM library + run: cd frontend/src-wasm && cargo fmt -- --check + + - name: Lint WASM library + run: cd frontend/src-wasm && cargo clippy --all-features -- --deny clippy::all --deny warnings + + - name: Build WASM library debug + run: cd frontend/src-wasm && wasm-pack build --out-dir ../cabr2_wasm --dev -- --features debug_build + + - name: Build WASM library release + run: cd frontend/src-wasm && wasm-pack build --out-dir ../cabr2_wasm --release + + # TODO(692) reactivate when tests are written + # - name: Test WASM library + # run: cd frontend/src-wasm && cargo test diff --git a/.github/workflows/webserver.yml b/.github/workflows/webserver.yml new file mode 100644 index 000000000..997f4bb22 --- /dev/null +++ b/.github/workflows/webserver.yml @@ -0,0 +1,37 @@ +name: checks + +on: + # Triggers the workflow on push or pull request events but only for the main and develop branches + push: + branches: [main, develop] + pull_request: + branches: [main, develop] + paths: + - '.github/workflows/webserver.yml' + - 'webserver/**' + +jobs: + webserver: + runs-on: ubuntu-20.04 + container: a6543/cabr2_ci:latest + strategy: + fail-fast: true + steps: + - name: Checkout Project + uses: actions/checkout@v2 + + - name: Set Rust Toolchain + run: rustup default stable + + - name: Check formatting webserver + run: cd webserver && cargo fmt -- --check + + - name: Lint webserver + run: cd webserver && cargo clippy --all-features -- --deny clippy::all --deny warnings + + - name: Build webserver + run: cd webserver && cargo build + + # TODO(692) reactivate when tests are written + # - name: Test Webserver + # run: cd webserver && cargo test diff --git a/.gitignore b/.gitignore index 25062e70a..a76fe14e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,147 +1,9 @@ - -# Created by https://www.toptal.com/developers/gitignore/api/node,yarn -# Edit at https://www.toptal.com/developers/gitignore?templates=node,yarn - -### Node ### -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - # dotenv environment variables file .env .env.test .env*.local -# build output -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -### yarn ### -# https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored - -.yarn/* -!.yarn/releases -!.yarn/plugins -!.yarn/sdks -!.yarn/versions - -# if you are NOT using Zero-installs, then: -# comment the following lines -!.yarn/cache - -# and uncomment the following lines -# .pnp.* - -# End of https://www.toptal.com/developers/gitignore/api/node,yarn - -# Angular -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc -# Only exists if Bazel was run -/bazel-out - -# dependencies -/node_modules - -# profiling files -chrome-profiler-events*.json -speed-measure-plugin*.json - # IDEs and editors -/.idea .project .classpath .c9/ @@ -157,16 +19,6 @@ speed-measure-plugin*.json !.vscode/extensions.json .history/* -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log -/typings - # System Files .DS_Store Thumbs.db diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..d1e897812 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,6 @@ +* + +!.gitignore +!CaBr2.iml +!modules.xml +!vcs.xml diff --git a/.idea/CaBr2.iml b/.idea/CaBr2.iml new file mode 100644 index 000000000..64376fdcb --- /dev/null +++ b/.idea/CaBr2.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..4d79265de --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index dc75c8a80..000000000 --- a/.prettierrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "trailingComma": "all", - "tabWidth": 2, - "semi": true, - "singleQuote": true -} diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bfa414b9..28e197fd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,39 @@ +## [v0.5.0](https://github.com/Calciumdibromid/CaBr2/releases/tag/v0.5.0) - 2022-02-02 + +* FEATURES + * Introduce NGXS (#1048) +* ENHANCEMENTS + * Destroy all Observables and fix bad code (#1118) + * Move search icon to the beginning (#1117) + * Change message for gestis disclaimer (#1116) + * Replace config-model hack with ngxs approach (#1111) + * Remove unnecessary transloco object (#1106) + * Gestis parser rewrite (#1060) + * Add tests (#1053) + * New error handling in crates (#1051) + * Rename ureq to request in config (#1041) + * Feature/airbnb style guide (#1037) + * Wrap RwLock to simplify code (#1028) + * Remove version reqirement from config handler (#1023) + * Restructure project (#1018) +* BUGFIXES + * Fix logging message when saving file (#1110) + * Print all log messages in tauri also via `console.*` methods (#1109) + * Fix log level filter (#1105) + * New error implementation for serialization (#1104) + * Fix unit translation (#1096) + * Add .gitattributes file to force lf on checkout (#1044) +* BUILD + * Update contrib scripts (#1095) + * Fix wasm-bindgen (#1077) + * Fix clippy in ci (#1076) + * Migrate angular to 13 (#1031) + * Bump rust edition to 2021 (#1020) +* DOCS + * Improve READMEs and IntelliJ support (#1036) + * Update Develop and Build instructions (#826) +* MISC + ## [v0.4.1](https://github.com/Calciumdibromid/CaBr2/releases/tag/v0.4.1) - 2022-01-15 * ENHANCEMENTS diff --git a/CaBr2.code-workspace b/CaBr2.code-workspace new file mode 100644 index 000000000..df2739eaa --- /dev/null +++ b/CaBr2.code-workspace @@ -0,0 +1,43 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "frontend" + }, + { + "path": "frontend/src-wasm" + }, + { + "path": "frontend/src-tauri" + }, + { + "path": "crates" + }, + { + "path": "webserver" + } + ], + "settings": { + "cSpell.words": [ + "cabr", + "Calciumdibromid", + "fuzzer", + "gestis", + "promisified", + "tauri", + "ureq", + "wasm" + ], + "eslint.options": { + "extensions": [".ts", ".html"] + }, + "eslint.validate": [ + "javascript", + "typescript", + "html" + ], + "eslint.packageManager": "yarn" + } +} diff --git a/README.md b/README.md index 0f4cdf267..ad4994089 100644 --- a/README.md +++ b/README.md @@ -1,31 +1,46 @@ # CaBr2 [![License: GPL3+](https://img.shields.io/badge/License-GPL3+-blue.svg?style=flat-square)](https://www.gnu.org/licenses/gpl-3.0.en.html) -[![test](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FCalciumdibromid%2FCaBr2%2Fbadge&style=flat-square)](https://github.com/Calciumdibromid/CaBr2/actions/workflows/test.yml) +[![gh-actions](https://img.shields.io/github/workflow/status/Calciumdibromid/CaBr2/frontend?style=flat-square)](https://github.com/Calciumdibromid/CaBr2/actions) [![Crowdin](https://badges.crowdin.net/cabr2/localized.svg)](https://crowdin.com/project/cabr2) Generate "experiment wise safety sheets" in compliance to European law. -## Develop +## Description -CaBr2 is a [tauri](https://tauri.studio) project. +Calciumdibromid (short: CaBr2) is a tool to generate safety data sheets for experiments. -Frontend is written in Angular 12 and backend is in Rust. +It is written in [Angular](https://angular.io/) and can be either used as a standalone +desktop application or as a static webpage with WASM bindings and an API server to +generate PDFs. -To start execute `yarn start` to build and serve UI, -execute `yarn tauri:dev` to get the application window. +## Structure -## Build +This project can be built in two ways: -You need the tauri-builder. Get it via `cargo install -f tauri-bundler`. +- web front end with webserver and WASM bindings +- [Tauri](https://tauri.studio/) app -To convert the html template to a pdf file you need to install `wkhtmltopdf`. -`wkhtmltox` (that can be downloaded from [here](https://wkhtmltopdf.org/downloads.html)) is needed to build the app. +From this the folder structure was derived: -Just execute `build:release` afterwards. +| path | description | +|-----------------------|----------------------------------------------------------------------------------| +| `/` | Git repo root with obvious files | +| `webserver/` | CaBr2 as REST API implementation | +| `crates/` | core CaBr2 implementation that is shared | +| `frontend/` | Angular application that can be built for Tauri or as standalone web application | +| `frontend/src/` | Angular source code | +| `frontend/src-tauri/` | Tauri glue code for CaBr2 logic | +| `frontend/src-wasm/` | WASM glue code for CaBr2 logic | + +To learn more about a specific part of this project, go to the corresponding README: + +[Angular Application](frontend) +[WASM library](frontend/src-wasm) +[Webserver](webserver) ## Translate Translation is done via [Crowdin](https://crowdin.com/project/cabr2). -to suggest translation improvements or improve support of your own language visit [https://crowdin.com/project/cabr2](https://crowdin.com/project/cabr2). +To improve the translation of a language or add a new one visit [https://crowdin.com/project/cabr2](https://crowdin.com/project/cabr2). diff --git a/ghs_symbols/ghs01.png b/assets/ghs_symbols/ghs01.png similarity index 100% rename from ghs_symbols/ghs01.png rename to assets/ghs_symbols/ghs01.png diff --git a/ghs_symbols/ghs02.png b/assets/ghs_symbols/ghs02.png similarity index 100% rename from ghs_symbols/ghs02.png rename to assets/ghs_symbols/ghs02.png diff --git a/ghs_symbols/ghs03.png b/assets/ghs_symbols/ghs03.png similarity index 100% rename from ghs_symbols/ghs03.png rename to assets/ghs_symbols/ghs03.png diff --git a/ghs_symbols/ghs04.png b/assets/ghs_symbols/ghs04.png similarity index 100% rename from ghs_symbols/ghs04.png rename to assets/ghs_symbols/ghs04.png diff --git a/ghs_symbols/ghs05.png b/assets/ghs_symbols/ghs05.png similarity index 100% rename from ghs_symbols/ghs05.png rename to assets/ghs_symbols/ghs05.png diff --git a/ghs_symbols/ghs06.png b/assets/ghs_symbols/ghs06.png similarity index 100% rename from ghs_symbols/ghs06.png rename to assets/ghs_symbols/ghs06.png diff --git a/ghs_symbols/ghs07.png b/assets/ghs_symbols/ghs07.png similarity index 100% rename from ghs_symbols/ghs07.png rename to assets/ghs_symbols/ghs07.png diff --git a/ghs_symbols/ghs08.png b/assets/ghs_symbols/ghs08.png similarity index 100% rename from ghs_symbols/ghs08.png rename to assets/ghs_symbols/ghs08.png diff --git a/ghs_symbols/ghs09.png b/assets/ghs_symbols/ghs09.png similarity index 100% rename from ghs_symbols/ghs09.png rename to assets/ghs_symbols/ghs09.png diff --git a/templates/first.html b/assets/templates/first.html similarity index 100% rename from templates/first.html rename to assets/templates/first.html diff --git a/templates/second.html b/assets/templates/second.html similarity index 100% rename from templates/second.html rename to assets/templates/second.html diff --git a/templates/styles.css b/assets/templates/styles.css similarity index 100% rename from templates/styles.css rename to assets/templates/styles.css diff --git a/translations/de_by.json b/assets/translations/de_by.json similarity index 98% rename from translations/de_by.json rename to assets/translations/de_by.json index fae6da99d..78c872da2 100644 --- a/translations/de_by.json +++ b/assets/translations/de_by.json @@ -64,7 +64,7 @@ "unsupportedProviderInfo": "kenn i ned, mog i ned", "error": "S'Programm wuit ned", "disclaimer": { - "gestis": "Die Daten kemman von Gestis und de hom koane Daten für Gmisch." + "gestis": "Gestis hod koane Daten zu eiam Gepansche." } }, "substance": { diff --git a/translations/de_de.json b/assets/translations/de_de.json similarity index 98% rename from translations/de_de.json rename to assets/translations/de_de.json index 41881c1c1..339486281 100644 --- a/translations/de_de.json +++ b/assets/translations/de_de.json @@ -64,7 +64,7 @@ "unsupportedProviderInfo": "nicht unterstützt", "error": "Fehler beim Anfragen der Daten", "disclaimer": { - "gestis": "Die Daten stammen von Gestis und Gestis bietet keine Daten zu Verbindungen." + "gestis": "Gestis bietet nur selten Daten zu Versuchsprodukten." } }, "substance": { diff --git a/translations/en_us.json b/assets/translations/en_us.json similarity index 98% rename from translations/en_us.json rename to assets/translations/en_us.json index 84ba63859..f0cb9f068 100644 --- a/translations/en_us.json +++ b/assets/translations/en_us.json @@ -64,7 +64,7 @@ "unsupportedProviderInfo": "not supported", "error": "An error occurred while retrieving data", "disclaimer": { - "gestis": "The data comes from Gestis and it does not provide mixtures." + "gestis": "Gestis rarely provides data for products of experiments." } }, "substance": { diff --git a/translations/hr_hr.json b/assets/translations/hr_hr.json similarity index 93% rename from translations/hr_hr.json rename to assets/translations/hr_hr.json index 7996b96f9..afea3e9b3 100644 --- a/translations/hr_hr.json +++ b/assets/translations/hr_hr.json @@ -59,6 +59,7 @@ "removeOption": "Ukloni opcije pretraživanja", "addOption": "Dodaj opcije pretraživanja", "resultsHeader": "Rezultati pretraživanja", + "noResult": "{{provider}} nije dao nikakve rezultate.\nPokušajte ponovo sa sinonimima ili djelomičnim riječima.", "customSubstance": "Prilagođeno", "unsupportedProviderInfo": "nepodržano", "error": "Došlo je do pogreške prilikom dohvaćanja podataka" @@ -99,7 +100,8 @@ "ghsSymbolsColorInfo": "sivo: nije odabrano / u boji: odabrano", "addCustomSubstanceData": "Dodaj prilagođenu supstancu", "dragAndDrop": "povlačenje i ispuštanje", - "resetTooltip": "Vraćanje trenutne tvari na izvorne vrijednosti" + "resetTooltip": "Vraćanje trenutne tvari na izvorne vrijednosti", + "phraseFormatTooltip": "Očekivani format: {{format}}" }, "units": { "groups": { @@ -120,7 +122,9 @@ "inCaseOfDangerShort": "Slučaj opasnosti", "disposalShort": "Odlaganje", "signatureFieldStudent": "Time potvrđujem da ću izvršiti zadatak/pripremu prema ovdje predstavljenim uputama za sigurnosne podatke.", - "signatureFieldAssistant": "Student smije obaviti predstavljeni zadatak/ pripremu." + "signatureFieldAssistant": "Student smije obaviti predstavljeni zadatak/ pripremu.", + "signature": "Potpis", + "locationAndDate": "Lokacija, Datum" }, "preview": { "info": "Ovo je samo pregled. Generirani PDF može izgledati drugačije!", @@ -173,7 +177,8 @@ "pdfGeneration": { "generatingPdf": "Stvaranje PDF datoteke...", "downloadPdf": "Preuzmite PDF", - "download": "Preuzimanja" + "download": "Preuzimanja", + "errorMessage": "Poslužitelj ne reagira.\nTo može imati nekoliko uzroka.\nSada možete pričekati ili zatvoriti ovaj dijaloški okvir i pokušati ponovo kasnije." } } } diff --git a/translations/ru_ru.json b/assets/translations/ru_ru.json similarity index 92% rename from translations/ru_ru.json rename to assets/translations/ru_ru.json index bae4a43c8..b4ba09221 100644 --- a/translations/ru_ru.json +++ b/assets/translations/ru_ru.json @@ -59,6 +59,7 @@ "removeOption": "Удалить опцию поиска", "addOption": "Добавить опцию поиска", "resultsHeader": "Найти результаты", + "noResult": "{{provider}} не дал результатов.\nПожалуйста, попробуйте снова с синонимами или частичными словами.", "customSubstance": "Пользовательский", "unsupportedProviderInfo": "не поддерживается", "error": "Ошибка при получении данных" @@ -99,7 +100,8 @@ "ghsSymbolsColorInfo": "серый: не выбрано / раскрашено: выбрано", "addCustomSubstanceData": "Добавить обычай субстанция", "dragAndDrop": "перетащить", - "resetTooltip": "Сбросить текущее вещество к исходным значениям" + "resetTooltip": "Сбросить текущее вещество к исходным значениям", + "phraseFormatTooltip": "Ожидаемый формат: {{format}}" }, "units": { "groups": { @@ -120,7 +122,9 @@ "inCaseOfDangerShort": "Случай опасности", "disposalShort": "Удаления", "signatureFieldStudent": "Я подтверждаю, что выполняю задание/подготовку в соответствии с инструкциями по безопасности, представленными здесь.", - "signatureFieldAssistant": "Студенту разрешается выполнить представленное задание или подготовку." + "signatureFieldAssistant": "Студенту разрешается выполнить представленное задание или подготовку.", + "signature": "Сигнатура", + "locationAndDate": "Расположение, дата" }, "preview": { "info": "Это только предварительный просмотр. Созданный PDF может выглядеть иначе!", @@ -173,7 +177,8 @@ "pdfGeneration": { "generatingPdf": "Генерация PDF...", "downloadPdf": "Скачать PDF", - "download": "Скачать" + "download": "Скачать", + "errorMessage": "Сервер не отвечает.\nЭто может иметь несколько причин.\nВы можете подождать или закрыть этот диалог сейчас и повторите попытку позже." } } } diff --git a/contrib/for-each-cargo b/contrib/for-each-cargo deleted file mode 100755 index 1527aec71..000000000 --- a/contrib/for-each-cargo +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -cd "$(dirname "$0")/../src-tauri" -rust_root="$(pwd)" -echo "rust_root=$rust_root" - -find "$rust_root" -name Cargo.toml | while read line; do - cd "$(dirname "$line")" - echo "context: $(pwd)" - cargo $1 $2 $3 $4 $5 || exit 1 -done diff --git a/contrib/pull-translations b/contrib/pull-translations index d2e8a87e7..5931f079c 100755 --- a/contrib/pull-translations +++ b/contrib/pull-translations @@ -22,7 +22,7 @@ token="$1" crowdin pull || exit 1 # normalize locales -for i in $(ls translations/??_??.json); do +for i in $(ls assets/translations/??_??.json); do file_old=$i file_new=$(echo "$file_old" | tr '[:upper:]' '[:lower:]') [ "$file_old" == "$file_new" ] || { diff --git a/contrib/push-translations b/contrib/push-translations index a23c3a6cb..8bd7707fb 100755 --- a/contrib/push-translations +++ b/contrib/push-translations @@ -14,7 +14,7 @@ token="$1" echo "token not set" exit 1 } - sed "s/-TOKEN-/${token}/g" crowdin.example.yml >crowdin.yml + sed "s/-TOKEN-/${token}/g" crowdin.example.yml > crowdin.yml } # crowdin action diff --git a/contrib/set-version b/contrib/set-version index a38ca2f60..73e22f588 100755 --- a/contrib/set-version +++ b/contrib/set-version @@ -1,11 +1,14 @@ #!/bin/bash -cd "$(dirname "$0")/../src-tauri" -crate_root="$(pwd)" -echo "crate_root=$crate_root" +source "$(dirname "$0")/settings" +cd "$(dirname "$0")/.." -find "$crate_root" -name Cargo.toml | while read line; do - cd "$(dirname "$line")" - echo "context: $(pwd)" - sed -i "/^version = /cversion = \"$1\"" Cargo.toml +for i in $RUST_WORKSPACES; do + echo "rust workspace: ${i}" + sed -i "/^version = /cversion = \"$1\"" ${i}/Cargo.toml +done + +for i in $YARN_WORKSPACES; do + echo "yarn workspace: ${i}" + sed -i "/^\ \ \"version\": /c\ \ \"version\": \"$1\"," ${i}/package.json done diff --git a/contrib/settings b/contrib/settings new file mode 100644 index 000000000..a3b701207 --- /dev/null +++ b/contrib/settings @@ -0,0 +1,2 @@ +RUST_WORKSPACES='webserver frontend/src-wasm frontend/src-tauri' +YARN_WORKSPACES=frontend diff --git a/crates/.gitignore b/crates/.gitignore new file mode 100644 index 000000000..2c96eb1b6 --- /dev/null +++ b/crates/.gitignore @@ -0,0 +1,2 @@ +target/ +Cargo.lock diff --git a/crates/Cargo.toml b/crates/Cargo.toml new file mode 100644 index 000000000..e0bf3d386 --- /dev/null +++ b/crates/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +members = [ + "config", + "error-ser", + "load_save", + "logger", + "search", + "types", +] diff --git a/src-tauri/cabr2_config/Cargo.toml b/crates/config/Cargo.toml similarity index 62% rename from src-tauri/cabr2_config/Cargo.toml rename to crates/config/Cargo.toml index eac1a1e7a..57361adb6 100644 --- a/src-tauri/cabr2_config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -1,30 +1,29 @@ [package] -name = "cabr2_config" -version = "0.4.1" # TODO (#1013) set version to 0.0.0 +name = "config" +version = "0.0.0" authors = [ "crapStone ", "6543 <6543@obermui.de>", ] -edition = "2018" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] base64 = "0.13.0" -cabr2_types = { path = "../cabr2_types/" } directories-next = "2.0.0" lazy_static = "1.4.0" log = "0.4.14" serde = { version = "1.0.133", features = ["derive"] } serde_json = "1.0.74" -tauri = { version = "1.0.0-beta.8", default-features = false, optional = true } thiserror = "1.0.29" tokio = { version = "1.15.0", features = ["fs", "io-util"] } toml = { version = "0.5.8", features = ["preserve_order"] } -warp = { version = "0.3.2", optional = true } +types = { path = "../types/" } [features] portable = [] -tauri_plugin = ["tauri"] -webserver = ["warp", "cabr2_types/webserver"] +webserver = [] +tauri-app = [] + default = [] diff --git a/src-tauri/cabr2_config/src/error.rs b/crates/config/src/error.rs similarity index 100% rename from src-tauri/cabr2_config/src/error.rs rename to crates/config/src/error.rs diff --git a/src-tauri/cabr2_config/src/handler.rs b/crates/config/src/handler.rs similarity index 95% rename from src-tauri/cabr2_config/src/handler.rs rename to crates/config/src/handler.rs index de7ed8be2..5a3c39e75 100644 --- a/src-tauri/cabr2_config/src/handler.rs +++ b/crates/config/src/handler.rs @@ -188,7 +188,6 @@ fn get_config_path() -> PathBuf { #[cfg(not(feature = "portable"))] { log::trace!("config path: user config folder"); - use super::PROJECT_DIRS; let mut conf_dir = PROJECT_DIRS.config_dir().to_path_buf(); if !conf_dir.exists() { @@ -265,8 +264,17 @@ fn get_program_data_dir() -> PathBuf { .parent() .unwrap() .to_path_buf(); + // git repo root - program_path.push("../../../"); + #[cfg(feature = "webserver")] + program_path.push("../../../assets/"); + #[cfg(feature = "tauri-app")] + program_path.push("../../../../assets/"); + + #[cfg(not(any(feature = "webserver", feature = "tauri-app")))] + program_path.push("assets/"); + + log::warn!("data_dir: {}", program_path.display()); program_path.canonicalize().unwrap() } } diff --git a/crates/config/src/lib.rs b/crates/config/src/lib.rs new file mode 100644 index 000000000..ae9020ce3 --- /dev/null +++ b/crates/config/src/lib.rs @@ -0,0 +1,8 @@ +#![allow(clippy::upper_case_acronyms)] + +pub mod error; +pub mod handler; +pub mod types; + +pub use crate::types::{BackendConfig, GHSSymbols}; +pub use handler::{get_hazard_symbols, read_config, DATA_DIR, TMP_DIR}; diff --git a/src-tauri/cabr2_config/src/types.rs b/crates/config/src/types.rs similarity index 96% rename from src-tauri/cabr2_config/src/types.rs rename to crates/config/src/types.rs index 5ef61574a..fa6fd0573 100644 --- a/src-tauri/cabr2_config/src/types.rs +++ b/crates/config/src/types.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; use serde_json::Value; -use cabr2_types::logging::LogLevel; +use ::types::logging::LogLevel; use crate::handler; @@ -72,7 +72,7 @@ impl std::default::Default for BackendConfig { all: Some(LogLevel::DEBUG), cabr2: Some(LogLevel::DEBUG), rustls: None, - ureq: None, + reqwest: None, }, } } @@ -104,7 +104,7 @@ pub struct Logging { #[serde(skip_serializing_if = "Option::is_none")] pub rustls: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub ureq: Option, + pub reqwest: Option, } /* #endregion */ diff --git a/crates/error-ser/Cargo.toml b/crates/error-ser/Cargo.toml new file mode 100644 index 000000000..f9ff116ef --- /dev/null +++ b/crates/error-ser/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "error-ser" +version = "0.0.0" +edition = "2021" +authors = [ + "crapStone ", +] + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +serde = { version = "1.0.136", features = ["derive"] } diff --git a/crates/error-ser/src/lib.rs b/crates/error-ser/src/lib.rs new file mode 100644 index 000000000..3c8840ef1 --- /dev/null +++ b/crates/error-ser/src/lib.rs @@ -0,0 +1,25 @@ +use serde::Serialize; + +#[derive(Debug, Serialize)] +pub struct SerializableError { + #[serde(rename = "type")] + type_: &'static str, + #[serde(skip_serializing_if = "Option::is_none")] + message: Option, +} + +impl SerializableError { + pub fn new(name: &'static str) -> SerializableError { + SerializableError { + type_: name, + message: None, + } + } + + pub fn with_message(name: &'static str, message: T) -> SerializableError { + SerializableError { + type_: name, + message: Some(message.to_string()), + } + } +} diff --git a/src-tauri/cabr2_load_save/Cargo.toml b/crates/load_save/Cargo.toml similarity index 59% rename from src-tauri/cabr2_load_save/Cargo.toml rename to crates/load_save/Cargo.toml index b77226e0b..10a337a44 100644 --- a/src-tauri/cabr2_load_save/Cargo.toml +++ b/crates/load_save/Cargo.toml @@ -1,20 +1,19 @@ [package] -name = "cabr2_load_save" +name = "load_save" version = "0.0.0" authors = [ "crapStone ", "6543 <6543@obermui.de>", ] -edition = "2018" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] async-trait = "0.1.52" -cabr2_config = { path = "../cabr2_config/", optional = true } -cabr2_types = { path = "../cabr2_types/" } -cfg-if = "1.0.0" chrono = { version = "0.4.19", optional = true } +config = { path = "../config/", optional = true } +error-ser = { path = "../error-ser" } handlebars = { version = "4.2.0", optional = true } lazy_static = "1.4.0" log = "0.4.14" @@ -23,18 +22,16 @@ quick-xml = { version = "0.22.0", features = ["serialize"], optional = true } regex = { version = "1.4.6", optional = true } serde = { version = "1.0.133", features = ["derive"] } serde_json = { version = "1.0.74", optional = true } -tauri = { version = "1.0.0-beta.8", default-features = false, optional = true } thiserror = "1.0.29" tokio = { version = "1.15.0", features = ["fs"], optional = true } -uuid = { version = "0.8.2", features = ["serde", "v4"], optional = true } -warp = { version = "0.3.2", features = [], optional = true } +types = { path = "../types/", features = ["lock"] } wkhtmltopdf = { version = "0.4.0", optional = true } [features] beryllium = ["chrono", "quick-xml", "regex"] cabr2 = ["serde_json"] -pdf = ["cabr2_config", "tokio", "chrono", "handlebars", "lopdf", "serde_json", "wkhtmltopdf"] -tauri_plugin = ["tauri", "serde_json", "tokio"] -webserver = ["tokio", "uuid", "warp", "cabr2_types/webserver"] -wasm = [] -default = [] +pdf = ["config", "tokio", "tokio/rt-multi-thread", "chrono", "handlebars", "lopdf", "serde_json", "wkhtmltopdf"] + +__tokio = [ "tokio", "types/rt-tokio" ] # internal feature to enable tokio specific optimizations + +default = [ "__tokio" ] diff --git a/crates/load_save/src/beryllium/error.rs b/crates/load_save/src/beryllium/error.rs new file mode 100644 index 000000000..da775bca8 --- /dev/null +++ b/crates/load_save/src/beryllium/error.rs @@ -0,0 +1,23 @@ +use serde::{Serialize, Serializer}; +use thiserror::Error; + +use error_ser::SerializableError; + +#[derive(Error, Debug)] +pub enum BerylliumError { + #[error(transparent)] + DeserializeError(#[from] quick_xml::DeError), +} + +impl Serialize for BerylliumError { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + match self { + BerylliumError::DeserializeError(err) => { + SerializableError::with_message("DeserializeError", err).serialize(serializer) + } + } + } +} diff --git a/crates/load_save/src/beryllium/mod.rs b/crates/load_save/src/beryllium/mod.rs new file mode 100644 index 000000000..e2364ad27 --- /dev/null +++ b/crates/load_save/src/beryllium/mod.rs @@ -0,0 +1,160 @@ +mod error; +mod types; + +use async_trait::async_trait; +use chrono::TimeZone; +use lazy_static::lazy_static; +use quick_xml::de::from_reader; +use regex::Regex; + +use ::types::{Amount, Data, Source, SubstanceData, Unit}; + +use self::types::{BerylliumDocument, TemplateCategory}; +use super::{ + error::Result, + types::{CaBr2Document, Header, Loader}, +}; + +pub use error::BerylliumError; + +pub struct Beryllium; + +#[cfg_attr(not(target_family = "wasm"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +impl Loader for Beryllium { + async fn load_document(&self, contents: Vec) -> Result { + lazy_static! { + static ref BEGINNING_OF_TIME: chrono::DateTime = chrono::Utc.ymd(1970, 1, 1).and_hms(0, 0, 0); + static ref GESTIS_URL_RE: Regex = + Regex::new(r"http://gestis\.itrust\.de/nxt/gateway\.dll/gestis_(de|en)/(\d{6})\.xml").unwrap(); + } + + let beryllium_doc: BerylliumDocument = from_reader(contents.as_slice()).map_err(BerylliumError::from)?; + Ok(CaBr2Document { + disposal: get_templates_with_category(&beryllium_doc, TemplateCategory::Dumping), + human_and_environment_danger: get_templates_with_category(&beryllium_doc, TemplateCategory::Danger), + in_case_of_danger: get_templates_with_category(&beryllium_doc, TemplateCategory::Behavior), + rules_of_conduct: get_templates_with_category(&beryllium_doc, TemplateCategory::Security), + header: Header { + assistant: beryllium_doc.personal.assistant, + document_title: beryllium_doc.general.title, + lab_course: beryllium_doc.general.location, + name: beryllium_doc.personal.name, + organisation: beryllium_doc.general.institute, + place: beryllium_doc.personal.spot, + preparation: beryllium_doc.product.name, + }, + substance_data: beryllium_doc + .substances + .into_iter() + .map(|mut substance| SubstanceData { + name: Data::new(substance.names[0].clone()), + alternative_names: substance.names.split_off(1), + cas: Data::new(substance.cas), + molecular_formula: Data::new(substance.chemical_formula), + molar_mass: Data::new(substance.molecular_weight), + boiling_point: Data::new(substance.boiling_point), + melting_point: Data::new(match substance.melting_point { + Some(mp) => Some(mp.value), + None => None, + }), + water_hazard_class: Data::new(substance.wgk), + h_phrases: Data::new(match substance.harzard_statements { + Some(phrases) => phrases + .split('-') + .map(|p| (format!("H{}", p), "".into())) // TODO fill statements + .collect(), + None => Vec::new(), + }), + p_phrases: Data::new(match substance.precautionary_statements { + Some(phrases) => phrases + .split('-') + .map(|p| (format!("P{}", p), "".into())) // TODO fill statements + .collect(), + None => Vec::new(), + }), + signal_word: Data::new(substance.signal_word), + symbols: Data::new(match substance.symbols { + Some(symbols) => symbols + .into_iter() + .map(|s| format!("ghs{}", s.trim_end_matches("-neu"))) + .collect(), + None => Vec::new(), + }), + lethal_dose: Data::new(match substance.lethaldose50 { + Some(ld50) => Some(ld50.value), + None => None, + }), + mak: Data::new(match substance.mak { + Some(mak) => Some(mak.value), + None => None, + }), + amount: { + let mut unit = None; + let mut value = None; + if let Some(su) = substance.setting_up { + if su.volumina.unwrap_or_default() { + unit = Some(Unit::Liter); + } else if su.mass.unwrap_or_default() { + unit = Some(Unit::Gram); + } + value = Some(su.value); + } + if let Some(c) = substance.concentration { + if c.relative.unwrap_or_default() { + unit = Some(Unit::SolutionRelative); + } else { + unit = Some(Unit::SolutionMol); + } + value = substance.solution_volumina; + } + + if unit.is_some() && value.is_some() { + Some(Amount { + unit: unit.unwrap(), + value: value.unwrap(), + }) + } else { + log::debug!("could not convert amount: {{ unit: {:?}, value: {:?} }}", unit, value); + None + } + }, + source: Source { + provider: substance + .source_provider + .unwrap_or_else(|| "custom".into()) + .to_lowercase(), + url: { + let mut url = substance.source_url.unwrap_or_default(); + // remap gestis url to new one + if GESTIS_URL_RE.is_match(&url) { + let captures = GESTIS_URL_RE.captures(&url).unwrap(); + url = format!( + "https://gestis-api.dguv.de/api/article/{}/{}", + &captures[1], &captures[2] + ); + } + url + }, + last_updated: match chrono::DateTime::parse_from_rfc2822(&substance.source_fetched.unwrap_or_default()) { + Ok(datetime) => datetime.into(), + Err(_) => *BEGINNING_OF_TIME, + }, + }, + + checked: true, + }) + .collect(), + }) + } +} + +fn get_templates_with_category(doc: &BerylliumDocument, category: TemplateCategory) -> Vec { + doc + .templates + .templates + .iter() + .filter(|t| t.category == category) + .map(|t| t.content.clone()) + .collect() +} diff --git a/src-tauri/cabr2_load_save/src/beryllium/types.rs b/crates/load_save/src/beryllium/types.rs similarity index 100% rename from src-tauri/cabr2_load_save/src/beryllium/types.rs rename to crates/load_save/src/beryllium/types.rs diff --git a/crates/load_save/src/cabr2/error.rs b/crates/load_save/src/cabr2/error.rs new file mode 100644 index 000000000..a3c6a56a1 --- /dev/null +++ b/crates/load_save/src/cabr2/error.rs @@ -0,0 +1,21 @@ +use serde::{Serialize, Serializer}; +use thiserror::Error; + +use error_ser::SerializableError; + +#[derive(Error, Debug)] +pub enum Cabr2Error { + #[error(transparent)] + JsonError(#[from] serde_json::Error), +} + +impl Serialize for Cabr2Error { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + match self { + Cabr2Error::JsonError(err) => SerializableError::with_message("JsonError", err).serialize(serializer), + } + } +} diff --git a/crates/load_save/src/cabr2/mod.rs b/crates/load_save/src/cabr2/mod.rs new file mode 100644 index 000000000..a425a474c --- /dev/null +++ b/crates/load_save/src/cabr2/mod.rs @@ -0,0 +1,28 @@ +mod error; + +use async_trait::async_trait; + +use super::{ + error::Result, + types::{CaBr2Document, Loader, Saver}, +}; + +pub use error::Cabr2Error; + +pub struct CaBr2; + +#[cfg_attr(not(target_family = "wasm"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +impl Loader for CaBr2 { + async fn load_document(&self, contents: Vec) -> Result { + Ok(serde_json::from_slice(&contents).map_err(Cabr2Error::from)?) + } +} + +#[cfg_attr(not(target_family = "wasm"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] +impl Saver for CaBr2 { + async fn save_document(&self, document: CaBr2Document) -> Result> { + Ok(serde_json::to_vec(&document).map_err(Cabr2Error::from)?) + } +} diff --git a/crates/load_save/src/error.rs b/crates/load_save/src/error.rs new file mode 100644 index 000000000..3ee31c887 --- /dev/null +++ b/crates/load_save/src/error.rs @@ -0,0 +1,52 @@ +use serde::{Serialize, Serializer}; +use thiserror::Error; + +use error_ser::SerializableError; + +#[derive(Error, Debug)] +pub enum LoadSaveError { + #[error("unknown file type")] + UnknownFileType(String), + + #[error("file already exists: '{0}'")] + FileExists(String), + + #[error(transparent)] + IOError(#[from] std::io::Error), + + #[cfg(feature = "beryllium")] + #[error(transparent)] + BerylliumError(#[from] crate::beryllium::BerylliumError), + + #[cfg(feature = "cabr2")] + #[error(transparent)] + Cabr2Error(#[from] crate::cabr2::Cabr2Error), + + #[cfg(feature = "pdf")] + #[error(transparent)] + PdfError(#[from] crate::pdf::PdfError), +} + +impl Serialize for LoadSaveError { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + match self { + LoadSaveError::UnknownFileType(value) => { + SerializableError::with_message("UnknownFileType", value).serialize(serializer) + } + LoadSaveError::FileExists(value) => SerializableError::with_message("FileExists", value).serialize(serializer), + LoadSaveError::IOError(err) => SerializableError::with_message("IOError", err).serialize(serializer), + + #[cfg(feature = "beryllium")] + LoadSaveError::BerylliumError(err) => err.serialize(serializer), + #[cfg(feature = "cabr2")] + LoadSaveError::Cabr2Error(err) => err.serialize(serializer), + #[cfg(feature = "pdf")] + LoadSaveError::PdfError(err) => err.serialize(serializer), + } + } +} + +pub type Result = std::result::Result; diff --git a/crates/load_save/src/handler.rs b/crates/load_save/src/handler.rs new file mode 100644 index 000000000..8566b485e --- /dev/null +++ b/crates/load_save/src/handler.rs @@ -0,0 +1,86 @@ +use std::collections::HashMap; + +use lazy_static::lazy_static; + +use types::{lock::RwLockWrapper, ProviderMapping}; + +use crate::{ + error::{LoadSaveError, Result}, + types::{CaBr2Document, DialogFilter, DocumentTypes, Loader, Saver}, +}; + +type LoadersMap = RwLockWrapper)>>; +type SaversMap = RwLockWrapper)>>; + +lazy_static! { + pub static ref REGISTERED_LOADERS: LoadersMap = RwLockWrapper::new(HashMap::new()); + pub static ref REGISTERED_SAVERS: SaversMap = RwLockWrapper::new(HashMap::new()); +} + +pub async fn init_handlers(_provider_mapping: ProviderMapping) { + let mut _loaders = REGISTERED_LOADERS.write().await; + + #[cfg(feature = "cabr2")] + _loaders.insert("cb2", ("CaBr2", Box::new(crate::cabr2::CaBr2))); + #[cfg(feature = "beryllium")] + _loaders.insert("be", ("Beryllium", Box::new(crate::beryllium::Beryllium))); + + let mut _savers = REGISTERED_SAVERS.write().await; + + #[cfg(feature = "cabr2")] + _savers.insert("cb2", ("CaBr2", Box::new(crate::cabr2::CaBr2))); + #[cfg(feature = "pdf")] + _savers.insert("pdf", ("PDF", Box::new(crate::pdf::PDF::new(_provider_mapping)))); +} + +pub async fn save_document(file_type: &str, document: CaBr2Document) -> Result> { + let savers = REGISTERED_SAVERS.read().await; + + if let Some((_, saver)) = savers.get(file_type) { + return saver.save_document(document).await; + } + + Err(LoadSaveError::UnknownFileType(file_type.to_string())) +} + +pub async fn load_document(file_type: &str, contents: Vec) -> Result { + let loaders = REGISTERED_LOADERS.read().await; + + if let Some((_, loader)) = loaders.get(file_type) { + return loader.load_document(contents).await; + } + + Err(LoadSaveError::UnknownFileType(file_type.to_string())) +} + +pub async fn get_available_document_types() -> DocumentTypes { + let loaders = REGISTERED_LOADERS.read().await; + + let mut load: Vec = loaders + .iter() + .map(|(ext, (name, _))| DialogFilter { + name: name.to_string(), + extensions: vec![ext.to_string()], + }) + .collect(); + + // set cb2 as first element + if let Some((i, _)) = (&load).iter().enumerate().find(|(_, f)| f.extensions[0] == "cb2") { + if i != 0 { + log::debug!("setting cb2 as first file type from: {}", i); + load.swap(i, 0); + } + } + + let savers = REGISTERED_SAVERS.read().await; + + let save = savers + .iter() + .map(|(ext, (name, _))| DialogFilter { + name: name.to_string(), + extensions: vec![ext.to_string()], + }) + .collect(); + + DocumentTypes { load, save } +} diff --git a/src-tauri/cabr2_load_save/src/lib.rs b/crates/load_save/src/lib.rs similarity index 60% rename from src-tauri/cabr2_load_save/src/lib.rs rename to crates/load_save/src/lib.rs index 668dd1598..30e3773b7 100644 --- a/src-tauri/cabr2_load_save/src/lib.rs +++ b/crates/load_save/src/lib.rs @@ -2,16 +2,9 @@ #![allow(clippy::unnecessary_unwrap)] #![allow(clippy::upper_case_acronyms)] -mod error; +pub mod error; pub mod handler; -mod types; - -#[cfg(feature = "tauri_plugin")] -pub mod plugin; -#[cfg(feature = "wasm")] -pub mod wasm; -#[cfg(feature = "webserver")] -pub mod webserver; +pub mod types; #[cfg(feature = "beryllium")] mod beryllium; diff --git a/crates/load_save/src/pdf/error.rs b/crates/load_save/src/pdf/error.rs new file mode 100644 index 000000000..e41d1893e --- /dev/null +++ b/crates/load_save/src/pdf/error.rs @@ -0,0 +1,40 @@ +use serde::{Serialize, Serializer}; +use thiserror::Error; + +use error_ser::SerializableError; + +#[derive(Error, Debug)] +pub enum PdfError { + #[error("merging of pdfs failed: '{0}'")] + PdfMergeError(String), + + #[error(transparent)] + TemplateError(#[from] handlebars::TemplateError), + + #[error(transparent)] + RenderError(#[from] handlebars::RenderError), + + #[error(transparent)] + Wkhtml(#[from] wkhtmltopdf::Error), + + #[error(transparent)] + IOError(#[from] std::io::Error), +} + +pub type Result = std::result::Result; + +impl Serialize for PdfError { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + match self { + PdfError::PdfMergeError(value) => SerializableError::with_message("PdfMergeError", value).serialize(serializer), + + PdfError::TemplateError(err) => SerializableError::with_message("TemplateError", err).serialize(serializer), + PdfError::RenderError(err) => SerializableError::with_message("RenderError", err).serialize(serializer), + PdfError::Wkhtml(err) => SerializableError::with_message("Wkhtml", err).serialize(serializer), + PdfError::IOError(err) => SerializableError::with_message("IOError", err).serialize(serializer), + } + } +} diff --git a/src-tauri/cabr2_load_save/src/pdf/merge.rs b/crates/load_save/src/pdf/merge.rs similarity index 95% rename from src-tauri/cabr2_load_save/src/pdf/merge.rs rename to crates/load_save/src/pdf/merge.rs index 008d87c5f..abcf2879f 100644 --- a/src-tauri/cabr2_load_save/src/pdf/merge.rs +++ b/crates/load_save/src/pdf/merge.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; use lopdf::{Document, Object, ObjectId}; -use crate::error::{LoadSaveError, Result}; +use super::error::{PdfError, Result}; /// this code is basically the example from the /// [lopdf repo](https://github.com/J-F-Liu/lopdf/blob/master/examples/merge.rs) @@ -85,7 +85,7 @@ pub fn merge_pdfs(documents: Vec) -> Result { // If no "Pages" found abort if pages_object.is_none() { - return Err(LoadSaveError::PdfMergeError("Pages root not found.".into())); + return Err(PdfError::PdfMergeError("Pages root not found.".into())); } // Iter over all "Page" and collect with the parent "Pages" created before @@ -100,7 +100,7 @@ pub fn merge_pdfs(documents: Vec) -> Result { // If no "Catalog" found abort if catalog_object.is_none() { - return Err(LoadSaveError::PdfMergeError("Catalog root not found.".into())); + return Err(PdfError::PdfMergeError("Catalog root not found.".into())); } let catalog_object = catalog_object.unwrap(); diff --git a/src-tauri/cabr2_load_save/src/pdf/mod.rs b/crates/load_save/src/pdf/mod.rs similarity index 85% rename from src-tauri/cabr2_load_save/src/pdf/mod.rs rename to crates/load_save/src/pdf/mod.rs index 636544c3f..3f64bfe83 100644 --- a/src-tauri/cabr2_load_save/src/pdf/mod.rs +++ b/crates/load_save/src/pdf/mod.rs @@ -1,3 +1,4 @@ +mod error; mod merge; mod types; @@ -16,15 +17,17 @@ use lopdf::Document; use serde::Serialize; use wkhtmltopdf::{Orientation, PageSize, PdfApplication, Size}; -use cabr2_config::DATA_DIR; -use cabr2_types::ProviderMapping; +use ::config::DATA_DIR; +use ::types::ProviderMapping; -use self::types::PDFCaBr2Document; +use self::{error::Result, types::PDFCaBr2Document}; use super::{ - error::{LoadSaveError, Result}, + error::Result as LoadSaveResult, types::{CaBr2Document, Saver}, }; +pub use error::PdfError; + type PDFThreadChannels = Arc, mpsc::Receiver>>)>>; lazy_static! { @@ -40,55 +43,52 @@ impl PDF { } } -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] +#[async_trait] impl Saver for PDF { - async fn save_document(&self, document: CaBr2Document) -> Result> { + async fn save_document(&self, document: CaBr2Document) -> LoadSaveResult> { lazy_static! { static ref PDF_THREAD_CHANNEL: PDFThreadChannels = Arc::new(Mutex::new(init_pdf_application())); } let title = document.header.document_title.clone(); + // PDF generation may be a long running, cpu intensive task. This informs the runtime to move other waiting tasks // to different threads. - match tokio::task::block_in_place(|| render_doc(document.into())) { - Err(e) => Err(e), - Ok(pages) => { - let channels = PDF_THREAD_CHANNEL.lock().unwrap(); - - let mut pdfs = Vec::with_capacity(2); - for page in pages { - channels - .0 - .send((page, title.clone())) - .expect("sending data to pdf thread failed"); - - let pdf: Vec = channels.1.recv().expect("receiving data from pdf thread failed")?; - pdfs.push(pdf); - } - - let mut documents = Vec::with_capacity(pdfs.len()); - for pdf in pdfs { - match Document::load_mem(&pdf) { - Ok(doc) => documents.push(doc), - Err(_) => return Err(LoadSaveError::PdfMergeError("loading pdf failed".into())), - } - } - - let mut merged_pdf = merge::merge_pdfs(documents)?; - - let mut buf = Vec::new(); - merged_pdf.save_to(&mut buf)?; - - Ok(buf) + let pages = tokio::task::block_in_place(|| render_doc(document.into()))?; + + let channels = PDF_THREAD_CHANNEL.lock().unwrap(); + + let mut pdfs = Vec::with_capacity(2); + for page in pages { + channels + .0 + .send((page, title.clone())) + .expect("sending data to pdf thread failed"); + + let pdf: Vec = channels.1.recv().expect("receiving data from pdf thread failed")?; + pdfs.push(pdf); + } + + let mut documents = Vec::with_capacity(pdfs.len()); + for pdf in pdfs { + match Document::load_mem(&pdf) { + Ok(doc) => documents.push(doc), + Err(_) => return Err(PdfError::PdfMergeError("loading pdf failed".into()).into()), } } + + let mut merged_pdf = merge::merge_pdfs(documents)?; + + let mut buf = Vec::new(); + merged_pdf.save_to(&mut buf)?; + + Ok(buf) } } const PDF_TEMPLATE_PAGES: [&str; 2] = ["first", "second"]; -/// render_doc get CaBr2Document and return html (dummy at the moment) +/// render_doc get CaBr2Document and return html fn render_doc(document: PDFCaBr2Document) -> Result> { #[derive(Debug, Serialize)] struct Context<'a> { @@ -163,7 +163,7 @@ fn init_pdf_application() -> PDFChannels { Err(e) => { log::error!("[pdf_thread]: initialization of pdf application failed"); pdf_tx - .send(Err(LoadSaveError::PdfError(e))) + .send(Err(PdfError::Wkhtml(e))) .expect("[pdf_thread]: pdf thread could not send data"); return; } @@ -177,7 +177,7 @@ fn init_pdf_application() -> PDFChannels { // needed for rust to resolve types let title: String = title; - let mut buf = Vec::new(); + let mut buf = Vec::with_capacity(256_000); // just some random default value to minimize allocations let result = match pdf_app .builder() @@ -189,9 +189,9 @@ fn init_pdf_application() -> PDFChannels { { Ok(mut pdfout) => match pdfout.read_to_end(&mut buf) { Ok(_) => Ok(buf), - Err(e) => Err(LoadSaveError::IOError(e)), + Err(e) => Err(e.into()), }, - Err(e) => Err(LoadSaveError::PdfError(e)), + Err(e) => Err(e.into()), }; log::trace!("[pdf_thread]: sending result"); @@ -217,7 +217,7 @@ mod handlebar_helpers { use handlebars::{Handlebars, JsonRender, RenderError}; use lazy_static::lazy_static; - use cabr2_config::GHSSymbols; + use config::GHSSymbols; use super::{types::PDFSubstanceData, PROVIDER_MAPPING}; @@ -227,7 +227,7 @@ mod handlebar_helpers { fn get_hazard_symbols() -> Result { // calling `block_on` is possible, because we set the current thread to block at the beginning of the PDF generation. - tokio::runtime::Handle::current().block_on(cabr2_config::get_hazard_symbols()) + tokio::runtime::Handle::current().block_on(config::get_hazard_symbols()) } /// Inlines the actual ghs-symbol-images from their keys as base64-encodes pngs diff --git a/src-tauri/cabr2_load_save/src/pdf/types.rs b/crates/load_save/src/pdf/types.rs similarity index 95% rename from src-tauri/cabr2_load_save/src/pdf/types.rs rename to crates/load_save/src/pdf/types.rs index 9d766da6a..02548e479 100644 --- a/src-tauri/cabr2_load_save/src/pdf/types.rs +++ b/crates/load_save/src/pdf/types.rs @@ -4,7 +4,7 @@ use chrono::TimeZone; use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; -use cabr2_types::{Source, SubstanceData}; +use ::types::{Source, SubstanceData}; use crate::types::{CaBr2Document, Header}; @@ -157,8 +157,8 @@ impl std::convert::From for PDFSubstanceData { } } -impl std::convert::From for Amount { - fn from(amount: cabr2_types::Amount) -> Self { +impl std::convert::From<::types::Amount> for Amount { + fn from(amount: ::types::Amount) -> Self { Amount { unit: amount.unit.into(), value: amount.value, @@ -172,8 +172,8 @@ impl Data { } } -impl std::convert::From> for Data { - fn from(data: cabr2_types::Data) -> Self { +impl std::convert::From<::types::Data> for Data { + fn from(data: ::types::Data) -> Self { match data.modified_data { Some(data) => Data { data, modified: true }, None => Data { diff --git a/src-tauri/cabr2_load_save/src/types.rs b/crates/load_save/src/types.rs similarity index 81% rename from src-tauri/cabr2_load_save/src/types.rs rename to crates/load_save/src/types.rs index c23522d0c..26d2ce6cf 100644 --- a/src-tauri/cabr2_load_save/src/types.rs +++ b/crates/load_save/src/types.rs @@ -1,18 +1,18 @@ use async_trait::async_trait; use serde::{Deserialize, Serialize}; -use cabr2_types::SubstanceData; +use ::types::SubstanceData; use super::error::Result; -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] pub trait Loader { async fn load_document(&self, contents: Vec) -> Result; } -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] pub trait Saver { async fn save_document(&self, document: CaBr2Document) -> Result>; } diff --git a/src-tauri/cabr2_logger/Cargo.toml b/crates/logger/Cargo.toml similarity index 51% rename from src-tauri/cabr2_logger/Cargo.toml rename to crates/logger/Cargo.toml index fb900d970..a0d523c26 100644 --- a/src-tauri/cabr2_logger/Cargo.toml +++ b/crates/logger/Cargo.toml @@ -1,25 +1,19 @@ [package] -name = "cabr2_logger" +name = "logger" version = "0.0.0" authors = [ "crapStone ", "6543 <6543@obermui.de>", ] -edition = "2018" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -cabr2_config = { path = "../cabr2_config/" } -cabr2_types = { path = "../cabr2_types/" } chrono = "0.4.19" +config = { path = "../config/" } fern = "0.6.0" log = "0.4.14" serde = { version = "1.0.133", features = ["derive"], optional = true } -serde_json = { version = "1.0.74", optional = true } -tauri = { version = "1.0.0-beta.8", default-features = false, optional = true } tokio = "1.15.0" - -[features] -tauri_plugin = ["serde", "serde_json", "tauri"] -default = [] +types = { path = "../types/" } diff --git a/src-tauri/cabr2_logger/src/lib.rs b/crates/logger/src/lib.rs similarity index 65% rename from src-tauri/cabr2_logger/src/lib.rs rename to crates/logger/src/lib.rs index 27aa691d3..728fcff98 100644 --- a/src-tauri/cabr2_logger/src/lib.rs +++ b/crates/logger/src/lib.rs @@ -1,15 +1,12 @@ #![allow(clippy::new_without_default)] -#[cfg(feature = "tauri_plugin")] -pub mod plugin; - use std::fs; use fern::Dispatch; use log::LevelFilter; -use cabr2_config::{read_config, BackendConfig, TMP_DIR}; -use cabr2_types::logging::LogLevel; +use ::types::logging::LogLevel; +use config::{read_config, BackendConfig, TMP_DIR}; pub async fn setup_logger() -> Result<(), fern::InitError> { let mut log_file = TMP_DIR.clone(); @@ -26,24 +23,29 @@ pub async fn setup_logger() -> Result<(), fern::InitError> { }) .logging; + let cabr2_level = convert_level(config.cabr2); + Dispatch::new() .format(|out, message, record| { out.finish(format_args!( - "{}[{}][{}] {}", - chrono::Local::now().format("[%+]"), + "[{}][{}:{}][{}] {}", + chrono::Local::now().format("%+"), record.target(), + record.line().unwrap_or(0), record.level(), message )) }) .level(convert_level(config.all)) - .level_for("cabr2", convert_level(config.cabr2.clone())) - .level_for("cabr2_config", convert_level(config.cabr2.clone())) - .level_for("cabr2_load_save", convert_level(config.cabr2.clone())) - .level_for("cabr2_logger", convert_level(config.cabr2.clone())) - .level_for("cabr2_search", convert_level(config.cabr2)) - .level_for("ureq", convert_level(config.ureq)) - .level_for("rustls", convert_level(config.rustls)) + .level_for("cabr2", cabr2_level) + .level_for("cabr2_wasm_lib", cabr2_level) + .level_for("webserver", cabr2_level) + .level_for("config", cabr2_level) + .level_for("load_save", cabr2_level) + .level_for("logger", cabr2_level) + .level_for("search", cabr2_level) + .level_for("types", cabr2_level) + .level_for("reqwest", convert_level(config.reqwest)) .chain(std::io::stdout()) .chain(fs::OpenOptions::new().create(true).write(true).open(&log_file)?) .apply()?; diff --git a/src-tauri/rustfmt.toml b/crates/rustfmt.toml similarity index 94% rename from src-tauri/rustfmt.toml rename to crates/rustfmt.toml index 87611a89b..93db0f0ab 100644 --- a/src-tauri/rustfmt.toml +++ b/crates/rustfmt.toml @@ -6,7 +6,7 @@ use_small_heuristics = "Default" reorder_imports = true reorder_modules = true remove_nested_parens = true -edition = "2018" +edition = "2021" merge_derives = true use_try_shorthand = false use_field_init_shorthand = false diff --git a/src-tauri/cabr2_search/.gitignore b/crates/search/.gitignore similarity index 100% rename from src-tauri/cabr2_search/.gitignore rename to crates/search/.gitignore diff --git a/src-tauri/cabr2_search/Cargo.toml b/crates/search/Cargo.toml similarity index 52% rename from src-tauri/cabr2_search/Cargo.toml rename to crates/search/Cargo.toml index d12221efb..54b20ff5e 100644 --- a/src-tauri/cabr2_search/Cargo.toml +++ b/crates/search/Cargo.toml @@ -1,41 +1,42 @@ [package] -name = "cabr2_search" +name = "search" version = "0.0.0" authors = [ "crapStone ", "6543 <6543@obermui.de>", ] -edition = "2018" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] async-trait = "0.1.52" -cabr2_types = { path = "../cabr2_types/" } cfg-if = "1.0.0" chrono = "0.4.19" +env_logger = { version = "0.9.0", optional = true } +error-ser = { path = "../error-ser" } futures = { version = "0.3.19", optional = true } lazy_static = "1.4.0" log = "0.4.14" +quick-xml = { version = "0.23.0-alpha3", optional = true } +regex = { version = "1.5.4", optional = true } reqwest = { version = "0.11.9", features = ["json", "native-tls"], default-features = false, optional = true } -roxmltree = { version = "0.14.1", optional = true } serde = { version = "1.0.133", features = ["derive"] } serde_json = "1.0.74" structopt = { version = "0.3.25", optional = true } -tauri = { version = "1.0.0-beta.8", default-features = false, optional = true } thiserror = "1.0.29" -tokio = { version = "1.15.0", features = ["sync"], default-features = false, optional = true } -warp = { version = "0.3.2", optional = true } +tokio = { version = "1.15.0", default-features = false, optional = true } +types = { path = "../types/", features = ["lock"] } [features] -gestis = [ "roxmltree", "reqwest" ] -gestis_helper = [ "gestis" ] -tauri_plugin = [ "tauri", "tokio" ] -webserver = [ "warp", "tokio", "cabr2_types/webserver" ] -wasm = [ "chrono/wasmbind" ] -default = [] +gestis = [ "reqwest", "quick-xml", "regex" ] +gestis_helper = [ "gestis", "structopt", "env_logger", "tokio/rt-multi-thread", "tokio/macros" ] + +__tokio = [ "types/rt-tokio" ] # internal feature to enable tokio specific optimizations + +default = [ "__tokio" ] [[bin]] name = "gestis_helper" path = "contrib/gestis/helper.rs" -required-features = [ "structopt", "gestis_helper" ] +required-features = [ "gestis_helper" ] diff --git a/src-tauri/cabr2_search/README.md b/crates/search/README.md similarity index 100% rename from src-tauri/cabr2_search/README.md rename to crates/search/README.md diff --git a/crates/search/contrib/gestis/helper.rs b/crates/search/contrib/gestis/helper.rs new file mode 100644 index 000000000..38b71b374 --- /dev/null +++ b/crates/search/contrib/gestis/helper.rs @@ -0,0 +1,147 @@ +use std::{ + fs::{self, OpenOptions}, + io::{BufWriter, Write}, + path::PathBuf, +}; + +use env_logger::{fmt::Color, Builder, Env}; +use structopt::StructOpt; + +use search::{ + gestis::{self, types::GestisResponse}, + types::Provider, +}; + +/// This binary uses the `env_logger`. +/// Just set the environment variable `RUST_LOG` to `debug` to see the debug output. +/// +/// Other examples: +/// +/// - RUST_LOG=search=trace -> show all log messages in search crate +/// +/// - RUST_LOG=search::gestis::xml_parser=debug -> just show the debug messages of the xml parser +#[derive(StructOpt, Debug)] +#[structopt(name = "gestis_helper")] +struct Arguments { + /// Extract XMLs from gestis id + #[structopt(short, long)] + pub extract: Option, + + /// Parse and print substance with gestis id + #[structopt(short, long)] + pub parse: Option, + + /// Delete all extracted XMLs + #[structopt(short, long)] + pub clean: bool, + + /// Print less information, e.g. just errors od debug information with '--parse' + #[structopt(short, long)] + pub quiet: bool, +} + +#[tokio::main] +async fn main() { + init_logger(); + + let args = Arguments::from_args(); + + if args.parse.is_some() { + let gestis = gestis::Gestis::new(reqwest::ClientBuilder::new().build().unwrap()); + + let res = gestis.get_substance_data(args.parse.unwrap()).await.unwrap(); + + if !args.quiet { + println!("{res:#?}"); + } + } else if args.extract.is_some() { + let gestis = gestis::Gestis::new(reqwest::ClientBuilder::new().build().unwrap()); + let (res, _) = gestis.get_raw_substance_data(args.extract.unwrap()).await.unwrap(); + + extract_xmls(&res).unwrap(); + } else if args.clean { + fs::remove_dir_all("gestis_helper").expect("removing 'gestis_helper' folder failed"); + } +} + +fn extract_xmls(res: &GestisResponse) -> std::io::Result<()> { + let mut folder = PathBuf::from("gestis_helper"); + folder.push(&res.name); + fs::create_dir_all(&folder)?; + + let mut response_file = folder.clone(); + response_file.push("@response.json"); // response should be at the top of the folder + let file = OpenOptions::new().write(true).create(true).open(response_file)?; + let writer = BufWriter::new(file); + serde_json::to_writer_pretty(writer, res)?; + + println!("extracting: {}.json", res.name); + + let mapping = gestis::functions::parse_chapters(res); + + for (chapter_name, xml) in [ + ("boiling_point", mapping.boiling_point), + ("cas_number", mapping.cas_number), + ("h_p_signal_symbols", mapping.h_p_signal_symbols), + ("lethal_dose", mapping.lethal_dose), + ("agw", mapping.agw), + ("mak", mapping.mak), + ("melting_point", mapping.melting_point), + ("molecular_formula_molar_mass", mapping.molecular_formula_molar_mass), + ("water_hazard_class", mapping.water_hazard_class), + ] { + print!(" trying: {} ... ", chapter_name); + + match xml { + Some(xml) => { + let mut filename = folder.clone(); + filename.push(chapter_name); + + let mut file = OpenOptions::new() + .create(true) + .write(true) + .open(filename.with_extension("xml"))?; + + file.write_all(xml.as_bytes())?; + + println!("\x1B[32mSUCCESS\x1B[m"); + } + None => { + println!("\x1B[31mNO_XML\x1B[m"); + continue; + } + } + } + + Ok(()) +} + +fn init_logger() { + let env = Env::default(); + + Builder::from_env(env) + .format(|buf, record| { + let mut rest_style = buf.style(); + rest_style.set_bold(true); + let mut level_style = rest_style.clone(); + + match record.level() { + log::Level::Error => level_style.set_color(Color::Red), + log::Level::Warn => level_style.set_color(Color::Yellow), + log::Level::Info => level_style.set_color(Color::White), + log::Level::Debug => level_style.set_color(Color::Blue), + log::Level::Trace => level_style.set_color(Color::Magenta), + }; + + writeln!( + buf, + "[{}][{}][{}:{}] {}", + rest_style.value(buf.timestamp_micros()), + level_style.value(record.level()), + rest_style.value(record.target()), + rest_style.value(record.line().unwrap_or(0)), + record.args(), + ) + }) + .init(); +} diff --git a/crates/search/contrib/gestis_helper.sh b/crates/search/contrib/gestis_helper.sh new file mode 100755 index 000000000..59f6ae996 --- /dev/null +++ b/crates/search/contrib/gestis_helper.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +cargo run --bin gestis_helper --no-default-features --features="gestis_helper" -- $@ diff --git a/crates/search/src/error.rs b/crates/search/src/error.rs new file mode 100644 index 000000000..40ac1e2e2 --- /dev/null +++ b/crates/search/src/error.rs @@ -0,0 +1,14 @@ +use serde::Serialize; +use thiserror::Error; + +#[derive(Error, Debug, Serialize)] +pub enum SearchError { + #[error("unknown provider: {0}")] + UnknownProvider(String), + + #[cfg(feature = "gestis")] + #[error(transparent)] + Gestis(#[from] crate::gestis::GestisError), +} + +pub type Result = std::result::Result; diff --git a/crates/search/src/gestis/error.rs b/crates/search/src/gestis/error.rs new file mode 100644 index 000000000..015b6e7d9 --- /dev/null +++ b/crates/search/src/gestis/error.rs @@ -0,0 +1,47 @@ +use std::fmt::Debug; + +use serde::{Serialize, Serializer}; +use thiserror::Error; + +use error_ser::SerializableError; + +#[derive(Error, Debug)] +pub enum GestisError { + #[error("missing information: {0}")] + MissingInfo(&'static str), + + #[error("rate limited")] + RateLimit, + + #[error("unexpected event: {0}")] + UnexpectedEvent(String), + + #[error(transparent)] + RequestError(#[from] reqwest::Error), + #[error(transparent)] + XmlError(#[from] quick_xml::Error), + #[error(transparent)] + IOError(#[from] std::io::Error), +} + +impl Serialize for GestisError { + fn serialize(&self, serializer: S) -> std::result::Result + where + S: Serializer, + { + match self { + GestisError::MissingInfo(value) => SerializableError::with_message("MissingInfo", value).serialize(serializer), + GestisError::UnexpectedEvent(value) => { + SerializableError::with_message("UnexpectedEvent", value).serialize(serializer) + } + + GestisError::RequestError(err) => SerializableError::with_message("RequestError", err).serialize(serializer), + GestisError::XmlError(err) => SerializableError::with_message("XmlError", err).serialize(serializer), + GestisError::IOError(err) => SerializableError::with_message("IOError", err).serialize(serializer), + + GestisError::RateLimit => SerializableError::new("RateLimit").serialize(serializer), + } + } +} + +pub type Result = std::result::Result; diff --git a/crates/search/src/gestis/functions.rs b/crates/search/src/gestis/functions.rs new file mode 100644 index 000000000..5163c51a6 --- /dev/null +++ b/crates/search/src/gestis/functions.rs @@ -0,0 +1,161 @@ +use quick_xml::{events::Event, Reader}; + +use super::{ + error::Result, + types::{ChapterMapping, GestisResponse}, +}; + +pub fn parse_chapters(json: &GestisResponse) -> ChapterMapping { + let mut mapping = ChapterMapping { + boiling_point: None, + cas_number: None, + h_p_signal_symbols: None, + lethal_dose: None, + agw: None, + mak: None, + melting_point: None, + molecular_formula_molar_mass: None, + water_hazard_class: None, + }; + + // just go through the JSON once and save references to the XML strings for each required section + for chapter in json.chapters.iter() { + match chapter.number.as_str() { + "0100" => { + for subchapter in chapter.subchapters.iter() { + if subchapter.number.as_str() == "0100" { + mapping.cas_number = subchapter.text.as_deref(); + } + } + } + "0400" => { + for subchapter in chapter.subchapters.iter() { + if subchapter.number.as_str() == "0400" { + mapping.molecular_formula_molar_mass = subchapter.text.as_deref(); + } + } + } + "0500" => { + for subchapter in chapter.subchapters.iter() { + if subchapter.number.as_str() == "0501" { + mapping.lethal_dose = subchapter.text.as_deref(); + } + } + } + "0600" => { + for subchapter in chapter.subchapters.iter() { + match subchapter.number.as_str() { + "0602" => mapping.melting_point = subchapter.text.as_deref(), + "0603" => mapping.boiling_point = subchapter.text.as_deref(), + _ => {} + } + } + } + "1100" => { + for subchapter in chapter.subchapters.iter() { + match subchapter.number.as_str() { + "1106" => mapping.water_hazard_class = subchapter.text.as_deref(), + "1201" => mapping.agw = subchapter.text.as_deref(), + "1203" => mapping.mak = subchapter.text.as_deref(), + "1303" => mapping.h_p_signal_symbols = subchapter.text.as_deref(), + _ => {} + } + } + } + _ => {} + } + } + + mapping +} + +// XML parsing functions + +/// Private extension for `quick_xml::Parser` with convenience functions. +pub trait ReaderExt<'a> { + /// Skips the next n occurrences of the next tag. + /// Only looks at the current level, sublevels are skipped. + fn skip(&mut self, name: &str, times: u8) -> Result<()>; + + /// Finds the next occurrence of tag `name`. + fn find_start(&mut self, name: &str) -> Result; + + /// Finds the next `table` tag with class attribute `class`. + fn find_table(&mut self, class: &str) -> Result; + + /// Reads the text with internal buffer. + fn read_text_unbuffered(&mut self, end: &str) -> Result; + + /// This function should only be use to debug code. + /// + /// It is just a convenience function that prints all remaining tags and texts of the XML. + #[cfg(debug_assertions)] + fn print_to_end(&mut self) -> Result<()>; +} + +impl<'a> ReaderExt<'a> for Reader<&'a [u8]> { + fn skip(&mut self, name: &str, times: u8) -> Result<()> { + for _ in 0..times { + self.read_to_end_unbuffered(name)? + } + + Ok(()) + } + + fn find_start(&mut self, name: &str) -> Result { + let name: &[u8] = name.as_ref(); + loop { + match self.read_event_unbuffered()? { + Event::Start(e) => { + if e.name() == name { + return Ok(Event::Start(e)); + } + } + Event::Eof => return Ok(Event::Eof), + _ => {} + } + } + } + + fn find_table(&mut self, class: &str) -> Result { + let class: &[u8] = class.as_ref(); + loop { + match self.read_event_unbuffered()? { + Event::Start(e) => { + if e.name() == b"table" + && e.attributes().into_iter().any(|a| { + if let Ok(attr) = a { + attr.key == b"class" && attr.value == class + } else { + false + } + }) + { + return Ok(Event::Start(e)); + } + } + Event::Eof => return Ok(Event::Eof), + _ => {} + } + } + } + + fn read_text_unbuffered(&mut self, end: &str) -> Result { + Ok(self.read_text(end, &mut Vec::with_capacity(32))?) + } + + #[cfg(debug_assertions)] + fn print_to_end(&mut self) -> Result<()> { + loop { + match self.read_event_unbuffered()? { + Event::Start(e) => println!("{}", self.decode(e.name())?), + Event::Text(e) => println!(" text: '{}'", e.unescape_and_decode(self)?), + Event::Empty(e) => println!("empty: {}", self.decode(e.name())?), + Event::Eof => break, + _ => {} + } + } + + Ok(()) + } +} diff --git a/src-tauri/cabr2_search/src/gestis/mod.rs b/crates/search/src/gestis/mod.rs similarity index 51% rename from src-tauri/cabr2_search/src/gestis/mod.rs rename to crates/search/src/gestis/mod.rs index 840ca3db3..80e88f27e 100644 --- a/src-tauri/cabr2_search/src/gestis/mod.rs +++ b/crates/search/src/gestis/mod.rs @@ -1,18 +1,25 @@ +mod error; +pub mod functions; pub mod types; pub mod xml_parser; +#[cfg(test)] +mod tests; + use async_trait::async_trait; use reqwest::Client; use serde::de::DeserializeOwned; -use cabr2_types::{Data, Source, SubstanceData}; +use ::types::{Data, Source, SubstanceData}; -use self::types::GestisResponse; +use self::{error::Result, types::GestisResponse}; use crate::{ - error::{Result, SearchError}, + error::Result as SearchResult, types::{Provider, SearchArguments, SearchResponse, SearchType}, }; +pub use self::error::GestisError; + const BASE_URL: &str = "https://gestis-api.dguv.de/api"; const SEARCH_SUGGESTIONS: &str = "search_suggestions"; const SEARCH: &str = "search"; @@ -29,7 +36,8 @@ impl Gestis { } async fn get_article(&self, identifier: String) -> Result<(GestisResponse, String)> { - let url = format!("{}/{}/de/{}", BASE_URL, ARTICLE, identifier); + // create gestis url and left fill the identifier with zeros if it's smaller than 6 + let url = format!("{BASE_URL}/{ARTICLE}/de/{identifier:0>6}"); let res = self.make_request(&url).await?; Ok((res, url)) @@ -56,33 +64,38 @@ impl Gestis { match response.json().await { Ok(json) => Ok(json), Err(err) => { - log::error!("{:?}", err); - Err(SearchError::JsonError) + log::error!("deserializing response failed: {err:?}"); + Err(err.into()) } } } Err(err) => { - log::error!("error when requesting url: {} -> {:?}", &url, err); + log::error!("error when requesting url: {url} -> {err:?}"); if let Some(code) = err.status() { - return match code.as_u16() { - 429 => Err(SearchError::RateLimit), - _ => Err(SearchError::RequestError(code.as_u16())), + if code.as_u16() == 429 { + return Err(GestisError::RateLimit); }; } - Err(SearchError::Logged) + Err(err.into()) } } } + + // see `search/contrib/gestis/helper.rs` + #[cfg(feature = "gestis_helper")] + pub async fn get_raw_substance_data(&self, arg: String) -> Result<(GestisResponse, String)> { + self.get_article(arg).await + } } -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] impl Provider for Gestis { fn get_name(&self) -> String { "Gestis".into() } - async fn get_quick_search_suggestions(&self, search_type: SearchType, pattern: String) -> Result> { + async fn get_quick_search_suggestions(&self, search_type: SearchType, pattern: String) -> SearchResult> { let url = format!( "{}/{}/de?{}={}", BASE_URL, @@ -94,57 +107,44 @@ impl Provider for Gestis { Ok(self.make_request(&url).await?) } - async fn get_search_results(&self, arguments: SearchArguments) -> Result> { + async fn get_search_results(&self, arguments: SearchArguments) -> SearchResult> { let args: Vec = arguments .arguments .into_iter() .map(|a| format!("{}={}", a.search_type.as_str(), a.pattern)) .collect(); - let url = format!( - "{}/{}/de?{}&exact={}", - BASE_URL, - SEARCH, - args.join("&"), - arguments.exact, - ); + let url = format!("{BASE_URL}/{SEARCH}/de?{}&exact={}", args.join("&"), arguments.exact,); let res = self.make_request(&url).await?; Ok(res) } - async fn get_substance_data(&self, identifier: String) -> Result { + async fn get_substance_data(&self, identifier: String) -> SearchResult<::types::SubstanceData> { let (json, url) = self.get_article(identifier).await?; - let data = xml_parser::parse_response(&json)?; + // If you don't have to, save yourself the pain and don't look deeper. + // See the line below as black box that extracts the substance data you need from the response. + let data = xml_parser::parse_response(&json, false)?; let res_data = SubstanceData { - name: Data::new(json.name.clone()), + name: Data::new(json.name), alternative_names: json.aliases.into_iter().map(|a| a.name).collect(), - cas: Data::new(data.cas), - molecular_formula: Data::new(data.molecular_formula), - molar_mass: Data::new(data.molar_mass), - melting_point: Data::new(data.melting_point), - boiling_point: Data::new(data.boiling_point), - water_hazard_class: Data::new(data.water_hazard_class), - lethal_dose: Data::new(data.lethal_dose), - signal_word: Data::new(data.signal_word), - mak: Data::new(data.mak), + cas: Data::new(vec_to_option(data.cas)), + molecular_formula: Data::new(vec_to_option(data.molecular_formula)), + molar_mass: Data::new(vec_to_option(data.molar_mass)), + melting_point: Data::new(vec_to_option(data.melting_point)), + boiling_point: Data::new(vec_to_option(data.boiling_point)), + water_hazard_class: Data::new(vec_to_option(data.water_hazard_class)), + lethal_dose: Data::new(vec_to_option(data.lethal_dose)), + signal_word: Data::new(vec_to_option(data.signal_word)), + mak: Data::new(vec_to_option(data.mak)), amount: None, - h_phrases: Data::new(match data.h_phrases { - Some(inner) => inner, - None => Vec::new(), - }), - p_phrases: Data::new(match data.p_phrases { - Some(inner) => inner, - None => Vec::new(), - }), - symbols: Data::new(match data.symbols { - Some(inner) => inner, - None => Vec::new(), - }), + h_phrases: Data::new(vec_vec_to_vec(data.h_phrases)), + p_phrases: Data::new(vec_vec_to_vec(data.p_phrases)), + symbols: Data::new(vec_vec_to_vec(data.symbols)), source: Source { - provider: "gestis".into(), + provider: "gestis".to_string(), url, last_updated: chrono::Utc::now(), }, @@ -167,3 +167,21 @@ impl SearchType { } } } + +// TODO(#1085) remove again when SubstanceData was reworked + +fn vec_to_option(mut vec: Vec) -> Option { + if vec.is_empty() { + None + } else { + Some(vec.swap_remove(0)) + } +} + +fn vec_vec_to_vec(mut vec: Vec>) -> Vec { + if vec.is_empty() { + Vec::with_capacity(0) + } else { + vec.swap_remove(0) + } +} diff --git a/crates/search/src/gestis/tests.rs b/crates/search/src/gestis/tests.rs new file mode 100644 index 000000000..31513ff4c --- /dev/null +++ b/crates/search/src/gestis/tests.rs @@ -0,0 +1,218 @@ +use std::{fs::File, io::BufReader}; + +use crate::gestis::types::{GestisResponse, ParsedData}; + +use super::xml_parser::parse_response; + +#[derive(Debug, PartialEq)] +pub struct ParsedDataRef { + pub cas: &'static [&'static str], + pub molecular_formula: &'static [&'static str], + pub molar_mass: &'static [&'static str], + pub melting_point: &'static [&'static str], + pub boiling_point: &'static [&'static str], + pub water_hazard_class: &'static [&'static str], + pub h_phrases: &'static [&'static [(&'static str, &'static str)]], + pub p_phrases: &'static [&'static [(&'static str, &'static str)]], + pub signal_word: &'static [&'static str], + pub symbols: &'static [&'static [&'static str]], + pub lethal_dose: &'static [&'static str], + pub mak: &'static [&'static str], +} + +impl ParsedDataRef { + fn to_owned(&self) -> ParsedData { + ParsedData { + cas: string_slice_to_vec(self.cas), + molecular_formula: string_slice_to_vec(self.molecular_formula), + molar_mass: string_slice_to_vec(self.molar_mass), + melting_point: string_slice_to_vec(self.melting_point), + boiling_point: string_slice_to_vec(self.boiling_point), + water_hazard_class: string_slice_to_vec(self.water_hazard_class), + h_phrases: phrase_vec_to_slice(self.h_phrases), + p_phrases: phrase_vec_to_slice(self.p_phrases), + signal_word: string_slice_to_vec(self.signal_word), + symbols: self.symbols.iter().map(|v| string_slice_to_vec(v)).collect(), + lethal_dose: string_slice_to_vec(self.lethal_dose), + mak: string_slice_to_vec(self.mak), + } + } +} + +fn string_slice_to_vec(slice: &[&str]) -> Vec { + slice.iter().map(|s| s.to_string()).collect() +} + +fn phrase_vec_to_slice(slice: &[&[(&str, &str)]]) -> Vec> { + slice + .iter() + .map(|v| { + v.iter() + .map(|t| (t.0.to_string(), t.1.to_string())) + .collect::>() + }) + .collect() +} + +fn load_substance_json(path: &str) -> GestisResponse { + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + serde_json::from_reader(reader).unwrap() +} + +/// parser error +#[test] +fn test_parsing_bananenöl() { + assert_eq!( + ParsedDataRef { + cas: &["628-63-7"], + molecular_formula: &["C7H14O2"], + molar_mass: &["130,19 g/mol"], + melting_point: &["-71 °C"], + boiling_point: &["149 °C"], + water_hazard_class: &["WGK 1"], + h_phrases: &[&[ + ("H226", "Flüssigkeit und Dampf entzündbar."), + ("H412", "Schädlich für Wasserorganismen, mit langfristiger Wirkung.") + ]], + p_phrases: &[&[ + ( + "P210", + "Von Hitze, heißen Oberflächen, Funken, offenen Flammen sowie anderen Zündquellen fernhalten. Nicht rauchen." + ), + ( + "P370+P378", + "Bei Brand: Löschpulver oder Trockensand zum Löschen verwenden." + ) + ]], + signal_word: &["Achtung"], + symbols: &[&["ghs02"]], + lethal_dose: &["> 1600 mg/kg"], + mak: &[], + } + .to_owned(), + parse_response(&load_substance_json("tests/assets/bananenöl.json"), true).unwrap() + ) +} + +/// element -> no structure diagram before molecular mass +#[test] +fn test_parsing_calcium() { + assert_eq!( + ParsedDataRef{ + cas: &["7440-70-2"], + molecular_formula: &["Ca"], + molar_mass: &["40,08 g/mol"], + melting_point: &["839\u{a0}...\u{a0} 841 °C"], + boiling_point: &["1484 °C"], + water_hazard_class: &["WGK 1"], + h_phrases: &[&[("H261", "In Berührung mit Wasser entstehen entzündbare Gase.")]], + p_phrases: &[&[("P223", "Keinen Kontakt mit Wasser zulassen."), ("P232", "Vor Feuchtigkeit schützen."), ("P402+P404", "An einem trockenen Ort aufbewahren. In einem geschlossenen Behälter aufbewahren."), ("P501", "Entsorgung des Inhalts / des Behälters gemäß den örtlichen / regionalen / nationalen / internationalen Vorschriften.")]], + signal_word: &["Gefahr"], + symbols: &[&["ghs02"]], + lethal_dose: &[], + mak: &[], + } + .to_owned(), + parse_response(&load_substance_json("tests/assets/calcium.json"), true).unwrap() + ) +} + +/// multiple: cas, molecular_formula, lethal_dose +/// no: melting_point, boiling_point +#[test] +fn test_parsing_cobaltdinitrat() { + assert_eq!( + ParsedDataRef{ + cas: &["10141-05-6", "10026-22-9"], + molecular_formula: &["Co(NO3)2", "CoN2O6"], + molar_mass: &["182,95 g/mol"], + melting_point: &[], + boiling_point: &[], + water_hazard_class: &["WGK 3"], + h_phrases: &[&[("H272", "Kann Brand verstärken; Oxidationsmittel."), ("H302", "Gesundheitsschädlich bei Verschlucken."), ("H317", "Kann allergische Hautreaktionen verursachen."), ("H318", "Verursacht schwere Augenschäden."), ("H332", "Gesundheitsschädlich bei Einatmen."), ("H334", "Kann bei Einatmen Allergie, asthmaartige Symptome oder Atembeschwerden verursachen."), ("H341", "Kann vermutlich genetische Defekte verursachen."), ("H350i", "Kann bei Einatmen Krebs erzeugen."), ("H360F", "Kann die Fruchtbarkeit beeinträchtigen."), ("H410", "Sehr giftig für Wasserorganismen mit langfristiger Wirkung.")]], + p_phrases: &[&[("P210", "Von Hitze, heißen Oberflächen, Funken, offenen Flammen sowie anderen Zündquellen fernhalten. Nicht rauchen."), ("P280", "Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen."), ("P301+P330+P331", "BEI VERSCHLUCKEN: Mund ausspülen. KEIN Erbrechen herbeiführen."), ("P302+P352", "BEI BERÜHRUNG MIT DER HAUT: Mit viel Wasser und Seife waschen."), ("P304+P340", "BEI EINATMEN: Die Person an die frische Luft bringen und für ungehinderte Atmung sorgen."), ("P305+P351+P338", "BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen."), ("P310", "Sofort GIFTINFORMATIONSZENTRUM oder Arzt anrufen.")]], + signal_word: &["Gefahr"], + symbols: &[&["ghs03", "ghs05", "ghs07", "ghs08", "ghs09"]], + lethal_dose: &["691 mg/kg", "434 mg/kg"], + mak: &[], + } + .to_owned(), + parse_response(&load_substance_json("tests/assets/cobaltdinitrat.json"), true).unwrap() + ) +} + +/// empty symbols, h- and p-phrases +#[test] +fn test_parsing_wasser() { + assert_eq!( + ParsedDataRef { + cas: &["7732-18-5"], + molecular_formula: &["H2O"], + molar_mass: &["18,02 g/mol"], + melting_point: &["0,0 °C"], + boiling_point: &["100 °C"], + water_hazard_class: &[], + h_phrases: &[], + p_phrases: &[], + signal_word: &[], + symbols: &[], + lethal_dose: &["> 89800 mg/kg"], + mak: &[], + } + .to_owned(), + parse_response(&load_substance_json("tests/assets/wasser.json"), true).unwrap() + ) +} + +/// multiple symbols, h- and p-phrases and signal-words +#[test] +fn test_parsing_wasserglas() { + assert_eq!( + ParsedDataRef{ + cas: &["1344-09-8"], + molecular_formula: &[], + molar_mass: &[], + melting_point: &[], + boiling_point: &[], + water_hazard_class: &["WGK 1"], + h_phrases: &[ + &[("H315", "Verursacht Hautreizungen."), ("H319", "Verursacht schwere Augenreizung."), ("H335", "Kann die Atemwege reizen.")], + &[("H315", "Verursacht Hautreizungen."), ("H318", "Verursacht schwere Augenschäden."), ("H335", "Kann die Atemwege reizen.")], + ], + p_phrases: &[ + &[("P261", "Einatmen von Staub/Rauch/Gas/Nebel/Dampf/Aerosol vermeiden."), ("P262", "Nicht in die Augen, auf die Haut oder auf die Kleidung gelangen lassen."), ("P280", "Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen."), ("P303+P361+P353", "BEI BERÜHRUNG MIT DER HAUT (oder dem Haar): Alle kontaminierten Kleidungsstücke sofort ausziehen. Haut mit Wasser abwaschen oder duschen."), ("P305+P351+P338", "BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen.")], + &[("P261", "Einatmen von Staub/Rauch/Gas/Nebel/Dampf/Aerosol vermeiden."), ("P262", "Nicht in die Augen, auf die Haut oder auf die Kleidung gelangen lassen."), ("P280", "Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen."), ("P303+P361+P353", "BEI BERÜHRUNG MIT DER HAUT (oder dem Haar): Alle kontaminierten Kleidungsstücke sofort ausziehen. Haut mit Wasser abwaschen oder duschen."), ("P305+P351+P338", "BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen.")], + ], + signal_word: &["Achtung", "Gefahr"], + symbols: &[&["ghs07"], &["ghs05", "ghs07"]], + lethal_dose: &[], + mak: &[], + } + .to_owned(), + parse_response(&load_substance_json("tests/assets/wasserglas.json"), true).unwrap() + ) +} + +/// multiple lethal doses +#[test] +fn test_parsing_wasserstoffperoxid() { + assert_eq!( + ParsedDataRef{ + cas: &["7722-84-1"], + molecular_formula: &["H2O2"], + molar_mass: &["34,01 g/mol"], + melting_point: &["-0,43 °C", "-11,5 °C", "-40,3 °C"], + boiling_point: &["150,2 °C", "141,3 °C", "125,5 °C"], + water_hazard_class: &["WGK 1"], + h_phrases: &[&[("H271", "Kann Brand oder Explosion verursachen; starkes Oxidationsmittel."), ("H302+H332", "Gesundheitsschädlich bei Verschlucken oder bei Einatmen."), ("H314", "Verursacht schwere Verätzungen der Haut und schwere Augenschäden."), ("H335", "Kann die Atemwege reizen.")]], + p_phrases: &[&[("P220", "Von Kleidung und anderen brennbaren Materialien fernhalten."), ("P261", "Einatmen von Dampf oder Aerosol vermeiden."), ("P280", "Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen."), ("P302+P352+P310", "BEI BERÜHRUNG MIT DER HAUT: Mit viel Wasser und Seife waschen. Sofort GIFTINFORMATIONSZENTRUM oder Arzt anrufen."), ("P305+P351+P338", "BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen."), ("P312", "Bei Unwohlsein GIFTINFORMATIONSZENTRUM oder Arzt anrufen.")]], + signal_word: &["Gefahr"], + symbols: &[&["ghs03", "ghs05", "ghs07"]], + lethal_dose: &["376 mg/kg", "910 mg/kg", "1518 mg/kg"], + mak: &["0,71 mg/m³"], + } + .to_owned(), + parse_response(&load_substance_json("tests/assets/wasserstoffperoxid.json"), true).unwrap() + ) +} diff --git a/crates/search/src/gestis/types.rs b/crates/search/src/gestis/types.rs new file mode 100644 index 000000000..2c877a308 --- /dev/null +++ b/crates/search/src/gestis/types.rs @@ -0,0 +1,62 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, PartialEq)] +pub struct ParsedData { + pub cas: Vec, + pub molecular_formula: Vec, + pub molar_mass: Vec, + pub melting_point: Vec, + pub boiling_point: Vec, + pub water_hazard_class: Vec, + pub h_phrases: Vec>, + pub p_phrases: Vec>, + pub signal_word: Vec, + pub symbols: Vec>, + pub lethal_dose: Vec, + pub mak: Vec, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct GestisResponse { + #[serde(rename = "zvgnummer_mit_null")] + pub zvg_number: String, + pub name: String, + #[serde(rename = "hauptkapitel")] + pub chapters: Vec, + pub aliases: Vec, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct Chapter { + #[serde(rename = "drnr")] + pub number: String, + #[serde(rename = "unterkapitel")] + pub subchapters: Vec, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct Subchapter { + #[serde(rename = "drnr")] + pub number: String, + pub text: Option, +} + +#[derive(Debug, Deserialize, Serialize)] +pub struct Alias { + pub name: String, +} + +#[derive(Debug)] +pub struct ChapterMapping<'a> { + pub boiling_point: Option<&'a str>, + pub cas_number: Option<&'a str>, + pub h_p_signal_symbols: Option<&'a str>, + pub lethal_dose: Option<&'a str>, + /// new version -> sources: MAK, TRGS 900 + pub agw: Option<&'a str>, + /// older version see [Self::agw] + pub mak: Option<&'a str>, + pub melting_point: Option<&'a str>, + pub molecular_formula_molar_mass: Option<&'a str>, + pub water_hazard_class: Option<&'a str>, +} diff --git a/crates/search/src/gestis/xml_parser.rs b/crates/search/src/gestis/xml_parser.rs new file mode 100644 index 000000000..ce20e5193 --- /dev/null +++ b/crates/search/src/gestis/xml_parser.rs @@ -0,0 +1,394 @@ +/* + This parser roughly does the following: + 1. take the JSON response and extract references to all chapters we need by traversing all available chapters (`functions::parse_chapters`) + 2. use a dedicated function for each chapter that extracts the necessary information with setup and error handling in `get_value` + (there may be a more complicated logic, e.g. mak parsing + 3. pack all extracted information into a neat struct that can be used by the gestis handler to fill the SubstanceData struct + + We don't trust gestis so every single XML/HTML string is searched until the end for everything that looks like stuff we could use. + This means, that every function starts with a definition of a `Vec` with some default capacity. + If there is no comment above or behind the value it's the maximum we saw in the wild. So if you find a higher value, + change it (the values will be very low so the memory usage doesn't matter). + + If you are the poor soul who has to fix a bug or change something because the gestis API has changed look in the + `contrib` folder in the search crate. I wrote a helper binary that has some useful features that eases the pain of + reading a JSON response with XML/HTML strings a bit. +*/ +use std::str; + +use lazy_static::lazy_static; +use quick_xml::{ + events::{BytesStart, Event}, + Reader, +}; +use regex::Regex; + +use super::{ + error::Result, + functions::{parse_chapters, ReaderExt}, + types::{GestisResponse, ParsedData}, + GestisError, +}; + +pub fn parse_response(json: &GestisResponse, fail_fast: bool) -> Result { + let mapping = parse_chapters(json); + + let cas = get_value("read_cas", read_cas, mapping.cas_number, fail_fast)?; + let melting_point = get_value("read_mp_bp", read_mp_bp, mapping.melting_point, fail_fast)?; + let boiling_point = get_value("read_mp_bp", read_mp_bp, mapping.boiling_point, fail_fast)?; + let water_hazard_class = get_value("read_whc", read_whc, mapping.water_hazard_class, fail_fast)?; + let lethal_dose = get_value("read_ld50", read_ld50, mapping.lethal_dose, fail_fast)?; + + let (molecular_formula, molar_mass) = get_value( + "read_molecular_formula", + read_molecular_formula_molar_mass, + mapping.molecular_formula_molar_mass, + fail_fast, + )?; + + let (h_phrases, p_phrases, symbols, signal_word) = get_value( + "get_h_p_signal_symbols", + get_h_p_signal_symbols, + mapping.h_p_signal_symbols, + fail_fast, + )?; + + let mak = { + let mak = get_value("read_mak(agw)", read_mak, mapping.agw, fail_fast); + + if mak.is_err() || mak.as_ref().unwrap().is_empty() { + log::debug!("read_mak: AGW not available"); + get_value("read_mak(mak)", read_mak, mapping.mak, fail_fast)? + } else { + mak? + } + }; + + Ok(ParsedData { + cas, + molecular_formula, + molar_mass, + melting_point, + boiling_point, + water_hazard_class, + h_phrases, + p_phrases, + signal_word, + symbols, + lethal_dose, + mak, + }) +} + +fn get_value(name: &str, f: F, xml: Option<&str>, fail_fast: bool) -> Result +where + T: Default, + F: Fn(Reader<&[u8]>) -> Result, +{ + if let Some(xml) = xml { + let mut reader = Reader::from_str(xml); + reader.trim_text(true); + // gestis responses are malformed anyway ¯\_(ツ)_/¯ + reader.check_end_names(false); + + match f(reader) { + Ok(res) => Ok(res), + Err(GestisError::MissingInfo(i)) => { + log::warn!("missing info: {i}"); + + Ok(T::default()) + } + Err(err) => { + log::error!("{name}: {err:?}"); + + if fail_fast { + Err(err) + } else { + Ok(T::default()) + } + } + } + } else { + Ok(T::default()) + } +} + +fn read_cas(mut reader: Reader<&[u8]>) -> Result> { + let mut cas_numbers = Vec::with_capacity(2); + + loop { + if let Event::Eof = reader.find_start("casnr")? { + break; + } + + cas_numbers.push(reader.read_text_unbuffered("casnr")?); + } + + log::debug!("CAS: {cas_numbers:?}"); + + Ok(cas_numbers) +} + +fn read_molecular_formula_molar_mass(mut reader: Reader<&[u8]>) -> Result<(Vec, Vec)> { + let mut molecular_formulas = Vec::with_capacity(2); + let mut molar_mass_values = Vec::with_capacity(2); + + loop { + match reader.read_event_unbuffered()? { + Event::Start(e) => match e.name() { + b"summenformel" => loop { + match reader.read_event_unbuffered()? { + Event::Text(t) => molecular_formulas.push(t.unescape_and_decode(&reader)?), + Event::End(e) => { + if e.name() == b"summenformel" { + break; + } + } + e => log::debug!("unexpected event: {e:?}"), + } + }, + b"b" => { + if &reader.read_text_unbuffered("b")? == "Molmasse:" { + reader.find_start("td")?; + molar_mass_values.push(reader.read_text_unbuffered("td")?); + } + } + _ => {} + }, + Event::Eof => break, + _ => {} + } + } + + log::debug!("molecular_formula: {molecular_formulas:?}"); + log::debug!("molar_mass: {molar_mass_values:?}"); + + Ok((molecular_formulas, molar_mass_values)) +} + +fn read_mp_bp(mut reader: Reader<&[u8]>) -> Result> { + let mut mp_bps = Vec::with_capacity(2); + + loop { + if Event::Eof == reader.find_table("feldmitlabel")? { + break; + } + + reader.find_start("td")?; + reader.find_start("td")?; // skip to next one + + mp_bps.push(reader.read_text_unbuffered("td")?); + } + + log::debug!("MP/BP: {mp_bps:?}"); + + Ok(mp_bps) +} + +/// Reads water hazard class +fn read_whc(mut reader: Reader<&[u8]>) -> Result> { + let mut water_hazard_classes = Vec::with_capacity(2); + + loop { + match reader.read_event_unbuffered()? { + Event::Start(e) => { + if e.name() == b"td" { + if let Ok(text) = reader.read_text_unbuffered("td") { + if text.starts_with("WGK") { + water_hazard_classes.push(text.split(' ').take(2).collect::>().join(" ")); + } + } + } + } + Event::Eof => break, + _ => {} + } + } + + log::debug!("WHC: {water_hazard_classes:?}"); + + Ok(water_hazard_classes) +} + +type HPSignalSymbolsResult = Result<( + Vec>, + Vec>, + Vec>, + Vec, +)>; + +fn get_h_p_signal_symbols(mut reader: Reader<&[u8]>) -> HPSignalSymbolsResult { + // there shouldn't be more than two entries for each item + let mut h_phrases = Vec::with_capacity(2); + let mut p_phrases = Vec::with_capacity(2); + let mut symbols = Vec::with_capacity(2); + let mut signal_words = Vec::with_capacity(2); + + loop { + if Event::Eof == reader.find_table("block")? { + break; + }; + reader.find_start("td")?; + + match reader.read_event_unbuffered()? { + Event::Start(e) => match e.name() { + b"b" => { + let name = reader.read_text_unbuffered("b")?; + + if name.ends_with(" H-Sätze:") { + h_phrases.push(read_h_p_phrases(&mut reader)?); + } else if name.ends_with(" P-Sätze:") { + p_phrases.push(read_h_p_phrases(&mut reader)?); + } + } + b"table" => { + reader.find_start("td")?; + reader.find_start("td")?; // skip to next one + signal_words.push(reader.read_text_unbuffered("td")?.trim_matches('"').to_string()); + } + _ => {} + }, + Event::Empty(e) => { + if e.name() == b"img" { + symbols.push(get_ghs_symbols(&mut reader, e)?); + } + } + Event::Text(e) => log::debug!("found text: {:?}", e.unescape_and_decode(&reader)), + Event::Eof => break, + e => return Err(GestisError::UnexpectedEvent(format!("{e:?}"))), + } + } + + log::debug!("h_phrases: {h_phrases:?}"); + log::debug!("p_phrases: {p_phrases:?}"); + log::debug!("symbols: {symbols:?}"); + log::debug!("signal_words: {signal_words:?}"); + + Ok((h_phrases, p_phrases, symbols, signal_words)) +} + +fn get_ghs_symbols(reader: &mut Reader<&[u8]>, first: BytesStart) -> Result> { + #[inline(always)] + fn decode_attribute(b: BytesStart, reader: &Reader<&[u8]>) -> Result> { + let symbol = b.try_get_attribute("alt")?; + log::debug!("src: '{:?}', alt: '{symbol:?}'", b.try_get_attribute("src")?); + + Ok(if let Some(s) = symbol { + Some(reader.decode(&s.value)?.to_string()) + } else { + None + }) + } + + // there are never all 9 ghs symbols at the same time so with this we would reallocate at most once + let mut symbols = Vec::with_capacity(4); + + if let Some(symbol) = decode_attribute(first, reader)? { + symbols.push(symbol); + } + + loop { + match reader.read_event_unbuffered()? { + Event::Empty(e) => { + if e.name() == b"img" { + if let Some(symbol) = decode_attribute(e, reader)? { + symbols.push(symbol); + } + } + } + Event::End(e) => { + if e.name() == b"tr" { + break; + } + } + Event::Eof => break, + _ => {} + } + } + + symbols.sort_unstable(); + + Ok(symbols) +} + +fn read_h_p_phrases(reader: &mut Reader<&[u8]>) -> Result> { + let mut phrases = Vec::with_capacity(5); // some random default, may be changed in the future + + reader.find_start("td")?; + loop { + match reader.read_event_unbuffered()? { + Event::End(e) => { + if e.name() == b"td" { + break; + } + } + Event::Eof => break, + Event::Text(t) => { + if let Some((number, phrase)) = t.unescape_and_decode(reader)?.split_once(": ") { + phrases.push((number.to_string(), phrase.to_string())); + } else { + log::debug!("wrongly formatted phrase: {t:?}"); + } + } + Event::Empty(_) => {} + Event::Start(b) => { + if b.name() == b"verstecktercode" { + reader.read_to_end_unbuffered("verstecktercode")?; + } else { + log::debug!("unexpected event: {:?}", Event::Start(b)); + } + } + e => log::debug!("unexpected event: {e:?}"), + } + } + + phrases.sort_unstable_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); + + Ok(phrases) +} + +fn read_ld50(mut reader: Reader<&[u8]>) -> Result> { + let mut ld50_values = Vec::with_capacity(2); // mostly one or two values + + loop { + if let Event::Eof = reader.find_start("b")? { + break; + } + + let text = reader.read_text_unbuffered("b")?; + if &text == "LD50 oral Ratte" { + reader.find_start("td")?; + reader.find_start("td")?; // skip to next one + + ld50_values.push(reader.read_text_unbuffered("td")?); + } + } + + log::debug!("LD50: {ld50_values:?}"); + + Ok(ld50_values) +} + +fn read_mak(mut reader: Reader<&[u8]>) -> Result> { + lazy_static! { + static ref MAK_RE: Regex = Regex::new(r"\d+[,.]\d+ (mg/m³|ppm)").unwrap(); + } + + let mut mak_values = Vec::with_capacity(2); // mostly just one or two + + loop { + if Event::Eof == reader.find_start("td")? { + break; + } + + if let Ok(text) = reader.read_text_unbuffered("td") { + if MAK_RE.is_match(&text) { + mak_values.push(text); + } + } + } + + log::debug!("MAK: {mak_values:?}"); + + Ok(mak_values) +} diff --git a/crates/search/src/handler.rs b/crates/search/src/handler.rs new file mode 100644 index 000000000..8b4482002 --- /dev/null +++ b/crates/search/src/handler.rs @@ -0,0 +1,119 @@ +use std::{borrow::Borrow, collections::HashMap}; + +use ::types::SubstanceData; +use cfg_if::cfg_if; +use lazy_static::lazy_static; + +use types::{lock::RwLockWrapper, ProviderMapping}; + +use crate::{ + error::{Result, SearchError}, + types::{Provider, ProviderInfo, SearchArguments, SearchResponse, SearchType}, +}; + +lazy_static! { + pub static ref REGISTERED_PROVIDERS: RwLockWrapper>> = + RwLockWrapper::new(HashMap::new()); +} + +pub async fn init_providers(_version: &str) -> Result<()> { + log::trace!("initializing providers"); + let mut providers = REGISTERED_PROVIDERS.write().await; + + #[cfg(feature = "gestis")] + { + cfg_if! { + if #[cfg(target_family = "wasm")] { + let client = reqwest::ClientBuilder::new().build().map_err(crate::gestis::GestisError::from)?; + } else { + let client = reqwest::ClientBuilder::new().user_agent(&format!("cabr2/v{}", _version)).build().map_err(crate::gestis::GestisError::from)?; + } + } + + providers.insert("gestis", Box::new(crate::gestis::Gestis::new(client))); + } + + log::trace!("dropping provider lock..."); + Ok(()) +} + +pub async fn get_provider_mapping() -> ProviderMapping { + let providers = REGISTERED_PROVIDERS.read().await; + + let mut mapping = HashMap::new(); + for (id, provider) in providers.iter() { + mapping.insert(id.to_string(), provider.get_name()); + } + + mapping +} + +pub async fn get_available_providers() -> Vec { + let providers = REGISTERED_PROVIDERS.read().await; + + let mut providers: Vec = providers + .iter() + .map(|(key, provider)| ProviderInfo { + name: provider.get_name(), + identifier: key.to_string(), + }) + .collect(); + + providers.push(ProviderInfo { + identifier: "custom".into(), + name: "Custom".into(), + }); + + providers +} + +pub async fn get_quick_search_suggestions( + provider: String, + search_type: SearchType, + pattern: String, +) -> Result> { + if pattern.len() < 2 { + return Ok(vec![]); + } + + let providers = REGISTERED_PROVIDERS.read().await; + + if let Some(provider) = providers.get(&provider.borrow()) { + return provider.get_quick_search_suggestions(search_type, pattern).await; + } + + Err(SearchError::UnknownProvider(provider)) +} + +pub async fn get_search_results(provider: String, arguments: SearchArguments) -> Result> { + let arguments = SearchArguments { + arguments: arguments + .arguments + .into_iter() + .filter(|a| !a.pattern.is_empty()) + .collect(), + ..arguments + }; + + if arguments.arguments.is_empty() { + return Ok(vec![]); + } + + let providers = REGISTERED_PROVIDERS.read().await; + + if let Some(provider) = providers.get(&provider.borrow()) { + return provider.get_search_results(arguments).await; + } + + Err(SearchError::UnknownProvider(provider)) +} + +pub async fn get_substance_data(provider: String, identifier: String) -> Result { + let providers = REGISTERED_PROVIDERS.read().await; + + if let Some(provider) = providers.get(&provider.borrow()) { + return provider.get_substance_data(identifier).await; + } + + Err(SearchError::UnknownProvider(provider)) +} diff --git a/src-tauri/cabr2_search/src/lib.rs b/crates/search/src/lib.rs similarity index 64% rename from src-tauri/cabr2_search/src/lib.rs rename to crates/search/src/lib.rs index 27a84df64..28173312d 100644 --- a/src-tauri/cabr2_search/src/lib.rs +++ b/crates/search/src/lib.rs @@ -2,7 +2,7 @@ #![allow(clippy::unnecessary_unwrap)] #![allow(clippy::upper_case_acronyms)] -mod error; +pub mod error; pub mod handler; pub mod types; @@ -10,10 +10,3 @@ pub mod types; mod gestis; #[cfg(feature = "gestis_helper")] pub mod gestis; - -#[cfg(feature = "tauri_plugin")] -pub mod plugin; -#[cfg(feature = "wasm")] -pub mod wasm; -#[cfg(feature = "webserver")] -pub mod webserver; diff --git a/src-tauri/cabr2_search/src/types.rs b/crates/search/src/types.rs similarity index 90% rename from src-tauri/cabr2_search/src/types.rs rename to crates/search/src/types.rs index 006aa862b..91e74e2e0 100644 --- a/src-tauri/cabr2_search/src/types.rs +++ b/crates/search/src/types.rs @@ -1,12 +1,12 @@ use async_trait::async_trait; use serde::{Deserialize, Serialize}; -use cabr2_types::SubstanceData; +use ::types::SubstanceData; use super::error::Result; -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] +#[cfg_attr(not(target_family = "wasm"), async_trait)] +#[cfg_attr(target_family = "wasm", async_trait(?Send))] pub trait Provider { fn get_name(&self) -> String; async fn get_quick_search_suggestions(&self, search_type: SearchType, pattern: String) -> Result>; diff --git "a/crates/search/tests/assets/bananen\303\266l.json" "b/crates/search/tests/assets/bananen\303\266l.json" new file mode 100644 index 000000000..5c05f04a0 --- /dev/null +++ "b/crates/search/tests/assets/bananen\303\266l.json" @@ -0,0 +1 @@ +{"zvgnummer": "31930", "zvgnummer_mit_null": "031930", "name": "Pentylacetat", "sortiername": "Pentylacetat", "aliases": [{"name": "Amylacetat", "sortiername": "Amylacetat"}, {"name": "Essigsäureamylester", "sortiername": "Essigsäureamylester"}, {"name": "1-Pentanolacetat", "sortiername": "Pentanolacetat"}, {"name": "Birnenöl", "sortiername": "Birnenöl"}, {"name": "Birnenether", "sortiername": "Birnenether"}, {"name": "Bananenöl", "sortiername": "Bananenöl"}, {"name": "Amylessigester", "sortiername": "Amylessigester"}], "hauptkapitel": [{"drnr": "1300", "ueberschrift": null, "unterkapitel": [{"drnr": "1303", "text": null}], "tables": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs02\"\n \n \n \n \n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-Chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin und Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
\n "}, {"drnr": "0100", "ueberschrift": "IDENTIFIKATION\n ", "unterkapitel": [{"drnr": "0100", "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Pentylacetat\n
\n Amylacetat\n
\n Essigsäureamylester\n
\n 1-Pentanolacetat\n
\n Birnenöl\n
\n Birnenether\n
\n Bananenöl\n
\n Amylessigester\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
ZVG Nr:\n 31930\n
\n \n \n \n \n \n \n \n \n \n \n
CAS Nr:\n 628-63-7\n \n
\n \n \n \n \n \n \n \n \n \n \n
EG Nr:\n 211-047-3\n \n
\n \n \n \n \n \n \n \n \n \n
INDEX Nr:\n 607-130-00-2\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n "}], "links": null}, {"drnr": "0300", "ueberschrift": "CHARAKTERISIERUNG\n ", "unterkapitel": [{"drnr": "0301", "text": "\n STOFFGRUPPENSCHLÜSSEL\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
143400Carbonsäureester
\n "}, {"drnr": "0303", "text": "\n AGGREGATZUSTAND\n \n \n
\n
\n \n \n \n \n \n \n \n
\n FlüssigkeitDer Stoff ist flüssig.
\n "}, {"drnr": "0304", "text": "\n EIGENSCHAFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
farblos
fruchtiger Geruch
\n "}, {"drnr": "0305", "text": "\n CHEMISCHE CHARAKTERISIERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Entzündbare Flüssigkeit.
Dämpfe können mit Luft beim Erhitzen des Stoffes über seinen Flammpunkt explosive Gemische bilden.
Dies ist bereits bei erhöhter Umgebungstemperatur möglich.
Schwer löslich in Wasser.
Leichter als Wasser.
Mittel oder schwer flüchtig.
\n "}, {"drnr": "0307", "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Stoffinformationen in Wikipedia\n
\n
\n "}], "links": null}, {"drnr": "0400", "ueberschrift": "FORMEL\n ", "unterkapitel": [{"drnr": "0400", "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n C7H14O2\n
\n \n \n \n \n \n \n \n \n \n \n
C7H14O2
\n \"031930\"\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Molmasse: 130,19 g/mol
\n
Umrechnungsfaktor (Gasphase) bei 1013 mbar und 20 °C:
\n \n \n \n \n \n \n \n \n \n
1 ml/m³  =   5,41 mg/m³
\n
\n "}], "links": null}, {"drnr": "0600", "ueberschrift": "PHYSIKALISCH CHEMISCHE EIGENSCHAFTEN\n ", "unterkapitel": [{"drnr": "0602", "text": "\n SCHMELZPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Schmelzpunkt:-71 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n "}, {"drnr": "0603", "text": "\n SIEDEPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Siedepunkt:149 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n "}, {"drnr": "0604", "text": "\n DICHTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert:0,88 g/cm³
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur:20 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
RELATIVE GASDICHTE
Dichteverhältnis zu trockener Luft bei gleicher Temperatur und gleichem Druck
\n \n \n \n \n \n \n \n \n \n
Wert:4,49
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
RELATIVE DICHTE DES DAMPF-LUFT-GEMISCHES
Dichteverhältnis zu trockener Luft bei 20 °C und Normaldruck
\n \n \n \n \n \n \n \n \n \n
Wert: 1,02
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n "}, {"drnr": "0605", "text": "\n DAMPFDRUCK\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 5,3 hPa
Temperatur: 20 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00105 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck:47,3 hPa
Temperatur:65 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00446 
\n "}, {"drnr": "0607", "text": "\n FLAMMPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Flammpunkt:41 °C
\n
Messung im geschlossenen Tiegel
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n "}, {"drnr": "0608", "text": "\n ZÜNDTEMPERATUR\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Zündtemperatur:350 °C
\n
\n \n \n \n \n \n \n \n \n \n
Temperaturklasse:T2
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n "}, {"drnr": "0609", "text": "\n EXPLOSIONSDATEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Untere Explosionsgrenze:
1,0 Vol.-%
54 g/m³
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Obere Explosionsgrenze:
7,5 Vol.-%
405 g/m³
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Grenzspaltweite:0,98 mm
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Explosionsgruppe:IIA
\n
\n \n \n \n \n \n \n \n \n \n \n
Maximaler Explosionsdruck:
8,4 bar
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n "}, {"drnr": "0613", "text": "\n WASSERLÖSLICHKEIT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Löslichkeit:1,7 g/l
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur:20 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00440 
\n "}, {"drnr": "0619", "text": "\n GEFÄHRLICHES REAKTIONSVERHALTEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Thermische Zersetzung:
Zersetzung in der Hitze.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Zersetzungsprodukte:
Essigsäure
Kohlenwasserstoffe
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefährliche chemische Reaktionen:
 
Der Stoff kann in gefährlicher Weise reagieren mit:
starken Oxidationsmitteln
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 06002 99999 
\n "}], "links": "\n \n \n \n
\n \n Schmelzpunkt\n | \n Siedepunkt\n | \n Dichte\n | \n Dampfdruck\n | \n Flammpunkt\n | \n Zündtemperatur\n | \n Explosionsdaten\n | \n Löslichkeit\n | \n Gefährliche Reaktionen\n \n
\n "}, {"drnr": "0500", "ueberschrift": "TOXIKOLOGIE / ÖKOTOXIKOLOGIE\n ", "unterkapitel": [{"drnr": "0501", "text": "\n TOXIKOLOGISCHE DATEN\n \n \n
\n
\n \n \n \n \n \n \n \n
LD50 oral Ratte
\n \n \n \n \n \n \n \n \n \n
Wert:> 1600 mg/kg
\n \n \n \n \n \n \n \n
National Technical Information Service. Vol. OTS0556694,
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 02071 
\n "}], "links": null}, {"drnr": "0700", "ueberschrift": "ARBEITSMEDIZIN UND ERSTE HILFE\n ", "unterkapitel": [{"drnr": "0701", "text": "\n AUFNAHMEWEGE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hauptaufnahmewege:
Der Hauptaufnahmeweg für 1-Pentylacetat (1PA; Synonym: n-Amylacetat) verläuft über den Atemtrakt. [7619]
1PA wird in verschiedenen Reinheitsgraden gehandelt (85 - 89%ig bis analytisch rein). [419]
Industrielle Bedeutung haben aber vor allem Isomerengemische, in denen 1PA die Hauptkomponente ist: „primäres Amylacetat“ (meist 65 % 1PA, 35 % 2-Methylbutylacetat), „handelsübliches n-Amylacetat (62 - 78 % 1PA, 20 - 37 % 2-Methylbutylacetat), sowie „technisches Amylacetat“ (1PA Hauptkomponente, keine Gehaltsangaben). [7619, 99996]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemwege:
1PA besitzt eine relativ hohe Flüchtigkeit, so dass sich über der Flüssigkeit schon bei Raumtemperatur hohe Dampfkonzentrationen ausbilden können. Herstellung und Lagerung erfolgen allerdings üblicherweise in geschlossenen Systemen, um die Freisetzung von Dämpfen zu vermeiden. [435]
Inhaliertes 1PA wird über den Atemtrakt leicht resorbiert. Der in vitro ermittelte Blut/Luft-Verteilungskoeffizient (92) lässt eine sehr hohe Resorptionsrate erwarten. [99996]
Ein inhalativer Tierversuch weist darauf hin, dass 1PA im Atemtrakt zum Teil bereits hydrolysiert wird. 10 - 20 min nach Beginn einer Exposition gegenüber „primärem Amylacetat“ waren im Blut von Ratten 1PA und in doppelt so hohen Konzentrationen das Hydrolyseprodukt 1-Pentanol nachweisbar (vgl. „Stoffwechsel“). [435]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Haut:
Kinetische Studien zur Hautresorption liegen nicht vor. [99983]
Auf der Grundlage physiko-chemischer Daten wurde mittels eines mathematischen Modells abgeschätzt, dass 1PA aus gesättigter wässriger Lösung mit einer Resorptionsrate um 0,46 mg/cm² pro h perkutan aufgenommen werden kann. [99996] Der Beitrag der Hautaufnahme zur Gesamtexposition am Arbeitsplatz ist damit nicht vernachlässigbar, wird aber als toxikologisch nicht relevant angesehen. [7619]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verdauungstrakt:
Alkylester des Strukturtyps von 1PA unterliegen im Verdauungstrakt im Allgemeinen schnell der hydrolytischen Spaltung. [99996]
Für 1PA bzw. seine Hydrolyseprodukte sollte von einer effektiven Resorption ausgegangen werden, obwohl spezielle kinetische Daten fehlen. [8089, 99999]
\n "}, {"drnr": "0702", "text": "\n WIRKUNGSWEISEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hauptwirkungsweisen:
akut:
Reizwirkung auf Augen und Haut, Reizung der Atemwege,
bei hohen Konzentrationen Störung im Zentralnervensystem [7619]
chronisch:
Hautveränderungen, Reizwirkung auf Schleimhäute, [7748, 7619]
zu systemischen Wirkungen keine ausreichenden Angaben [99983]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Akute Toxizität:
Die verfügbaren Daten zur akuten Wirkung beziehen sich meist nicht auf reines 1PA, sondern auf handelsübliche Isomerengemische, in denen 1PA die Hauptkomponente ist. Weitere Daten finden sich für „Amylacetat“, das nicht eindeutig deklariert ist.
Da die isomeren Pentylacetate bezüglich der akuten Wirkung keine großen Unterschiede erkennen lassen, werden Informationen über die Isomerengemische als aussagefähig auch für reines 1PA angesehen. [7619]
In einer älteren Testung am Kaninchenauge bewirkte unverdünntes „Amylacetat“ (0,5 ml; Isomerengemisch, k.w.A.) geringe Augenreizungen mit minimalen Hornhautschäden (Reizindex 2 von max. 10). Die Testung von „primärem Amylacetat“ (0,1 ml) am Kaninchenauge führte zu mäßiger Bindehautreizung (reversibel innerhalb von 3 Tagen), Hornhautschädigungen traten nicht auf.
Am Kaninchenohr fand man nach einmaliger, offener Applikation von „Amylacetat“ (Isomerengemisch, k.w.A.) geringe Reizungen (Reizindex 3 von max. 10).
Nach 4stündiger abgedeckter Einwirkung von unverdünntem „primärem Amylacetat“ (0,5 ml) auf die Haut von Kaninchen zeigten sich mäßige Rötung und leichte Schwellungen. 7 Tage später wurde leichte Abschuppung der Haut registriert. [99996, 7619, 435]
In einer Testung an Probanden (n = 25, zusätzlich Kontrollgruppe) löste 30%ige Lösung von „handelsüblichem n-Amylacetat“ keine irritativen oder phototoxischen Reaktionen aus.
In Probandentests mit 20%igem „primärem Amylacetat“ („repeat insult patch test“ an ca. 200 Probanden, Test auf Photoallergie an 25 Probanden) fanden sich auch keine Hinweise auf ein sensibilisierendes oder photoallergenes Potential. [99996, 435]
Ein Sensibilisierungstest an Meerschweinchen (Maximierungstest) mit „primärem Amylacetat“ ergab nur sehr schwache Reaktionen; ein signifikantes hautsensibilisierendes Potential war daraus nicht abzuleiten. [7619, 435]
In einem dermalen Toxizitätstest an Kaninchen hat sich „primäres Amylacetat“ als praktisch untoxisch erwiesen. Bei abgedeckter Einwirkung in unverdünnter Form über 24 h lag die LD50 bei 8360 bzw. > 14080 mg/kg KG für männl. bzw. weibl. Tiere. Beobachtet wurden lokale Hautschäden (Abschilferung, Verschorfung). Männl. Tiere, die verendeten, zeigten verminderte Aktivität und Erschöpfung. [435]
Zur Wirkung inhalativer Exposition beim Menschen liegen Hinweise aus Probandenstudien vor, die mit nicht näher spezifiziertem „Amylacetat“ durchgeführt wurden:
Bei Exposition gegenüber 200 ppm „Amylacetat“ über 3 - 5 min empfanden Probanden starke Rachenreizungen und schwache Reizungen von Augen und Nase. Bei 100 ppm empfanden einige der Probanden noch leichte Rachenreizungen. [7619, 435]
In einer neueren, aber begrenzt aussagefähigen Studie wurden bei Probanden, die 1,3; 4; 13 oder 42 ppm „Amylacetat“ jeweils 10 sec inhalierten, eine geringe Reduktion des Atemzugvolumens und subjektiv schwache Nasenreizungen festgestellt. [7619, 99996]
Ein an 4 anosmischen Probanden ermittelter Schwellenwert für Nasenreizungen durch „Amylacetat“ lag bei 266 ppm. [7619]
Aus dem beruflichen Umgang wurde nach (wahrscheinlich sehr hoher/ längerer) Exposition gegenüber „Amylacetat/Isoamylacetat“ (hier meist 3-Methylbutylacetat) über Reizungen der Augen und Atemwege, Schwindel, Schwäche, Benommenheit, hohen Puls, Zittern, Kopfschmerz und Übelkeit berichtet. Gewöhnungseffekte wurden beobachtet. Zuverlässige Angaben zu Expositionshöhe und -dauer fehlen. [99996, 7836, 7979]
Ein speziell mit 1PA durchgeführter Tierversuch ließ eine geringe Toxizität erkennen.
Ratten, die 6 h gegenüber bis zu 3000 ppm 1PA exponiert wurden (Ganzkörper-Exposition), zeigten weder Intoxikationssymptome, noch kam es zu Todesfällen. Auch spezielle Testungen zur Neurotoxizität ergaben keine Normabweichungen. [419]
Eine 6stündige Exposition gegenüber ca. 3600 - 3700 ppm „primäres Amylacetat“ führte bei Ratten zu erschwerter Atmung und zur Beeinflussung verschiedener Reflexe. Eine von 10 Ratten verendete (Autopsiebefund: gerötete Lunge). [435, 7619]
Insgesamt lassen die verfügbaren Informationen bei Kurzzeitexposition als wesentliche Wirkungen Reizungen im Atemtrakt, in geringerem Maße der Augen und bei sehr hohen Konzentrationen Störungen im Zentralnervensystem erwarten. [435]
In oralen Toxizitätstests an Nagern haben sich Pentylacetat-Isomere als gering toxisch erwiesen. Für „Amylacetat“ (Isomerengemisch, k.w.A.) wurde an Ratten eine LD50 von 6500 mg/kg KG bestimmt. Für „primäres Amylacetat“ fand man in einer neueren Testung an Ratten LD50-Werte von 12 bis >14 g/kg KG. Die Tiere zeigten Symptome von ZNS-Störungen (Trägheit, Atemdepression, unkoordinierter Gang und Erschöpfung). [7619, 435]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Chronische Toxizität:
Allgemein wird darauf hingewiesen, dass wiederholter Hautkontakt mit 1PA zu Entfettung und Rissigwerden der Haut, in der Folge auch zu Entzündungen (Dermatitis) führen kann. [7636, 7748, 419]
Aus dem beruflichen Umgang wurde berichtet, dass 30 Arbeiter, die in der Filmherstellung gegenüber „Amylacetat“ (k.w.A.) in Konzentrationen von 3700 - 14800 ppm exponiert waren, über Lichtempfindlichkeit, Reizung der Augenbindehaut und Tränenfluss während der Tätigkeit klagten. Bei 4 dieser Arbeiter, die 4 - 9 Jahre exponiert gewesen waren, fanden sich diese Symptome in besonders starker Ausprägung, zudem Gesichtsfeldeinschränkung und Schädigung des Sehnervs (bilaterale oder monolaterale „Subatrophie“).
Eine Sehnervschädigung (Degeneration) konnte auch in einer Studie an Kaninchen nachgewiesen werden, die 60 Tage gegenüber 7500 ppm „Amylacetat“ (2 h/d) exponiert waren. [7619]
Ein speziell mit 1PA durchgeführter Langzeittierversuch ließ im Bereich weniger hoher Konzentrationen keine deutliche systemische Toxizität erkennen:
In einer 13-Wochen-Studie wurden Ratten gegenüber 300, 600 oder 1200 ppm 1PA (Ganzkörper-) exponiert. Bei den Tieren fand man keine Intoxikationszeichen und keine Abweichungen von Körpergewicht und Futterverbrauch. Lediglich in den ersten beiden Wochen wurde eine geringe Abnahme der Aktivität bei Exposition gegenüber 600 und 1200 ppm festgestellt. Auch spezielle Testungen der exponierten Tiere auf Neurotoxizität ließen keine Funktionsstörungen erkennen und bei der Autopsie fanden sich keine Veränderungen des Nervengewebes. [419]
Für „primäres Amylacetat“ wurde in einer analogen 13-Wochen-Studie an Ratten gleichfalls 1200 ppm als NOAEC bestimmt.
„Primäres Amylacetat“ zeigte auch in einer oralen Langzeitstudie an Ratten eine nur geringe Toxizität. Bis zur höchsten im Futter verabreichten Dosis von 1 % (entsprechend ca. 650 mg/kg KG) fanden sich keine Anzeichen toxischer Wirkung. [435]
Im Hinblick auf die Festlegung von Arbeitsplatzgrenzwerten wird die Reizwirkung im Atemtrakt als der kritische Effekt gesehen. [7619]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reproduktionstoxizität, Mutagenität, Kanzerogenität:
Zur Einstufung des fortpflanzungsgefährdenden, erbgutverändernden und krebserzeugenden Potentials s. Stoffliste nach Anhang VI der GHS-Verordnung / TRGS 905 / MAK-Liste (s. Kapitel VORSCHRIFTEN).
Reproduktionstoxizität:
Ein Risiko der Fruchtschädigung braucht bei Einhaltung des Arbeitsgrenzwertes bzw. MAK-Wertes und des BGW oder BAT-Wertes nicht befürchtet zu werden.
Die Einstufung basiert auf dem Ergebnis von 2 Studien zur Entwicklungstoxizität, die mit „primärem Amylacetat“ (65 % 1PA, 35 % 2-Methylbutylacetat) durchgeführt wurden. Das Gemisch war für Ratten in Konzentrationen bis 500 ppm, für Kaninchen bis 1500 ppm nicht entwicklungstoxisch. Bei Ratten fanden sich bei 1000 ppm nur leichte fetotoxische Effekte. Eine gleichartige Wirkung beider Pentylacetat-Isomere wird vorausgesetzt. [7619]
Untersuchungen zur Beeinflussung der Fertilität liegen nicht vor. [99983] Im Rahmen von subchronischen Studien fanden sich aber keine Hinweise auf Schädigungen von Geschlechtsorganen. [435]
Mutagenität:
„Primäres Amylacetat“ hat sich in mikrobiologischen Testungen als nicht mutagen erwiesen. Auch in verschiedenen Testungen an Säugerzellen fanden sich keine Hinweise auf genotoxisches Potential. [7619, 435]
Kanzerogenität:
Zur kanzerogenen Wirkung liegen keine aussagefähigen Untersuchungen vor. [99983] Aufgrund der Kenntnisse zur Verstoffwechselung (vgl. unten) sowie der fehlenden Genotoxizität von „primärem Amylacetat“ ergeben sich jedoch keine Verdachtsmomente für ein kanzerogenes Potential. [7619]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Stoffwechsel und Ausscheidung:
1PA wird im Körper schnell zu 1-Pentanol und Essigsäure hydrolysiert.
In einer Untersuchung an Gewebspräparaten von Nase, Leber, Lunge und Trachea von Nagern fand sich die höchste hydrolytische Aktivität in der Leber, gefolgt vom Nasengewebe. Bei Acetaten geradkettiger Alkohole nahm die Hydrolysegeschwindigkeit bis zum Pentylrest zu und mit weiter steigender Kettenlänge wieder ab. Im Vergleich zum Ethylacetat wurde 1PA ca. 3mal schneller hydrolysiert. [7619]
Hydrolytisch gebildetes 1-Pentanol kann im Körper über Valeraldehyd zu Valeriansäure oxidiert werden. Diese Verstoffwechselung erfolgt gleichfalls sehr rasch. Das Hydrolyseprodukt Essigsäure geht in den physiologischen Stoffwechsel ein. [7619, 99996]
Dieser Stoffwechselverlauf wird durch das Ergebnis einer mit „primärem Amylacetat“ durchgeführten kinetischen Studie an Ratten untersetzt: 10 - 20 min nach Beginn einer 90minütigen inhalativen Exposition gegenüber 2000 ppm „primärem Amylacetat“ waren im Blut der Tiere 1PA (32 µmol) und doppelt soviel 1-Pentanol (59 µmol) nachweisbar. Valeriansäure fand man zu weit geringeren Anteilen (maximal 3 µmol). Analoge Stoffwechselprodukte wurden für die Gemischkomponente 2-Methylbutylacetat identifiziert. [435]
Die Elimination der Metaboliten kann (teils als Konjugat) mit dem Urin erfolgen. [7619]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Anmerkung:
Die Bearbeitung dieser arbeitsmedizinischen Informationen erfolgte am 30.01.2017.
Sie werden bei Bedarf angepasst.
\n "}, {"drnr": "0703", "text": "\n ERSTE HILFE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Augen:
Auge unter Schutz des unverletzten Auges 10 Minuten unter fließendem Wasser bei weitgespreizten Lidern spülen.
Für ärztliche Behandlung sorgen.
[419]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Haut:
Benetzte Kleidung entfernen, dabei Selbstschutz beachten.
Betroffene Hautpartien gründlich unter fließendem Wasser mit Seife reinigen.
Bei Reizerscheinungen:
Für ärztliche Behandlung sorgen.
[419, 99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atmungsorgane:
Verletzten unter Selbstschutz aus dem Gefahrenbereich an die frische Luft bringen.
Verletzten ruhig lagern, vor Unterkühlung schützen.
Bei Atemnot Sauerstoff inhalieren lassen.
Bei Bewusstlosigkeit und vorhandener Atmung stabile Seitenlage.
Bei Atemstillstand Mund-zu-Nase-Beatmung, falls nicht durchführbar Mund-zu-Mund-Beatmung. Atemwege freihalten.
Bei massiver Exposition stets:
Für ärztliche Behandlung sorgen.
[419, 99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verschlucken:
Mund ausspülen, Flüssigkeit wieder ausspucken.
In kleinen Schlucken 1 Glas Wasser trinken lassen.
Erbrechen nicht anregen.
Bei Spontanerbrechen Kopf des Betroffenen in Bauchlage tief halten, um Aspiration zu verhüten.
Für ärztliche Behandlung sorgen.
[419, 2001, 99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise für den Arzt:
Hinweise zur akuten Wirkung resultieren aus Probandenstudien, Erfahrungen aus dem beruflichen Umgang mit Isomerengemischen und aus Tierversuchen. Im Vordergrund stehen Schleimhautreizungen und ZNS-Störungen durch hohe Dampfkonzentrationen. [7619, 435, 419]
\n
- Symptomatik der akuten Vergiftung:
Augen: durch Dämpfe oder Flüssigkeit nach kurzem Kontakt i. Allg. leichte, schnell reversible Reizung (Brennen, Rötung), Corneaschäden wenig wahrscheinlich [419, 7979]
Haut: keine oder geringe Reizung (Rötung, leichte Schwellung), nach längerem Kontakt Entfettung -> Abschuppung; systemische Wirkung unwahrscheinlich [7619, 419]
Inhalation: Reizung in Nase, Rachen, Trachea; [7619] bei hohen Konzentrationen systemische Wirkung (siehe unten), evtl. Glottisödem, Reizung tieferer Atemwege; [435, 7520] Gefahr der Lungenschädigung wahrscheinlich nur bei direkter Inhalation als Flüssigaerosol oder bei Aspiration [99999]
Ingestion: Reizung der Schleimhäute und gastrointestinale Beschwerden (Übelkeit, Erbrechen, Diarrhoe), bei Erbrechen Aspirationsgefahr!; nach hohen Dosen Resorptivwirkung [419]
Resorption: ZNS-Störungen (wie Kopfschmerz, Übelkeit, Schwindel, Benommenheit bis Bewusstlosigkeit); evtl. Funktionsstörungen der Leber. [419, 7748, 8101]
\n
- Hinweise zur Ersten ärztlichen Hilfe:
Nach Einwirkung am Auge sollte der Ersthilfe sicherheitshalber eine fachärztliche Nachkontrolle folgen. [419]
Benetzte Haut mit Wasser und Seife abwaschen. Im Anschluss kann eine rückfettende Salbe aufgetragen werden. [419, 99999]
Nach massiver Inhalation sofortige Frischluftzufuhr, erforderlichenfalls Gabe von Sauerstoff. Im narkotischen oder asphyktischen Stadium der Intoxikation hat die Sicherung der Herz-Kreislauf- und Atemfunktion absoluten Vorrang; Maßnahmen der kardiopulmonalen- zerebralen Reanimation können erforderlich werden. [8101]
Bei starker Reizung der Atemwege und stets nach direkter Inhalation von Flüssigaerosolen oder bei Verdacht auf Aspiration sind Glucocorticoid-Gabe (inhalativ/i.v) und alle weiteren Maßnahmen der Lungenödemprophylaxe indiziert; bald auch Pneumonieprophylaxe. [7520, 454]
Im Fall des Verschluckens ist eine Magenspülung (stets in Intubation und möglichst unter Sicht) nur im Fall der Aufnahme sehr großer Mengen zu erwägen. Weitere Behandlung sinngemäß wie unter Alkoholvergiftung.
Bei Verschlucken oder massiver Inhalation stets stationäre Weiterbehandlung mit Stabilisierung/Kontrolle insbesondere von Herz-Kreislauf-, ZNS- und Lungenfunktion, des Säure-Basen-Status und der Leber- und Nierenfunktion. [8101]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Empfehlungen:
Stoff/Produkt und durchgeführte Maßnahmen dem Arzt angeben.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Anmerkung:
Die Bearbeitung dieser Informationen zur Ersten Hilfe erfolgte am 30.01.2017.
Sie werden bei Bedarf angepasst.
\n "}], "links": "\n \n \n \n
\n \n Aufnahmewege\n | \n Wirkungsweisen\n | \n Erste Hilfe\n \n
\n "}, {"drnr": "0800", "ueberschrift": "SICHERER UMGANG\n ", "unterkapitel": [{"drnr": "0802", "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – HANDHABUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitsraum - Ausstattung/Belüftung:
Gute Be- und Entlüftung des Arbeitsraumes vorsehen.
Bei Bodenabfluss Abscheider vorsehen.
Waschgelegenheit am Arbeitsplatz vorsehen.
Beim Umgang mit größeren Mengen Notbrausen vorsehen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Apparaturen:
Möglichst geschlossene Apparaturen verwenden.
Ist das Austreten des Stoffes nicht zu verhindern, ist dieser an der Austrittsstelle gefahrlos abzusaugen.
Emissionsgrenzwerte beachten, ggf. Abluftreinigung vorsehen.
Behälter und Leitungen sind eindeutig zu kennzeichnen.
 
Ungeeignete Werkstoffe:
Gummi, verschiedene Kunststoffe
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise zum sicheren Umgang:
Auf Sauberkeit am Arbeitsplatz achten.
An Arbeitsplätzen dürfen nur die Substanzmengen vorhanden sein, die für den Fortgang der Arbeiten erforderlich sind.
Gefäße nicht offenstehen lassen.
Beim Ab- und Umfüllen sowie bei offener Anwendung muss eine ausreichende Lüftung gewährleistet sein.
Nicht mit Druckluft fördern.
Verspritzen vermeiden.
Nur in gekennzeichnete Behälter abfüllen.
Zur Trocknung Calciumchlorid, kein Natrium verwenden.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reinigung und Instandhaltung:
Beim Reinigen ggf. persönliche Schutzausrüstung benutzen.
Instandhaltungsarbeiten und Arbeiten in Behältern oder engen Räumen nur mit schriftlicher Erlaubnis durchführen.
\n "}, {"drnr": "0803", "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – LAGERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Lagerbedingungen:
Keine Lebensmittelgefäße verwenden - Verwechslungsgefahr!
Behälter sind eindeutig und dauerhaft zu kennzeichnen.
Möglichst im Originalbehälter aufbewahren.
Zerbrechliche Gefäße nur bis 5 Liter Inhalt verwenden.
Behälter dicht geschlossen halten.
Empfohlen wird Lagerung bei Raumtemperatur.
Trocken lagern.
Behälter an einem gut belüfteten Ort aufbewahren.
Entfernt von Zünd- und Wärmequellen lagern.
Kleinere Gebinde in Schränken mit Auffangwanne aufbewahren.
Es sind ausreichend große Auffangräume vorzusehen (Vertiefungen, Wälle oder standsichere Wände).
Vor Überhitzung/Erwärmung schützen.
Die maximal zulässigen Lagermengen sind der Technischen Regel für Gefahrstoffe \"Lagerung von Gefahrstoffen in ortsbeweglichen Behältern\" (TRGS 510) zu entnehmen.
Unzulässig ist die Lagerung in Durchgängen, Durchfahrten, Treppenräumen, allgemein zugänglichen Fluren, auf Dächern, in Dachräumen und Arbeitsräumen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Zusammenlagerungsbedingungen:
Lagerklasse 3 (Entzündbare flüssige Stoffe)
Es sollten nur Stoffe derselben Lagerklasse zusammengelagert werden.
Die Zusammenlagerung mit folgenden Stoffen ist verboten:
- Arzneimittel, Lebensmittel und Futtermittel einschließlich Zusatzstoffe.
- Ansteckungsgefährliche, radioaktive und explosive Stoffe.
- Gase.
- Sonstige explosionsgefährliche Stoffe der Lagerklasse 4.1A
- Entzündbare feste Stoffe oder desensibilisierte Stoffe der Lagerklasse 4.1B.
- Pyrophore Stoffe.
- Stoffe, die in Berührung mit Wasser entzündbare Gase entwickeln.
- Stark oxidierend wirkende Stoffe der Lagerklasse 5.1A.
- Ammoniumnitrat und ammoniumnitrathaltige Zubereitungen.
- Organische Peroxide und selbstzersetzliche Stoffe.
- Nicht brennbare akut giftige Stoffe der Lagerklasse 6.1B.
Die Zusammenlagerung mit folgenden Stoffen ist nur unter bestimmten Bedingungen erlaubt (Einzelheiten siehe TRGS 510):
- Oxidierend wirkende Stoffe der Lagerklasse 5.1B.
- Nichtbrennbare giftige oder chronisch wirkende Stoffe der Lagerklasse 6.1D.
- Brennbare Feststoffe der Lagerklasse 11.
Der Stoff sollte nicht mit Stoffen zusammengelagert werden, mit denen gefährliche chemische Reaktionen möglich sind.
\n "}, {"drnr": "0804", "text": "\n TECHNISCHE SCHUTZMASSNAHMEN - BRAND- UND EXPLOSIONSSCHUTZ\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Technische, konstruktive Maßnahmen:
Stoff ist brennbar.
Feuerlöscheinrichtungen sind bereitzustellen.
Beim Erwärmen des Stoffes über seinen Flammpunkt können Maßnahmen des Explosionsschutzes nach TRGS 722 (Vermeidung der Bildung), TRGS 723 (Vermeidung der Entzündung) und TRGS 724 (konstruktiver Explosionsschutz) erforderlich werden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Vorsichtsmaßnahmen beim Umgang:
Bereiche, in denen der Stoff über seinen Flammpunkt erwärmt verarbeitet wird, gelten als feuergefährdet.
Von Zündquellen (z.B. elektrischen Geräten, offenen Flammen, Wärmequellen und Funken) fernhalten.
Rauchverbot beachten!
Schweißverbot im Arbeitsraum.
Arbeiten an Behältern und Leitungen nur nach sorgfältigem Freispülen und Inertisieren durchführen.
Feuerarbeiten mit schriftlicher Erlaubnis durchführen, wenn sich Feuer- und Explosionsgefahren nicht restlos beseitigen lassen.
Keine funkenreißenden Werkzeuge verwenden.
\n "}, {"drnr": "0805", "text": "\n ORGANISATORISCHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Unterweisung über Gefahren und Schutzmaßnahmen anhand der Betriebsanweisung (TRGS 555) mit Unterschrift erforderlich, falls mehr als nur eine geringe Gefährdung festgestellt wurde.
Unterweisungen vor der Beschäftigung und danach mindestens einmal jährlich durchführen.
Ein Flucht- und Rettungsplan ist aufzustellen, wenn Lage, Ausdehnung und Nutzungsart der Arbeitsstätte dies erfordern.
Es ist sicherzustellen, dass die Arbeitsplatzgrenzwerte eingehalten werden. Bei Grenzwertüberschreitung sind zusätzliche Schutzmaßnahmen nach Gefahrstoffverordnung erforderlich.
Messergebnisse sind aufzuzeichnen und aufzubewahren.
Beschäftigungsbeschränkungen für Jugendliche nach dem Jugendarbeitsschutzgesetz beachten.
Das Betreten der Betriebsbereiche ist nur den Beschäftigten gestattet. Entsprechende Hinweisschilder sind anzubringen.
\n "}, {"drnr": "0806", "text": "\n PERSÖNLICHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Körperschutz:
Flammhemmende, antistatische Schutzkleidung verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemschutz:
In Ausnahmesituationen (z.B. unbeabsichtigte Stofffreisetzung, Arbeitsplatzgrenzwertüberschreitung) ist das Tragen von Atemschutz erforderlich. Tragezeitbegrenzungen beachten.
Atemschutzgerät: Gasfilter A, Kennfarbe braun. 
Bei Konzentrationen über der Anwendungsgrenze von Filtergeräten, bei Sauerstoffgehalten unter 17 Vol% oder bei unklaren Bedingungen ist ein Isoliergerät zu verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Augenschutz:
Es sollte ausreichender Augenschutz getragen werden.
Gestellbrille mit Seitenschutz verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Handschutz:
Schutzhandschuhe verwenden. Das Handschuhmaterial muss gegen den verwendeten Stoff ausreichend undurchlässig und beständig sein. Vor Gebrauch Dichtheit prüfen. Handschuhe vor dem Ausziehen vorreinigen, danach gut belüftet aufbewahren. Hautpflege beachten.
Hautschutzsalben bieten keinen ausreichenden Schutz gegen diesen Stoff.
Geeignet sind Handschuhe aus folgenden Materialien (Durchbruchzeit >= 8 Stunden):
Mehrschichtenhandschuh - PE/EVAL/PE
(PE=Polyethylen; EVAL=Ethylen-Vinylalkohol-Copolymer)
Nicht geeignet wegen Degradation, starker Quellung oder geringer Durchbruchzeit sind folgende Handschuhmaterialien:
Naturkautschuk/Naturlatex - NR
Polychloropren - CR
Nitrilkautschuk/Nitrillatex - NBR
Butylkautschuk - Butyl
Fluorkautschuk - FKM
Polyvinylchlorid - PVC
 
Die Zeitangaben sind Richtwerte aus Messungen bei 22 °C und dauerhaftem Kontakt. Erhöhte Temperaturen durch erwärmte Substanzen, Körperwärme etc. und eine Verminderung der effektiven Schichtstärke durch Dehnung können zu einer erheblichen Verringerung der Durchbruchzeit führen. Im Zweifelsfall Hersteller ansprechen. Bei einer ca. 1,5-fach größeren/kleineren Schichtdicke verdoppelt/halbiert sich die jeweilige Durchbruchzeit. Die Daten gelten nur für den Reinstoff. Bei Übertragung auf Substanzgemische dürfen sie nur als Orientierungshilfe angesehen werden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitshygiene:
Übliche Hygienemaßnahmen für den Umgang mit chemischen Stoffen beachten, insbesondere Haut vor Pausen und bei Arbeitsende mit Wasser und Seife reinigen und fetthaltige Hautpflegemittel nach der Reinigung verwenden.
Berührung mit der Haut vermeiden. Nach Substanzkontakt ist Hautreinigung erforderlich.
Einatmen von Dämpfen oder Nebeln vermeiden.
Durchtränkte Kleidung wechseln und erst nach deren Trocknung wieder benutzen.
Erhöhte Entzündungsgefahr durch Dochtwirkung.
\n "}, {"drnr": "0807", "text": "\n ENTSORGUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Gefährlicher Abfall nach Abfallverzeichnis-Verordnung (AVV).
Wenn eine Verwertung nicht möglich ist, müssen Abfälle unter Beachtung der örtlichen behördlichen Vorschriften beseitigt werden.
 
Sammlung von Kleinmengen:
In Sammelbehälter für halogenfreie organische Lösemittel und Lösungen halogenfreier organischer Stoffe geben.
Sammelgefäße sind deutlich mit der systematischen Bezeichnung ihres Inhaltes zu beschriften. Gefäße an einem gut gelüfteten Ort aufbewahren. Der zuständigen Stelle zur Abfallbeseitigung übergeben.
\n "}, {"drnr": "0808", "text": "\n MASSNAHMEN BEI UNBEABSICHTIGTER FREISETZUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Alle Zündquellen beseitigen.
Gefährdeten Bereich räumen, betroffene Umgebung warnen.
Atemschutzgerät tragen (s. Kapitel Persönliche Schutzmaßnahmen).
Verschüttete Flüssigkeiten mit Universalbinder (z.B. Kieselgur, Vermiculit, Sand) aufnehmen und vorschriftsmäßig entsorgen.
Funkenfreie Werkzeuge verwenden.
Anschließend Raum lüften und verschmutzte Gegenstände und Boden reinigen.
 
Gewässergefährdung:
Schwach wassergefährdend. Beim Eindringen sehr großer Mengen in Gewässer, Kanalisation oder Erdreich Behörden verständigen.
\n "}, {"drnr": "0809", "text": "\n MASSNAHMEN BEI BRÄNDEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Brandklasse:
\n \n \n \n \n \n
Bflüssige oder flüssig werdende Stoffe
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Geeignete Löschmittel:
Trockenlöschpulver
Kohlendioxid
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verhaltensmaßregeln:
Umliegende Gebinde und Behälter mit Sprühwasser kühlen.
Behälter wenn möglich aus der Gefahrenzone bringen.
Drucksteigerung, Berst- und Explosionsgefahr beim Erhitzen.
Zündquellen beseitigen.
Auf Rückzündung achten.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Persönliche Schutzausrüstung bei der Brandbekämpfung:
Im Brandfall können gefährliche Stoffe freigesetzt werden.
Kohlenmonoxid und Kohlendioxid
Umgebungsluftunabhängiges Atemschutzgerät tragen.
\n "}], "links": "\n \n \n \n
\n \n Handhabung\n | \n Lagerung\n | \n Brand- und Explosionsschutz\n | \n Organisatorische Maßnahmen\n | \n Persönl. Schutzmaßnahmen\n | \n Entsorgung\n | \n Freisetzung\n | \n Maßnahmen bei Bränden\n \n
\n "}, {"drnr": "1100", "ueberschrift": "VORSCHRIFTEN\n ", "unterkapitel": [{"drnr": "1303", "text": "\n EU-GHS-EINSTUFUNG UND KENNZEICHNUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Einstufung:
Entzündbare Flüssigkeiten, Kategorie 3; H226
Gewässergefährdend, Chronisch Kategorie 3; H412
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs02\"\n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Signalwort:\"Achtung\"
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefahrenhinweise - H-Sätze:
H226: Flüssigkeit und Dampf entzündbar.
H412: Schädlich für Wasserorganismen, mit langfristiger Wirkung.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Ergänzende Gefahrenhinweise - EUH-Sätze:
EUH066: Wiederholter Kontakt kann zu spröder oder rissiger Haut führen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Sicherheitshinweise - P-Sätze:
P210: Von Hitze, heißen Oberflächen, Funken, offenen Flammen sowie anderen Zündquellen fernhalten. Nicht rauchen.
P370+P378: Bei Brand: Löschpulver oder Trockensand zum Löschen verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n
Herstellerangabe Sigma-Aldrich
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01221 
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Stand:2015
geprüft:2016
\n \n
\n
\n \n \n \n \n \n \n \n
Der Stoff ist gelistet in Anhang VI, Tabelle 3 der EG-GHS-Verordnung.
Die angegebene Einstufung kann von der Listeneinstufung abweichen, da diese bezüglich fehlender oder abweichender Gefahrenklassen und Kategorien für den jeweiligen Stoff zu ergänzen ist.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n "}, {"drnr": "1302", "text": "\n GHS-EINSTUFUNG VON GEMISCHEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Die Einstufung von Gemischen, die diesen Stoff enthalten, ergibt sich aus Anhang 1 der Verordnung (EG) 1272/2008.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n "}, {"drnr": "1104", "text": "\n ARBEITSPLATZKENNZEICHNUNG NACH ASR A1.3\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Verbotszeichen:
\n \n \n \n \n \n
\n \"P02_FEUE\"\n Keine offene Flamme; Feuer, offene Zündquelle und Rauchen verboten
\n
\n \n \n \n \n \n
\n \"P06_ZUTR\"\n Zutritt für Unbefugte verboten
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Warnzeichen:
\n \n \n \n \n \n
\n \"W01_FEUR\"\n Warnung vor feuergefährlichen Stoffen
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gebotszeichen:
\n \n \n \n \n \n
\n \"M01_auge\"\n Augenschutz benutzen
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n \"M06_hand\"\n Schutzhandschuhe benutzen
\n
\n "}, {"drnr": "1106", "text": "\n EINSTUFUNG WASSERGEFÄHRDENDER STOFFE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Stoff Nr.:17
\n
WGK 1 - schwach wassergefährdend
Einstufung gemäß Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt ergänzt 18.11.2021
\n "}, {"drnr": "1107", "text": "\n TECHNISCHE ANLEITUNG ZUR REINHALTUNG DER LUFT (TA LUFT)\n \n \n
\n
\n \n \n \n \n \n \n \n
Kapitel 5.2.5 Organische Stoffe.
Insgesamt dürfen folgende Werte im Abgas, angegeben als Gesamtkohlenstoff, nicht überschritten werden:
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Massenstrom: 0,50 kg/h
\n
oder
\n \n \n \n \n \n \n \n \n \n
Massenkonzentration: 50 mg/m³
\n
\n \n \n \n \n \n \n \n
Bei Altanlagen mit einem jährlichen Massenstrom von bis zu 1,5 Mg/a, angegeben als Gesamtkohlenstoff, dürfen die Emissionen im Abgas den Massenstrom 1,5 kg/h nicht überschreiten.
\n
\n "}, {"drnr": "1108", "text": "\n TRANSPORTVORSCHRIFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n
\n 1104\n
UN-Nummer: 1104
Gefahrgut-Bezeichnung: Amylacetate
Nummer zur Kennzeichnung der Gefahr: 30
Klasse: 3 (Entzündbare flüssige Stoffe)
Verpackungsgruppe: III (geringe Gefährlichkeit)
Gefahrzettel: 3
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n
\n \"TPlabel3\"\n \n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n
Klassifizierungscode:F1
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Tunnelbeschränkungen:
Beförderungen in loser Schüttung oder in Tanks: Durchfahrt verboten durch Tunnel der Kategorien D und E.
Sonstige Beförderungen: Durchfahrt verboten durch Tunnel der Kategorie E.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07902 
\n "}, {"drnr": "1201", "text": "\n TRGS 900 – ARBEITSPLATZGRENZWERTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
50 ml/m³
270 mg/m³
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Spitzenbegrenzung: Überschreitungsfaktor1
\n
\n \n \n \n \n \n \n \n
Dauer 15 min, Mittelwert; 4 mal pro Schicht; Abstand 1 h
Kategorie I - Stoffe bei denen die lokale Wirkung grenzwertbestimmend ist oder atemwegssensibilisierende Stoffe
\n \n
\n
\n \n \n \n \n \n \n \n
Ein Risiko der Fruchtschädigung braucht bei Einhaltung des AGW und des BGW nicht befürchtet zu werden.
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Herkunft:DFG,EU
\n
\n "}, {"drnr": "1204", "text": "\n EU- ARBEITSPLATZGRENZWERTE\n \n \n
\n
\n \n \n \n \n \n \n \n
Richtlinie 2000/39/EG
Arbeitsplatz-Richtgrenzwert der Europäischen Union
Ein nationaler Arbeitsplatzgrenzwert muss festgelegt werden.
8-Stunden Mittelwert: 270 mg/m³ (50 ppm)
Kurzzeitgrenzwert: 540 mg/m³ (100 ppm)
\n
\n "}, {"drnr": "1203", "text": "\n EMPFEHLUNGEN DER MAK-KOMMISSION\n \n \n
\n
\n \n \n \n \n \n \n \n
Die Angaben sind wissenschaftliche Empfehlungen und kein geltendes Recht.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
50 ml/m³
270 mg/m³
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Spitzenbegrenzung: Überschreitungsfaktor1
\n \n \n \n \n \n \n \n
Dauer 15 min, Mittelwert; 4 mal pro Schicht; Abstand 1 h
Kategorie I - Stoffe bei denen die lokale Wirkung grenzwertbestimmend ist oder atemwegssensibilisierende Stoffe
\n \n
\n
\n \n \n \n \n \n \n \n
Schwangerschaft: Gruppe C
Eine fruchtschädigende Wirkung ist bei Einhaltung des MAK‐ und BAT-Wertes nicht anzunehmen.
\n \n
\n
\n "}, {"drnr": "1214", "text": "\n STÖRFALLVERORDNUNG (StoerfallV)\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
Anhang I Nummer:1.2.5.1
\n \n \n \n \n \n \n \n \n
\n P5a Entzündbare Flüssigkeiten der Kategorien 2 oder 3 (oder andere Flüssigkeiten mit einem Flammpunkt von ≤ 60 °C), die auf einer Temperatur oberhalb ihres Siedepunktes gehalten werden
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Mengenschwelle untere Kl.:10 t
Mengenschwelle obere Kl.:50 t
\n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Anhang I Nummer:1.2.5.2
\n \n \n \n \n \n \n \n \n
\n P5b Entzündbare Flüssigkeiten der Kategorien 2 oder 3 (oder andere Flüssigkeiten mit einem Flammpunkt von ≤ 60 °C), bei denen besondere Verarbeitungsbedingungen wie hoher Druck oder hohe Temperatur zu Störfallgefahren führen können
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Mengenschwelle untere Kl.:50 t
Mengenschwelle obere Kl.:200 t
\n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Anhang I Nummer:1.2.5.3
\n \n \n \n \n \n \n \n \n
\n P5c Entzündbare Flüssigkeiten, Kategorie 2 oder 3, nicht erfasst unter P5a und P5b
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Mengenschwelle untere Kl.:5000 t
Mengenschwelle obere Kl.:50000 t
\n \n
\n
\n "}, {"drnr": "1208", "text": "\n VERWENDUNGSBESCHRÄNKUNGEN / VERWENDUNGSVERBOTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
REACH-Verordnung (EG) Nr. 1907/2006 Anhang XVII
Anhang XVII, Nummer 3
1. Das Inverkehrbringen und die Verwendung des Stoffes ist nicht zugelassen in Dekorationsgegenständen, Spielen und Scherzspielen.
2. Stoffe, die mit H304 gekennzeichnet sind, die als Brennstoff in Zierlampen verwendet werden können und die in Mengen von 15 l oder weniger in den Verkehr gebracht werden, dürfen keinen Farbstoff und/oder kein Parfüm enthalten.
Weitere Informationen zu den Verboten sind der Verordnung zu entnehmen.
 
Anhang XVII, Nummer 40
Dürfen weder als Stoff noch als Gemisch in Aerosolpackungen verwendet werden, die dazu bestimmt sind, für Unterhaltungs- und Dekorationszwecke an die breite Öffentlichkeit abgegeben zu werden, wie z. B. für
Dekorationen mit metallischen Glanzeffekten, insbesondere für Festlichkeiten,
künstlichen Schnee und Reif,
unanständige Geräusche,
Luftschlangen,
Scherzexkremente,
Horntöne für Vergnügungen,
Schäume und Flocken zu Dekorationszwecken,
künstliche Spinnweben,
Stinkbomben.
Weitere Informationen zu den Verboten und Ausnahmen sind der Verordnung zu entnehmen.
\n \n
\n
\n \n \n \n \n \n \n \n
Anhang XVII der Verordnung (EG) 1907/2006, konsolidierte Version (BAUA)
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Bedarfsgegenständeverordnung (BedGgstV)
Anlage 1 zu § 3, Nummer 5
Der Stoff darf nicht beim Herstellen oder Behandeln von Scherzspielen verwendet werden.
\n "}, {"drnr": "1209", "text": "\n TECHNISCHE REGELN FÜR GEFAHRSTOFFE (TRGS)\n \n \n
\n
\n \n \n \n \n \n \n \n
TRGS 201
Einstufung und Kennzeichnung bei Tätigkeiten mit Gefahrstoffen; Ausgabe Februar 2017, zuletzt geändert und ergänzt April 2018
\n
TRGS 400
Gefährdungsbeurteilung für Tätigkeiten mit Gefahrstoffen; Ausgabe Juli 2017
\n
TRGS 555
Betriebsanweisung und Information der Beschäftigten; Ausgabe Februar 2017
\n
TRGS 600
Substitution; Ausgabe Juli 2020
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 402
Ermitteln und Beurteilen der Gefährdungen bei Tätigkeiten mit Gefahrstoffen: Inhalative Exposition; Ausgabe Januar 2010, zuletzt geändert und ergänzt Oktober 2016
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 401
Gefährdung durch Hautkontakt, Ermittlung - Beurteilung - Maßnahmen; Ausgabe Juni 2008; zuletzt berichtigt März 2011
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 500
Schutzmaßnahmen; Ausgabe September 2019
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 509
Lagern von flüssigen und festen Gefahrstoffen in ortsfesten Behältern sowie Füll- und Entleerstellen für ortsbewegliche Behälter; Ausgabe September 2014, zuletzt berichtigt, geändert und ergänzt Oktober 2020
\n
TRGS 510
Lagerung von Gefahrstoffen in ortsbeweglichen Behältern; Ausgabe Dezember 2020
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 800
Brandschutzmaßnahmen; Ausgabe Dezember 2010
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 720
Gefährliche explosionsfähige Gemische - Allgemeines; Ausgabe Juli 2020, zuletzt berichtigt März 2021
\n
TRGS 721
Gefährliche explosionsfähige Gemische - Beurteilung der Explosionsgefährdung; Ausgabe Oktober 2020, zuletzt berichtigt Dezember 2020
\n
TRGS 722
Vermeidung oder Einschränkung gefährlicher explosionsfähiger Atmosphäre, Ausgabe Februar 2021
\n
TRGS 723
Gefährliche explosionsfähige Gemische - Vermeidung der Entzündung gefährlicher explosionsfähiger Gemische; Ausgabe Juli 2019, zuletzt geändert Oktober 2020
\n
TRGS 724
Gefährliche explosionsfähige Gemische - Maßnahmen des konstruktiven Explosionsschutzes, welche die Auswirkung einer Explosion auf ein unbedenkliches Maß beschränken, Ausgabe Juli 2019
\n "}, {"drnr": "1210", "text": "\n VORSCHRIFTEN DER UNFALLVERSICHERUNGSTRÄGER\n \n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-190
Benutzung von Atemschutzgeräten, Ausgabe Dezember 2011
http://publikationen.dguv.de/dguv/pdf/10002/r-190.pdf
\n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-195
Benutzung von Schutzhandschuhen, Aktualisierte Nachdruckfassung Oktober 2007
http://publikationen.dguv.de/dguv/pdf/10002/bgr195.pdf
\n "}], "links": "\n \n \n \n
\n \n GHS-Einstufung/Kennzeichnung\n | \n Arbeitsplatzkennzeichnung\n | \n Wassergefährdungsklasse\n | \n TA Luft\n | \n Transportvorschriften\n | \n Luftgrenzwerte\n | \n EU-Grenzwerte\n | \n Empfehlung MAK\n | \n Störfallverordnung\n | \n Verwendungsbeschränkungen\n | \n TRGS\n | \n Vorschriften UV-Träger\n \n
\n "}, {"drnr": "1400", "ueberschrift": "LINKS\n ", "unterkapitel": [{"drnr": "1400", "text": "\n
\n
\n \n \n \n \n \n \n \n
\n Internationale Grenzwerte (nur auf Englisch)\n
\n
\n \n \n \n \n \n \n \n
\n DGUV Information 213-098: Stoffliste - Unterricht in Schulen\n
\n
\n "}], "links": null}, {"drnr": "0900", "ueberschrift": "LITERATURVERZEICHNIS\n ", "unterkapitel": [], "tables": "\n \n \n \n
\n

Quelle: 00001\n
IFA: Erfassungs- und Pflegehandbuch der GESTIS-Stoffdatenbank (nicht öffentlich)
Data acquisition and maintenance manual of the GESTIS substance database (non-public)

\n

Quelle: 00105\n
Sorbe \"Sicherheitstechnische Kenndaten chemischer Stoffe\" (\"Safety-related characteristics of chemical substances\"), sicherheitsNet.de, Landsberg

\n

Quelle: 00419\n
CHEMINFO - Chemical Profiles Created by CCOHS

\n

Quelle: 00435\n
Organisation for Economic Cooperation and Development (OECD) \"Screening Information Data Set for High Production Volume Chemicals (SIDS)\", http://www.inchem.org/pages/sids.html

\n

Quelle: 00440\n
Datenbank CHEMSAFE, Version 2016.0, DECHEMA-PTB-BAM

\n

Quelle: 00446\n
Datenbank CHEMSAFE, DECHEMA-PTB-BAM. Dampfdruckdaten berechnet aus Antoine-Konstanten

\n

Quelle: 00454\n
Hazardous Substances Data Bank (HSDB)

\n

Quelle: 01211\n
GHS-Sicherheitsdatenblatt, Merck
GHS Material Safety Data Sheet, Merck

\n

Quelle: 01221\n
GHS-Sicherheitsdatenblatt, Sigma-Aldrich
GHS Material Safety Data Sheet, Sigma-Aldrich

\n

Quelle: 02001\n
International Chemical Safety Cards (ICSC)

\n

Quelle: 02071\n
Toxicological Data, compiled by the National Institute of Health (NIH), USA, selected and distributed by Technical Database Services (TDS), New York, 2009

\n

Quelle: 05130\n
Kühn-Birett-Merkblätter: 130. Ergänzungslieferung; 09/2000

\n

Quelle: 05300\n
TRGS 510 \"Lagerung von Gefahrstoffen in ortsbeweglichen Behältern\" Ausgabe Dezember 2020

\n

Quelle: 05350\n
TRGS 900 \"Arbeitsplatzgrenzwerte\" Ausgabe Januar 2006, zuletzt geändert und ergänzt Juni 2021

\n

Quelle: 06002\n
L. Roth, U. Weller
\"Gefährliche Chemische Reaktionen\" Loseblattsammlung mit Ergänzungslieferungen
\"Dangerous chemical reactions\" loose-leaf collection with supplement deliveries
ecomed-Verlag

\n

Quelle: 07520\n
Europäische Chemikalienagentur ECHA: Informationen über registrierte Substanzen
European Chemicals Agency ECHA: Information on registered substances

\n

Quelle: 07580\n
Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt geändert 18.11.2021

\n

Quelle: 07619\n
DFG: Toxikologisch-arbeitsmedizinische Begründungen von MAK-Werten; Verlag Chemie

\n

Quelle: 07635\n
AUERDATA 98

\n

Quelle: 07636\n
L. Parmeggiani (Edt.) \"Enzyclopedia of Occupational Health and Safety\" 3. Auflage, International Labour Office, Genf 1983

\n

Quelle: 07748\n
American Conference of Governmental Industrial Hygienists \"Documentation of the threshold limit values and biological exposure indices Loseblattsammlung mit Ergänzungslieferungen

\n

Quelle: 07795\n
H. Geerißen \"GloSaDa 2000 Plus - Glove Safety Data\"

\n

Quelle: 07836\n
L. Lewin \"Gifte und Vergiftungen\" 6. Auflage, Karl F. Haug Verlag, Heidelberg 1992

\n

Quelle: 07902\n
BAM: Datenbank Gefahrgut-Schnellinfo

\n

Quelle: 07979\n
W.M. Grant, J.S. Schuman: Toxicology of the eyes; 4th Edition, Charles C Thomas Publisher, Springfield, Illinois; 1993

\n

Quelle: 08089\n
E. Bingham, B. Cohrssen, C.H. Powell (edts.) \"Patty´s Toxicology\" Fifth Edition, John Wiley & Sons, New York 2001

\n

Quelle: 08101\n
Reinhard Ludewig, Ralf Regenthal:
Akute Vergiftungen und Arzneimittelüberdosierungen,
11. Auflage,
Wissenschaftliche Verlagsgesellschaft Stuttgart, 2015

\n

Quelle: 08112\n
DFG Deutsche Forschungsgemeinschaft: MAK- und BAT-Werte-Liste 2021, Senatskommission zur Prüfung gesundheitsschädlicher Arbeitsstoffe, Mitteilung 57; GMS PUBLISSO

\n

Quelle: 99983\n
Liste arbeitsmedizinisch-toxikologischer Standardwerke (2)
List of standard references regarding occupational health and toxikology (2)

\n

Quelle: 99996\n
Projektgebundene arbeitsmedizinisch-toxikologische Literatur (2)
Project related bibliographical references regarding occupational health and toxikology (2)

\n

Quelle: 99999\n
Angabe des Bearbeiters
Indication of the editor

\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
\n \n \n \n \n \n \n \n
Dieses Stoffdatenblatt wurde sorgfältig erstellt. Dennoch kann für den Inhalt keine Haftung, gleich aus welchem Rechtsgrund, übernommen werden.
\n "}]} \ No newline at end of file diff --git a/src-tauri/cabr2_search/tests/assets/calcium.json b/crates/search/tests/assets/calcium.json similarity index 100% rename from src-tauri/cabr2_search/tests/assets/calcium.json rename to crates/search/tests/assets/calcium.json diff --git a/crates/search/tests/assets/cobaltdinitrat.json b/crates/search/tests/assets/cobaltdinitrat.json new file mode 100644 index 000000000..6b049697e --- /dev/null +++ b/crates/search/tests/assets/cobaltdinitrat.json @@ -0,0 +1,251 @@ +{ + "zvgnummer": "5340", + "zvgnummer_mit_null": "005340", + "name": "Cobalt(II)-nitrat", + "sortiername": "Cobaltnitrat", + "aliases": [ + { "name": "Kobalt(II)-nitrat", "sortiername": "Kobaltnitrat" }, + { "name": "Cobaltdinitrat", "sortiername": "Cobaltdinitrat" } + ], + "hauptkapitel": [ + { + "drnr": "1300", + "ueberschrift": null, + "unterkapitel": [{ "drnr": "1303", "text": null }], + "tables": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs03\"\n \n \"ghs08\"\n \n \"ghs05\"\n \n \"ghs07\"\n \n \"ghs09\"\n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-Chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin und Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
\n " + }, + { + "drnr": "0100", + "ueberschrift": "IDENTIFIKATION\n ", + "unterkapitel": [ + { + "drnr": "0100", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Cobalt(II)-nitrat\n
\n Kobalt(II)-nitrat\n
\n Cobaltdinitrat\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
ZVG Nr:\n 5340\n
\n \n \n \n \n \n \n \n \n \n \n \n
CAS Nr:\n 10141-05-6\n wasserfrei
\n \n \n \n \n \n \n \n \n \n \n
EG Nr:\n 233-402-1\n \n
\n \n \n \n \n \n \n \n \n \n
INDEX Nr:\n 027-009-00-2\n
\n \n
\n
\n \n \n \n \n \n \n \n
Verwandte
\n \n \n \n \n \n \n \n \n \n \n \n
CAS Nr:10026-22-9Hexahydrat
\n \n \n \n \n \n \n
\n
\n \n \n \n \n \n \n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0300", + "ueberschrift": "CHARAKTERISIERUNG\n ", + "unterkapitel": [ + { + "drnr": "0301", + "text": "\n STOFFGRUPPENSCHLÜSSEL\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
128500
137200
Nitrate
Cobaltverbindungen
\n " + }, + { + "drnr": "0303", + "text": "\n AGGREGATZUSTAND\n \n \n
\n
\n \n \n \n \n \n \n \n
\n FeststoffDer Stoff ist fest.
\n " + }, + { + "drnr": "0304", + "text": "\n EIGENSCHAFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
kristallin
rotbraun
\n
\n " + }, + { + "drnr": "0305", + "text": "\n CHEMISCHE CHARAKTERISIERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Oxidierender Feststoff.
Stoff selbst brennt nicht, erhöht jedoch die Feuergefahr bei Berührung mit brennbaren Stoffen und kann einen bestehenden Brand erheblich fördern.
Sehr leicht löslich in Wasser.
Hygroskopisch.
Von dem Stoff gehen akute oder chronische Gesundheitsgefahren aus.
Der Stoff ist gewässergefährdend.
(s. Kapitel VORSCHRIFTEN).
\n " + }, + { + "drnr": "0307", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Stoffinformationen in Wikipedia\n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0400", + "ueberschrift": "FORMEL\n ", + "unterkapitel": [ + { + "drnr": "0400", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Co(NO3)2
CoN2O6
\n
\n \n \n \n \n \n \n \n \n \n \n
Co(NO3)2
CoN2O6
\n \"005340\"\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Molmasse: 182,95 g/mol
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0600", + "ueberschrift": "PHYSIKALISCH CHEMISCHE EIGENSCHAFTEN\n ", + "unterkapitel": [ + { + "drnr": "0602", + "text": "\n SCHMELZPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n
Der Stoff zersetzt sich beim Erhitzen (s. Zersetzungstemperatur).
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n " + }, + { + "drnr": "0604", + "text": "\n DICHTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert: 2,49 g/cm³
\n
wasserfrei
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00131 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert: 1,88 g/cm³
\n
Hexahydrat
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00131 
\n " + }, + { + "drnr": "0613", + "text": "\n WASSERLÖSLICHKEIT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Löslichkeit: 1330 g/l
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur: 0 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01211 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Löslichkeit: 2170 g/l
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur: 100 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01211 
\n " + }, + { + "drnr": "0614", + "text": "\n pH-WERT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
pH-Wert:ca. 4,0
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur: 20 °C
\n
\n \n \n \n \n \n \n \n \n \n
Konzentration: 100 g/l
\n
Hexahydrat
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01211 
\n " + }, + { + "drnr": "0619", + "text": "\n GEFÄHRLICHES REAKTIONSVERHALTEN\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Zersetzungstemperatur: 100 ...  105 °C
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Thermische Zersetzung:
Kristallwasserabspaltung des Hexahydrats
bei ca. 55 Grad C.
Bei Temperaturen > 74 Grad C färbt sich die rote
wässrige Lösung durch Oxidbildung grün.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefährliche chemische Reaktionen:
 
Explosionsgefahr bei Kontakt mit:
oxidierbaren Stoffen
Ammoniumhexacyanoferrat(II)/Hitze
Kohle
 
Der Stoff kann in gefährlicher Weise reagieren mit:
Hitze
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00131 06002 
\n " + } + ], + "links": "\n \n \n \n
\n \n Schmelzpunkt\n | \n Dichte\n | \n Löslichkeit\n | \n pH - Wert\n | \n Gefährliche Reaktionen\n \n
\n " + }, + { + "drnr": "0500", + "ueberschrift": "TOXIKOLOGIE / ÖKOTOXIKOLOGIE\n ", + "unterkapitel": [ + { + "drnr": "0501", + "text": "\n TOXIKOLOGISCHE DATEN\n \n \n
\n
\n \n \n \n \n \n \n \n
LD50 oral Ratte
\n \n \n \n \n \n \n \n \n \n
Wert: 691 mg/kg
\n \n \n \n \n \n \n \n
Food and Chemical Toxicology. Vol. 20, Pg. 311, 1982.
\n \n
\n
\n \n \n \n \n \n \n \n
Cobaltnitrat, Hexahydrat
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 02071 
\n \n
\n
\n \n \n \n \n \n \n \n
LD50 oral Ratte
\n \n \n \n \n \n \n \n \n \n
Wert: 434 mg/kg
\n \n \n \n \n \n \n \n
Food and Chemical Toxicology. Vol. 20, Pg. 311, 1982.
\n \n
\n
\n \n \n \n \n \n \n \n
Cobaltnitrat, wasserfrei
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 02071 
\n " + }, + { + "drnr": "0502", + "text": "\n ÖKOTOXIKOLOGISCHE DATEN\n \n \n
\n
\n \n \n \n \n \n \n \n
LC50 Fisch (96 Stunden)
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Minimalwert: 66,8 mg/l
Maximalwert: 82,7 mg/l
Medianwert: 74,8 mg/l
\n \n \n \n \n \n \n \n \n \n
Studienanzahl:2
\n \n \n \n \n \n \n \n
Referenz für Medianwert:
\n \n \n \n \n \n \n \n
Ding, S.R. 1980. Acute Toxicities of Vanadium, Nickel and Cobalt to Several Species of Aquatic Organisms. Environ.Qual. 1:17-21 (CHI) (ENG ABS)
\n \n
\n
\n \n \n \n \n \n \n \n
LC50 Krustentiere (48 Stunden)
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Minimalwert: 3,4 mg/l
Maximalwert: 17,2 mg/l
Medianwert: 10,3 mg/l
\n \n \n \n \n \n \n \n \n \n
Studienanzahl:2
\n \n \n \n \n \n \n \n
Referenz für Medianwert:
\n \n \n \n \n \n \n \n
Ding, S.R. 1980. Acute Toxicities of Vanadium, Nickel and Cobalt to Several Species of Aquatic Organisms. Environ.Qual. 1:17-21 (CHI) (ENG ABS); Kissa, E., M. Moraitou-Apostolopoulou, and V. Kiortsis 1984. Effects of Four Heavy Metals on Survival and Hatching Rate of Artemia salina (L.). Arch.Hydrobiol. 102(2):255-264
\n \n
\n
\n \n \n \n \n \n \n \n
Cobaltnitrat, wasserfrei
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 02072 
\n " + } + ], + "links": null + }, + { + "drnr": "0700", + "ueberschrift": "ARBEITSMEDIZIN UND ERSTE HILFE\n ", + "unterkapitel": [ + { + "drnr": "0701", + "text": "\n AUFNAHMEWEGE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hauptaufnahmewege:
Am Arbeitsplatz wird Cobalt(II)-nitrat (Co-nitrat) bevorzugt über den Atemtrakt aufgenommen.[07619]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemwege:
Zum Resorptionsverhalten inhalierter löslicher Co-Salze liegen Hinweise aus Arbeitsplatzstudien vor. Beruflich Exponierte wiesen deutlich erhöhte Co-Gehalte im Harn auf, wobei die maximale Ausscheidung am Ende des Arbeitstages erreicht wurde und mit der Expositionskonzentration gut korrelierte.[99996]
Diese Befunde lassen darauf schließen, daß zumindest ein großer Teil der inhalierten Co-Dosis rasch resorbiert wird.[99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Haut:
Kinetische Studien für löslich Co-Salze liegen nicht vor.[99983]
Da für metallisches Co eine Hautpenetrationsfähigkeit nachgewiesen wurde, sollte eine solche prinzipiell auch für gut lösliche Co-Salze vorausgesetzt werden.[99999]
Im Vergleich zur inhalativen Aufnahme wird der Hautaufnahme aber allgemein eine untergeordnete Bedeutung zugemessen.[99996]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verdauungstrakt:
Bei Staubexposition ist eine anteilige Überführung in den Verdauungstrakt infolge mukoziliarer Atemwegsclearance oder durch evtl. direkte orale Aufnahme zu berücksichtigen.
Das Ausmaß der Resorption von Co-Salzen ist von der Dosis, der Nahrungsaufnahme, dem Füllungszustand des Magens und dem Ernährungsstatus abhängig (bspw. bei Eisenmangel erhöht).
Für das Co-chlorid wurden bei Verabreichung an Testpersonen Resorptionsraten im Bereich von 5 - 45 % bestimmt.[99996]
\n " + }, + { + "drnr": "0702", + "text": "\n WIRKUNGSWEISEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hauptwirkungsweisen:
akut:
sensibilisierende Wirkung auf Haut und Atemwege,[07619]
schleimhautreizendes Potential[00450]
chronisch:
allergische oder irritativ bedingte Atemwegsreaktionen, Lungenschädigung (Fibrose), allergische Hauterkrankungen;[99996]
im hohen Dosisbereich Herzschädigung, Beeinflussung von Blutbildung und Schilddrüsenfunktion[99983]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Akute Toxizität:
Zur akuten Toxizität von Co-nitrat liegen nur wenige Hinweise vor.[99983]
Nach beruflicher Erfahrung wirkt Co-nitrat zumindest bei wiederholter Einwirkung augenreizend (vgl. \"Chronische Toxizität\").[00450]
Ergebnisse tierexperimenteller Prüfungen zur Stärke der augenreizenden Wirkung liegen nicht vor.
Bezüglich einer Reizwirkung an der Haut finden sich keine Erfahrungsberichte oder Tierversuchsergebnisse.[99983]
Eine hautsensibilisierende Wirkung von Co-Salzen ist sowohl durch Tierversuche als auch durch Testungen an Hautpatienten eindeutig belegt. Die Sensibilisierung setzt wahrscheinlich einen längeren Kontakt voraus (vgl. \"Chronische Toxizität\").[07890]
Ist sie erfolgt, können bei erneutem Kontakt jedoch schon geringe Dosen allergische Hautreaktionen auslösen. Co-Salze wirken nachweislich auch als Atemwegsallergene. In inhalativen Provokationstests zeigten sensibilisierte Personen sowohl bronchiale Sofortreaktionen als auch isolierte Spätreaktionen oder duale Reaktionen.[07619]
Allgemein wurde auch auf mögliche irritative Wirkungen der Co-Salze im Atemtrakt hingewiesen. Im Versuch an Nagern wirkten lösliche Co-Salze bei direkter Applikation in die Luftröhre als akute Lungenreizstoffe.[00450]
Akute Inhalationstests speziell für Co-nitrat fehlen.[99983]
Co-sulfat löste in einem subakuten Test (Konzentrationen von 5 - 50 mg/m3) an Ratten Entzündungen in Rachen und Luftröhre bzw. von Nase und Bronchien sowie Todesfälle aus.[99996]
Bei oraler Applikation von Co-Salzen an Versuchstiere wurde eine sofortige Erweiterung der Hautgefäße (über ca. 1 h), teils mit Blutdruckabfall, beobachtet. Weitere Vergiftungssymptome waren: Diarrhoe, reduzierte Nahrungsaufnahme, Lähmung der hinteren Extremitäten, Nierenfunktionsstörungen.[00450]
Ähnliche Symptome wurden nach Aufnahme von 500 mg Co-chlorid beim Menschen beobachtet: Hitzegefühl, Erbrechen, Diarrhoe und leichter Kollaps.[07606]
Die für Co-nitrat in Tierversuchen ermittelten oralen Toxizitätswerte (LD50, Ratte: 430 mg/kg KG; LDLo, Kaninchen: 250 mg/kg KG) lagen in der gleichen Größenordnung wie die für Co-chlorid und Co-sulfat ermittelten Werte.[00438]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Chronische Toxizität:
Bei Exposition gegenüber Co-Salzen werden Haut und Atemwege als die wesentlichen Zielorgane der Co-Wirkung angesehen.
Bei längerem Umgang mit verschiedenen löslichen Co-Salze sind häufig allergische Hauterkrankungen beobachtet worden.[99996]
Auch für Co-nitrat liegen einzelne Fallberichte vor.[07890]
Typische Befunde bei Co-Allergien sind Hautekzeme an den Kontaktstellen (meist den Händen); in Einzelfällen sollen auch Urtikaria und photoallergische Ekzeme aufgetreten sein.[99983]
Allgemein sind Co-Hautallergien meist von einer Allergie gegenüber anderen Metallen (meist Nickel/Chrom) begleitet.[07619]
In der Literatur finden sich unterschiedliche Auffassungen, ob dieser Befund als Kreuzallergie, Folge einer kombinierten Exposition oder Vorschädigung der Haut aufzufassen ist.[99983]
Im Zusammenhang mit inhalativen Expositionen gegenüber löslichen Co-Verbindungen ist über allergisches Asthma (deutlich erhöhtes Risiko bereits bei 0,1 mg Co/m3) sowie obstruktive Atemwegserkrankungen (chronische Bronchitis, herabgesetzte Atemkapazität) berichtet worden.[07748]
Dieses Wirkpotential ist auch Co-nitrat zu unterstellen, es liegen hierzu aber keine substanzspezifischen Daten vor.[99983]
Beschäftigte, die bei der Verarbeitung von Co-nitrat Raumluftkonzentrationen von 79 mg Co/m3 ausgesetzt waren, zeigten Entzündungen der Augenbindehäute und Reizungen im oberen Atemtrakt (keine näheren Angaben verfügbar).[00450]
Die schwerwiegendsten Co-bedingten Atemwegsschädigungen betreffen Veränderungen im Lungenparenchym und wurden vor allem bei Exposition gegenüber Hartmetall-Staub gefunden.[07748]
Diese als \"hard metal disease\" oder Hartmetall-Lunge\" bezeichnete Erkrankung umfaßt entzündliche Veränderungen (subakute bis chronische Alveolitis) bis hin zur unspezifischen Lungenfibrose mit Minderung der Dehnbarkeit und Elastizität der Lunge, Einschränkung der Lungenfunktion (restriktives Syndrom) und resultierender Herzschädigung. Schwere, teils tödliche Krankheitsverläufe sind auch nach Exposition gegenüber Cobalt-Kontaktmasse, die Co-carbonat (zu ca. 25 %) enthielt, beobachtet worden.[99996]
Prinzipiell wird allen Co-Verbindungen unterstellt, daß sie diese Lungenerkrankung auslösen können. Bei der Ausbildung der Erkrankung scheinen aber Zusatznoxen und individuelle Empfindlichkeit wesentliche Einflußfaktoren zu sein.
Systemische Co-Wirkungen sind vor allem außerberuflich, bei oraler Aufnahme/Injektion von Co-Salzen, beobachtet worden.[99983]
Zur Behandlung der perniziösen Anämie erhielten Patienten über Tage bis zu mehreren Monaten Co-chlorid in Dosen bis zu 3 mg Co/kg KG pro Tag (ca. 200 mg/Tag, zusätzlich Eisensalz) zur Stimulation der Erythropoese. Nebenwirkungen, die zum Teil direkt mit der resultierenden Polycythämie erklärt werden konnten, waren: Appetitsverlust, Übelkeit, Erbrechen, Diarrhoe, Schmerz hinter dem Brustbein, Hautröte, Hautausschlag, Ohrgeräusche und neurologisch bedingte Schwerhörigkeit; in einigen Fällen Parästhesien und weitere neurologische Störungen, auch Schädigung des Sehnervs.[07783]
Zudem wurde Schilddrüsenunterfunktion (Struma) beobachtet. Eine herzschädigende Wirkung ist aus Vergiftungsfällen, die nach Genuß von Co-sulfat/Co-chlorid-haltigem Bier auftraten (schwere, oft tödliche Cardiomyopathien), bekannt geworden.[99996]
Die aufgenommenen Dosen lagen bei 1,7 - 12 mg pro Tag.[07619]
Da sie vergleichsweise niedrig waren, wird in diesen Fällen ein synergistischer Einfluß von Proteinmangel und der Alkoholaufnahme für wahrscheinlich angesehen.[99996]
Im Tierversuch war eine entsprechende kardiotoxische Wirkung auch bei Applikation von Co-nitrat nachweisbar.[07619]
Bei beruflicher Co-Exposition ist nur in Einzelfällen über Herzmuskelschädigungen berichtet worden.[99996]
Eine beruflich bedingte Beeinflussung der Schilddrüsenfunktion (erhöhtes Serumthyroxin und freies Thyroxin) fand man in einer neueren Studie an Beschäftigten, die gegenüber dem schwach löslichen Zink-Cobalt-silikat exponiert waren.[07866]
Hinweise auf Blutbildveränderungen im Sinne einer Polycythämie nach beruflicher Exposition scheinen nicht hinreichend gesichert, zumindest werden solche Schädigungen nur bei sehr hohen Überexpositionen erwartet.[07748]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reproduktionstoxizität, Mutagenität, Kanzerogenität:
Zur Einstufung des fortpflanzungsgefährdenden, erbgutverändernden und krebserzeugenden Potentials s. Stoffliste nach Anhang VI der GHS-Verordnung / TRGS 905 / MAK-Liste (s. Kapitel VORSCHRIFTEN).
Reproduktionstoxizität:
Nach dem vorliegenden Informationsmaterial muss ein Risiko reproduktionstoxischer Wirkung vermutet werden. Zur Einstufung fruchtschädigend / fruchtbarkeitsgefährdend siehe Kapitel VORSCHRIFTEN.
Co-chlorid, das als Modellsubstanz für lösliche Co-Verbindungen geprüft wurde, verursachte bei oraler Gabe an Nagern Effekte, die auf eine Beeinträchtigung der Fruchtbarkeit schließen lassen. Zur Einschätzung des entwicklungsschädigenden Potentials sind die verfügbaren Daten nicht hinreichend.[05323]
Mutagenität:
Eine Schädigung des genetischen Materials der Keimzelle wurde in geeigneten Untersuchungen nachgewiesen bzw. wahrscheinlich gemacht.
[07619]
Die aus In-vitro- und In-vivo-Versuchen vorliegenden Testergebnisse lassen allerdings auf eine nur schwache mutagene Wirkung der löslichen Co-Salze schließen, weshalb das Risiko für den Menschen noch nicht abschätzbar ist.[05323]
Kanzerogenität:
Für atembare Stäube/Aerosole:
Aus dem vorliegenden Informationsmaterial wurde abgeleitet, dass der Stoff als kanzerogen für den Menschen angesehen werden sollte.
In Inhalationsstudien mit Co-sulfat an Nagern wurde eine kanzerogene Wirkung nachgewiesen und in mechanistischen Untersuchungen das Co-Ion als wirksames Agens identifiziert.[07619]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Stoffwechsel und Ausscheidung:
Co ist für den Menschen ein essentielles Spurenelement, das mit der Nahrung in täglichen Dosen zwischen 40 und 50 µg aufgenommen wird. Im Körper des Erwachsenen findet sich im Durchschnitt ca. 1 mg Co, wobei die größte Menge in Leber, Nieren, Herz und Muskel gespeichert ist.[07620]
Tierexperimentelle Untersuchungen weisen darauf hin, daß auf oralem oder inhalativem Weg resorbiertes Co in analoger Weise im Körper verteilt und ausgeschieden wird.[00450]
Die Elimination aus dem Organismus erfolgt hauptsächlich mit dem Urin, daneben mit den Faeces. In Schweiß, Muttermilch und Haaren finden sich nur sehr geringe Mengen. Mit dem Urin wird der überwiegende Teil innerhalb weniger Tage, ein geringer Teil langfristig (> 1 Jahr) eliminiert. Bei beruflich inhalativ gegenüber Co-Salzen exponierten Personen war ein enger Zusammenhang zwischen den Co-Gehalten in Blut/Urin und der Expositionshöhe nachweisbar. Diese Parameter sind zum Biomonitoring geeignet, lassen aber keine Abschätzung der gesundheitlichen Gefährdung zu.[99996]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Anmerkung:
Die Bearbeitung dieser arbeitsmedizinischen Informationen erfolgte am 03.11.2003.
Sie werden bei Bedarf angepasst.
\n " + }, + { + "drnr": "0703", + "text": "\n ERSTE HILFE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Augen:
Auge unter Schutz des unverletzten Auges 10 Minuten unter fließendem Wasser bei weitgespreizten Lidern spülen.
Für ärztliche Behandlung sorgen.
[07750]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Haut:
Benetzte Kleidung entfernen, dabei Selbstschutz beachten.
Betroffene Hautpartien gründlich unter fließendem Wasser mit Seife reinigen.
Bei Reizerscheinungen:
Für ärztliche Behandlung sorgen.
[07750, 99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atmungsorgane:
Verletzten unter Selbstschutz aus dem Gefahrenbereich an die frische Luft bringen.
Verletzten ruhig lagern, vor Unterkühlung schützen.
Für ärztliche Behandlung sorgen.
Bei Anzeichen von Atemwegsreizungen oder Atemnot:
Ehestmöglich ein Glucocorticoid-Dosieraerosol zur Inhalation wiederholt tief einatmen lassen.
[07750, 08013]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verschlucken:
Mund ausspülen, Flüssigkeit wieder ausspucken.
Sofort - bei erhaltenem Bewusstsein - 1 Glas Wasser (ca. 200 ml) trinken lassen.
Bei spontanem Erbrechen Kopf des Betroffenen in Bauchlage tief halten, um Aspiration zu verhüten.
Zwischenzeitlich Arzt zum Unfallort rufen.
[08013, 99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise für den Arzt:
Erfahrungen beim Menschen betreffen meist allergische Haut- und Atemwegsreaktionen und systemische Wirkungen bei längerer oraler/ i.v. Applikation löslicher Co-Salze.
Auch unter Berücksichtigung von Tierversuchsdaten kann das akute Intoxikationsbild nur annähernd abgeschätzt werden.[99983]
\n
- Symptomatik der akuten Vergiftung:
Augen: Reizwirkung (Konjunktivitis), evtl. Augenschädigung[00450]
Haut: primäre Reizung eher gering/fehlend; allergische/photoallergische Reaktionen möglich (Urtikaria, Ekzem);[07890] bei massivem Kontakt evtl. systemische Wirkung[00438]
Inhalation: konzentrationsabhängige Reizung der Atemwege, evtl. auch Lungenschädigung (Ödembildung, Pneumonie);[99996] bei sensibilisierten Personen bereits bei geringer Exposition asthmatische Sofort- und/oder Spätreaktionen;[07619] systemische Wirkung wenig wahrscheinlich[99996]
Ingestion: lokale Reizungen; Erbrechen, Leibschmerzen, Diarrhoe; nach hohen Dosen Resorptivwirkung[00450]
Resorption: vorwiegend zentralnervöse und vasoaktive Effekte (Lähmung der Gefäßmuskulatur), evtl. auch kardiale Wirkung, mit Symptomen wie flüchtiger Hautröte im Kopf-Hals-Bereich, Hyperthermie, Blutdrucksenkung, Dyspnoe, Tachykardie, evtl. Lähmungserscheinungen, Krämpfen; Spätschädigung der Herzmuskulatur nicht auszuschließen.[08013]
\n
- Hinweise zur Ersten ärztlichen Hilfe:
Ins Auge gelangte Substanz durch anhaltende Spülung entfernen. Eine Nachkontrolle/Weiterbehandlung durch einen Augenarzt ist anzuraten.[07750]
Kontaminierte Hautareale gründlich reinigen, insbesondere auf Wunden, Hautrisse und verdeckte Stellen achten. Eventuelle Hautreizungen können mit einem Dermatocorticoid behandelt werden.[99999]
Nach massiver Inhalation zunächst Frischluftzufuhr und ruhige Lagerung des Betroffenen.[07750]
Bei Reizerscheinungen oder Atemnot ist sofortige Applikation von Glucocorticoiden (inhalativ/i.v.) indiziert.[99999]
Nach massiver Exposition sollten neben Glucocorticoid-Gabe erforderlichenfalls alle weiteren Maßnahmen der Lungenödemprophylaxe eingeleitet werden, später auch Pneumonieprophylaxe und längerfristige Nachbeobachtung.
Nach Verschlucken wurden Flüssigkeits-Gabe, erforderlichenfalls Magenspülung bzw. gastroskopische Untersuchung empfohlen. Systemische Effekte ggf. symptomatisch behandeln.[08013]
Zur Abklärung der Intoxikation stetsTransport zur Klinik.[99999]
Empfohlen werden insbesondere Kontrolle von Wasser-/Elektrolythaushalt und Nierenfunktion sowie EKG-Überwachung.[08013]
Zur Bindung/Austragung von Co sollen DMPS (in Einzelfällen) bzw. DMSA als Chelatbildner angewendet worden sein.[07906]
Andere Autoren geben an, daß Antidote (wie DMPS, CaNa2-EDTA, Penicillamin oder Natrium- bzw. Calciumthiosulfat) klinisch nicht sicher wirksam sind.
Im Hinblick auf eine evtl. Kardiomyopathie wird eine gründliche kardiologische Abschlußuntersuchung empfohlen.[08013]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Empfehlungen:
Stoff/Produkt und durchgeführte Maßnahmen dem Arzt angeben.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Anmerkung:
Die Bearbeitung dieser Informationen zur Ersten Hilfe erfolgte am 03.11.2003.
Sie werden bei Bedarf angepasst.
\n " + }, + { + "drnr": "1211", + "text": "\n ARBEITSMEDIZINISCHE VORSORGE\n \n \n
\n
\n \n \n \n \n \n \n \n
Angebotsvorsorge: Arbeitsmedizinische Vorsorge ist anzubieten, wenn bei Tätigkeiten mit dem Stoff eine wiederholte Exposition nicht ausgeschlossen werden kann.
Nachgehende Vorsorge: Nach Beendigung von Tätigkeiten mit Exposition gegenüber diesem Stoff ist eine nachgehende Vorsorge anzubieten.
\n \n \n \n \n \n \n \n
\n
Fristen: Angebotsvorsorge muss vor Aufnahme der Tätigkeiten angeboten werden. Fristen für die das Angebot von regelmäßiger arbeitsmedizinischer Vorsorge und nachgehender Vorsorge sind der arbeitsmedizinischen Regel „AMR Nummer 2.1“ zu entnehmen.
\n " + } + ], + "links": "\n \n \n \n
\n \n Aufnahmewege\n | \n Wirkungsweisen\n | \n Erste Hilfe\n | \n Arbeitsmedizinische Vorsorge\n \n
\n " + }, + { + "drnr": "0800", + "ueberschrift": "SICHERER UMGANG\n ", + "unterkapitel": [ + { + "drnr": "0801", + "text": "\n VORBEMERKUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Bei Tätigkeiten mit dem Stoff sind weitere Schutzmaßnahmen nach TRGS 561 “Tätigkeiten mit krebserzeugenden Metallen und ihren Verbindungen“ zu beachten.
\n " + }, + { + "drnr": "0802", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – HANDHABUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitsraum - Ausstattung/Belüftung:
Arbeitsbereiche sind möglichst räumlich abzutrennen.
Sehr gute Be- und Entlüftung des Arbeitsraumes vorsehen.
Eine Rückführung gereinigter Abluft in die Arbeitsräume sollte in der Regel nicht erfolgen. Abgesaugte Luft kann nur zurückgeführt werden, wenn sie durch anerkannte Verfahren ausreichend gereinigt wurde.
Der Fußboden sollte keinen Bodenabfluss haben.
Waschgelegenheit am Arbeitsplatz vorsehen.
Beim Umgang mit größeren Mengen Notbrausen vorsehen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Apparaturen:
Krebserzeugende und keimzellmutagene Stoffe nur in geschlossenen Apparaturen handhaben. Ist das Austreten nicht zu verhindern, ist eine Absaugung an der Austrittsstelle erforderlich.
Emissionsgrenzwerte beachten, ggf. Abluftreinigung vorsehen.
Behälter und Leitungen sind eindeutig zu kennzeichnen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise zum sicheren Umgang:
Auf Sauberkeit und Trockenheit am Arbeitsplatz achten.
An Arbeitsplätzen dürfen nur die Substanzmengen vorhanden sein, die für den Fortgang der Arbeiten erforderlich sind.
Gefäße nicht offenstehen lassen.
Für das Ab- und Umfüllen möglichst dichtschließende Anlagen mit Absaugung einsetzen.
Verschütten vermeiden.
Nur in gekennzeichnete Behälter abfüllen.
Bei offenem Hantieren jeglichen Kontakt vermeiden.
Bei offenem Hantieren Staubentwicklung vermeiden.
Beim Transport in zerbrechlichen Gefäßen geeignete Überbehälter benutzen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reinigung und Instandhaltung:
Tägliche Reinigung durchführen.
Beim Reinigen ggf. persönliche Schutzausrüstung benutzen.
Staubbildung vermeiden. Nicht vermeidbare Staubablagerungen sind regelmäßig aufzunehmen.
Geprüfte Industriestaubsauger der Klasse H verwenden.
Bei Reinigungsarbeiten Staub nicht unnötig aufwirbeln.
Das Abblasen zu Reinigungszwecken ist nicht zulässig.
Verschmutzte Geräte dürfen nur nach Reinigung in anderen Arbeitsbereichen verwendet werden.
Instandhaltungsarbeiten und Arbeiten in Behältern oder engen Räumen nur mit schriftlicher Erlaubnis durchführen.
\n " + }, + { + "drnr": "0803", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – LAGERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Lagerbedingungen:
Unter Verschluss oder nur für fachkundige Personen zugänglich aufbewahren.
Keine Lebensmittelgefäße verwenden - Verwechslungsgefahr!
Behälter sind eindeutig und dauerhaft zu kennzeichnen.
Möglichst im Originalbehälter aufbewahren.
Zerbrechliche Gefäße in bruchsichere Übergefäße einstellen.
Behälter dicht verschlossen an einem kühlen, trockenen, gut belüfteten Ort aufbewahren.
Vor Feuchtigkeit schützen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Zusammenlagerungsbedingungen:
Lagerklasse 5.1 B (Oxidierend wirkende Stoffe)
Es sollten nur Stoffe derselben Lagerklasse zusammengelagert werden.
Die Zusammenlagerung mit folgenden Stoffen ist verboten:
- Arzneimittel, Lebensmittel und Futtermittel einschließlich Zusatzstoffe.
- Ansteckungsgefährliche, radioaktive und explosive Stoffe.
- Gase.
- Aerosole (Spraydosen).
- Sonstige explosionsgefährliche Stoffe der Lagerklasse 4.1A.
- Pyrophore Stoffe.
- Stoffe, die in Berührung mit Wasser entzündbare Gase entwickeln.
- Organische Peroxide und selbstzersetzliche Stoffe.
Die Zusammenlagerung mit folgenden Stoffen ist nur unter bestimmten Bedingungen erlaubt (Einzelheiten siehe TRGS 510):
- Entzündbare flüssige Stoffe der Lagerklasse 3.
- Entzündbare feste Stoffe oder desensibilisierte Stoffe der Lagerklasse 4.1B.
- Ammoniumnitrat und ammoniumnitrathaltige Zubereitungen.
- Brennbare und nicht brennbare akut giftige Stoffe der Lagerklassen 6.1A und 6.1B.
- Brennbare giftige oder chronisch wirkende Stoffe der Lagerklasse 6.1C.
- Nichtbrennbare giftige oder chronisch wirkende Stoffe der Lagerklasse 6.1D.
- Brennbare ätzende Stoffe der Lagerklasse 8A.
- Brennbare Flüssigkeiten der Lagerklasse 10.
- Brennbare Feststoffe der Lagerklasse 11.
Der Stoff sollte nicht mit Stoffen zusammengelagert werden, mit denen gefährliche chemische Reaktionen möglich sind.
\n " + }, + { + "drnr": "0804", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN - BRAND- UND EXPLOSIONSSCHUTZ\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Technische, konstruktive Maßnahmen:
Stoff ist brandfördernd (oxidierend).
Feuerlöscheinrichtungen sind bereitzustellen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Vorsichtsmaßnahmen beim Umgang:
Von offenen Flammen fernhalten.
Rauchverbot beachten!
Schweißverbot im Arbeitsraum.
Arbeiten an Behältern und Leitungen nur nach sorgfältigem Freispülen und Inertisieren durchführen.
Feuerarbeiten mit schriftlicher Erlaubnis durchführen, wenn sich Feuer- und Explosionsgefahren nicht restlos beseitigen lassen.
Von brennbaren Stoffen fernhalten.
Filtrieren von Lösungen nur mit Glaswolle, Glasfritten oder Keramikfilter. Kein Filtermaterial aus Papier verwenden, nach Trocknung besteht Entzündungsgefahr. Keine Putzlappen offen liegen lassen.
\n " + }, + { + "drnr": "0805", + "text": "\n ORGANISATORISCHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Unterweisung über Gefahren und Schutzmaßnahmen anhand der Betriebsanweisung (TRGS 555) mit Unterschrift erforderlich, falls mehr als nur eine geringe Gefährdung festgestellt wurde.
Unterweisungen vor der Beschäftigung und danach mindestens einmal jährlich durchführen.
Ein Flucht- und Rettungsplan ist aufzustellen, wenn Lage, Ausdehnung und Nutzungsart der Arbeitsstätte dies erfordern.
Die Konzentration des Stoffes in der Luft ist zu minimieren.
Die Zahl der Beschäftigten, die mit dem Gefahrstoff umgehen, ist so klein wie möglich zu halten.
Beschäftigungsbeschränkungen für Jugendliche nach dem Jugendarbeitsschutzgesetz beachten.
Tätigkeitsbeschränkungen für schwangere Frauen nach Mutterschutzgesetz beachten.
Das Betreten der Betriebsbereiche ist nur den Beschäftigten gestattet. Entsprechende Hinweisschilder sind anzubringen.
\n " + }, + { + "drnr": "0806", + "text": "\n PERSÖNLICHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Körperschutz:
Je nach Gefährdung geeignete Schutzkleidung oder geeigneten Chemikalienschutzanzug tragen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemschutz:
In Ausnahmesituationen (z.B. unbeabsichtigte Stofffreisetzung) ist das Tragen von Atemschutz erforderlich. Tragezeitbegrenzungen beachten.
Atemschutzgerät: Partikelfilter P3, Kennfarbe: weiß.
Bei Konzentrationen über der Anwendungsgrenze von Filtergeräten, bei Sauerstoffgehalten unter 17 Vol% oder bei unklaren Bedingungen ist ein Isoliergerät zu verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Augenschutz:
Es muss ausreichender Augenschutz getragen werden.
Korbbrille verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Handschutz:
Schutzhandschuhe verwenden. Das Handschuhmaterial muss gegen den verwendeten Stoff ausreichend undurchlässig und beständig sein. Vor Gebrauch Dichtheit prüfen. Handschuhe vor dem Ausziehen vorreinigen, danach gut belüftet aufbewahren. Hautpflege beachten.
Hautschutzsalben bieten keinen ausreichenden Schutz gegen diesen Stoff.
Völlig ungeeignet sind Stoff- oder Lederhandschuhe. 
Nachfolgende Daten gelten für wässrige, gesättigte Lösungen des Salzes.
Geeignet sind Handschuhe aus folgenden Materialien (Durchbruchzeit >= 8 Stunden):
Naturkautschuk/Naturlatex - NR (0,5 mm) (ungepuderte und allergenfreie Produkte verwenden)
Polychloropren - CR (0,5 mm)
Nitrilkautschuk/Nitrillatex - NBR (0,35 mm)
Butylkautschuk - Butyl (0,5 mm)
Fluorkautschuk - FKM (0,4 mm)
Polyvinylchlorid - PVC (0,5 mm)
 
Die Zeitangaben sind Richtwerte aus Messungen bei 22 °C und dauerhaftem Kontakt. Erhöhte Temperaturen durch erwärmte Substanzen, Körperwärme etc. und eine Verminderung der effektiven Schichtstärke durch Dehnung können zu einer erheblichen Verringerung der Durchbruchzeit führen. Im Zweifelsfall Hersteller ansprechen. Bei einer ca. 1,5-fach größeren/kleineren Schichtdicke verdoppelt/halbiert sich die jeweilige Durchbruchzeit. Die Daten gelten nur für den Reinstoff. Bei Übertragung auf Substanzgemische dürfen sie nur als Orientierungshilfe angesehen werden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitshygiene:
In Arbeitsbereichen dürfen keine Nahrungs- und Genussmittel aufgenommen werden. Für diesen Zweck sind geeignete Bereiche einzurichten.
Berührung mit der Haut vermeiden. Nach Substanzkontakt ist Hautreinigung erforderlich.
Berührung mit den Augen vermeiden. Nach Substanzkontakt Augenspülung vornehmen.
Einatmen von Stäuben vermeiden.
Berührung mit der Kleidung vermeiden. Verunreinigte Kleidung wechseln und gründlich reinigen.
Vor Pausen gegebenenfalls die Arbeitskleidung wechseln.
Getrennte Aufbewahrungsmöglichkeiten für Straßen- und Arbeitskleidung müssen zur Verfügung stehen, wenn eine Gefährdung durch Verunreinigung der Arbeitskleidung zu erwarten ist.
Vor Pausen und bei Arbeitsende Hautreinigung mit Wasser und Seife erforderlich. Nach der Reinigung fetthaltige Hautpflegemittel verwenden.
Persönliche Hygiene streng einhalten.
\n " + }, + { + "drnr": "0807", + "text": "\n ENTSORGUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Gefährlicher Abfall nach Abfallverzeichnis-Verordnung (AVV).
Wenn eine Verwertung nicht möglich ist, müssen Abfälle unter Beachtung der örtlichen behördlichen Vorschriften beseitigt werden.
 
Sammlung von Kleinmengen:
In Sammelbehälter für giftige anorganische Rückstände sowie Schwermetall-Salze und ihre Lösungen geben.
Sammelgefäße sind deutlich mit der systematischen Bezeichnung ihres Inhaltes zu beschriften. Gefäße an einem gut gelüfteten Ort aufbewahren. Der zuständigen Stelle zur Abfallbeseitigung übergeben.
\n " + }, + { + "drnr": "0808", + "text": "\n MASSNAHMEN BEI UNBEABSICHTIGTER FREISETZUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Gefährdeten Bereich räumen, betroffene Umgebung warnen.
Zur Beseitigung des gefährlichen Zustandes darf der Gefahrenbereich nur mit geeigneten Schutzmaßnahmen betreten werden.
Atem-, Augen-, Hand- und Körperschutz tragen (s. Kapitel Persönliche Schutzmaßnahmen).
Staubfrei aufnehmen.
Anschließend Raum lüften und verschmutzte Gegenstände und Boden reinigen.
 
Gewässergefährdung:
Stark wassergefährdend. Eindringen in Gewässer, Kanalisation oder Erdreich unbedingt vermeiden. Schon beim Eindringen geringer Mengen Behörden verständigen.
\n " + }, + { + "drnr": "0809", + "text": "\n MASSNAHMEN BEI BRÄNDEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verhaltensmaßregeln:
Stoff selbst brennt nicht, wirkt aber oxidierend.
Umliegende Gebinde und Behälter mit Sprühwasser kühlen.
Behälter wenn möglich aus der Gefahrenzone bringen.
Drucksteigerung, Berst- und Explosionsgefahr beim Erhitzen.
Löschwasser nicht in die Kanalisation gelangen lassen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Persönliche Schutzausrüstung bei der Brandbekämpfung:
Bei Einbeziehung in einen Brand können gefährliche Stoffe freigesetzt werden.
Nitrose Gase (Stickoxide)
Metalloxidrauch
Umgebungsluftunabhängiges Atemschutzgerät und Chemieschutzanzug tragen.
\n " + } + ], + "links": "\n \n \n \n
\n \n Handhabung\n | \n Lagerung\n | \n Brand- und Explosionsschutz\n | \n Organisatorische Maßnahmen\n | \n Persönl. Schutzmaßnahmen\n | \n Entsorgung\n | \n Freisetzung\n | \n Maßnahmen bei Bränden\n \n
\n " + }, + { + "drnr": "1100", + "ueberschrift": "VORSCHRIFTEN\n ", + "unterkapitel": [ + { + "drnr": "1303", + "text": "\n EU-GHS-EINSTUFUNG UND KENNZEICHNUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Einstufung:
Oxidierende Feststoffe, Kategorie 2; H272
Akute Toxizität, Kategorie 4, Verschlucken; H302
Akute Toxizität, Kategorie 4, Einatmen; H332
Sensibilisierung der Haut, Kategorie 1; H317
Schwere Augenschädigung, Kategorie 1; H318
Sensibilisierung der Atemwege, Kategorie 1; H334
Karzinogenität, Kategorie 1B; H350i
Keimzellmutagenität, Kategorie 2; H341
Reproduktionstoxizität, Kategorie 1B; H360F
Gewässergefährdend, Akut Kategorie 1; H400
Gewässergefährdend, Chronisch Kategorie 1; H410
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs03\"\n \n \"ghs08\"\n \n \"ghs05\"\n \n \"ghs07\"\n \n \"ghs09\"\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Signalwort:\"Gefahr\"
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefahrenhinweise - H-Sätze:
H272: Kann Brand verstärken; Oxidationsmittel.
H302: Gesundheitsschädlich bei Verschlucken.
H332: Gesundheitsschädlich bei Einatmen.
H317: Kann allergische Hautreaktionen verursachen.
H318: Verursacht schwere Augenschäden.
H334: Kann bei Einatmen Allergie, asthmaartige Symptome oder Atembeschwerden verursachen.
H350i: Kann bei Einatmen Krebs erzeugen.
H341: Kann vermutlich genetische Defekte verursachen.
H360F: Kann die Fruchtbarkeit beeinträchtigen.
H410: Sehr giftig für Wasserorganismen mit langfristiger Wirkung.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Sicherheitshinweise - P-Sätze:
P210: Von Hitze, heißen Oberflächen, Funken, offenen Flammen sowie anderen Zündquellen fernhalten. Nicht rauchen.
P280: Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen.
P301+P330+P331: BEI VERSCHLUCKEN: Mund ausspülen. KEIN Erbrechen herbeiführen.
P302+P352: BEI BERÜHRUNG MIT DER HAUT: Mit viel Wasser und Seife waschen.
P304+P340: BEI EINATMEN: Die Person an die frische Luft bringen und für ungehinderte Atmung sorgen.
P305+P351+P338: BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen.
P310: Sofort GIFTINFORMATIONSZENTRUM oder Arzt anrufen.
\n \n
\n
\n \n \n \n \n \n \n \n
Herstellerangabe Thermo Fisher Scientific
Cobalt(II)-nitrat, Hexahydrat
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01231 
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Stand:2019
geprüft:2020
\n \n
\n
\n \n \n \n \n \n \n \n
Der Stoff ist gelistet in Anhang VI, Tabelle 3 der EG-GHS-Verordnung.
Die angegebene Einstufung kann von der Listeneinstufung abweichen, da diese bezüglich fehlender oder abweichender Gefahrenklassen und Kategorien für den jeweiligen Stoff zu ergänzen ist.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n " + }, + { + "drnr": "1302", + "text": "\n GHS-EINSTUFUNG VON GEMISCHEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Spezifische Konzentrationsgrenzen
Karz. 1B; H350i: C >= 0,01 %
\n \n
\n
\n \n \n \n \n \n \n \n
Für weitere ggf. nicht aufgeführte Konzentrationsbereiche bzw. weitere evtl. vorhandene Gefahreneinstufungen des Stoffes sind die allgemeinen Konzentrationsgrenzen aus Anhang 1 der Verordnung (EG) 1272/2008 heranzuziehen.
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
M-Faktor:M=10
\n
\n \n
\n
\n \n \n \n \n \n \n \n
Anmerkung 1
Die angegebenen Konzentrationen sind als Gewichts% des Metalls, bezogen auf das Gesamtgewicht des Gemisches, zu verstehen.
\n \n
\n
\n \n \n \n \n \n \n \n
Ergänzende Kennzeichnungselemente nach Verordnung (EG) Nr. 1272/2008 Anhang II, Nr. 2.8: Das Kennzeichnungsetikett auf der Verpackung von Gemischen, die mindestens einen als sensibilisierend eingestuften Stoff in einer Konzentration enthalten, die mindestens 0,1 % beträgt oder mindestens ebenso hoch ist wie die in Anhang VI Teil 3 dieser Verordnung in einem besonderen Hinweis für den Stoff genannte Konzentration, muss folgenden Hinweis tragen:
EUH208 - „Enthält ‚Name des sensibilisierenden Stoffes‘. Kann allergische Reaktionen hervorrufen.“
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07501 07505 
\n " + }, + { + "drnr": "1104", + "text": "\n ARBEITSPLATZKENNZEICHNUNG NACH ASR A1.3\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Verbotszeichen:
\n \n \n \n \n \n
\n \"P02_FEUE\"\n Keine offene Flamme; Feuer, offene Zündquelle und Rauchen verboten
\n
\n \n \n \n \n \n
\n \"P06_ZUTR\"\n Zutritt für Unbefugte verboten
\n
\n \n \n \n \n \n
\n \"P19_esstr\"\n Essen und Trinken verboten
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Warnzeichen:
\n \n \n \n \n \n
\n \"W04_AETZ\"\n Warnung vor ätzenden Stoffen
\n
\n \n \n \n \n \n
\n \"W11_bran\"\n Warnung vor brandfördernden Stoffen
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gebotszeichen:
\n \n \n \n \n \n
\n \"M01_auge\"\n Augenschutz benutzen
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n \"M06_hand\"\n Schutzhandschuhe benutzen
\n
\n " + }, + { + "drnr": "1106", + "text": "\n EINSTUFUNG WASSERGEFÄHRDENDER STOFFE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Stoff Nr.:520
\n
WGK 3 - stark wassergefährdend
Einstufung gemäß Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt ergänzt 17.12.2020
\n " + }, + { + "drnr": "1107", + "text": "\n TECHNISCHE ANLEITUNG ZUR REINHALTUNG DER LUFT (TA LUFT)\n \n \n
\n
\n \n \n \n \n \n \n \n
Kapitel 5.2.7.1.1 Krebserzeugende Stoffe
Klasse I
Als Mindestanforderung dürfen die folgende Werte im Abgas insgesamt nicht überschritten werden.
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Massenstrom: 0,15 g/h
\n
oder
\n \n \n \n \n \n \n \n \n \n
Massenkonzentration: 0,05 mg/m³
\n
\n \n \n \n \n \n \n \n
Angegeben als Co.
\n
\n " + }, + { + "drnr": "1108", + "text": "\n TRANSPORTVORSCHRIFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n 1477\n \n \n \n \n \n \n
\n 1477 II\n
UN-Nummer: 1477
Gefahrgut-Bezeichnung: Nitrate, anorganisch, n.a.g.
Nummer zur Kennzeichnung der Gefahr: 50
Klasse: 5.1 (Entzündend/oxidierend wirkende Stoffe)
Verpackungsgruppe: II (mittlere Gefährlichkeit)
Gefahrzettel: 5.1
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n
\n \"TPlabel5_1\"\n \n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n
Besondere Kennzeichnung: Symbol (Fisch und Baum)
\n \"TPlabel9_1\"\n
\n \n \n \n \n \n \n \n \n \n
Klassifizierungscode:O2
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Tunnelbeschränkungen:
Durchfahrt verboten durch Tunnel der Kategorie E.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01231 
\n " + }, + { + "drnr": "1109", + "text": "\n REACH - VERORDNUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Stoff ist in der REACH-Kandidatenliste der besonders besorgniserregenden Stoffe aufgeführt.
\n " + }, + { + "drnr": "1203", + "text": "\n EMPFEHLUNGEN DER MAK-KOMMISSION\n \n \n
\n
\n \n \n \n \n \n \n \n
Die Angaben sind wissenschaftliche Empfehlungen und kein geltendes Recht.
\n \n
\n
\n \n \n \n \n \n \n \n
Gefahr der Hautresorption
Gefahr der Sensibilisierung der Atemwege und der Haut
\n \n
\n
\n \n \n \n \n \n \n \n
Krebserzeugend: Kategorie 2
Stoffe, die als krebserzeugend für den Menschen anzusehen sind, weil durch Ergebnisse aus Tierversuchen davon auszugehen ist, dass sie einen nennenswerten Beitrag zum Krebsrisiko leisten.
\n \n
\n
\n \n \n \n \n \n \n \n
Keimzellmutagen: Kategorie 3A
Stoffe, für die eine Schädigung des genetischen Materials der Keimzellen beim Menschen oder im Tierversuch nachgewiesen wurde oder für die gezeigt wurde, dass sie mutagene Effekte in somatischen Zellen Säugetieren in vivo hervorrufen und dass sie in aktiver Form die Keimzellen erreichen.
\n \n
\n
\n \n \n \n \n \n \n \n
Geltungsbereich: einatembare Fraktion
\n
\n " + }, + { + "drnr": "1212", + "text": "\n TRGS 910\n \n \n
\n
\n \n \n \n \n \n \n \n
Stoffspezifische Akzeptanz- und Toleranzkonzentrationen
\n \n
\n
\n \n \n \n \n \n \n \n
Akzeptanzkonzentration
\n \n \n \n \n \n \n \n \n \n \n \n
Gew.-Konz.:0,5 µg/m³Alveolengängige Fraktion
\n \n \n \n \n \n \n \n
Akzeptanzkonzentration assoziiert mit Risiko 4:10000
\n \n
\n
\n \n \n \n \n \n \n \n
Toleranzkonzentration
\n \n \n \n \n \n \n \n \n \n \n \n
Gew-Konz.:5 µg/m³Alveolengängige Fraktion
\n \n \n \n \n \n \n \n \n \n
Überschreitungsfaktor:8
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Die Konzentrationen beziehen sich auf den Elementgehalt des entsprechenden Metalls.
siehe TRGS 561
Geltungsbereich: Cobaltverbindungen, als Carc. 1A, Carc. 1B eingestuft
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 05326 
\n " + }, + { + "drnr": "1214", + "text": "\n STÖRFALLVERORDNUNG (StoerfallV)\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
Anhang I Nummer:1.2.8
\n \n \n \n \n \n \n \n \n
\n P8 Oxidierende Flüssigkeiten oder Feststoffe der Kategorien 1, 2 oder 3
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Mengenschwelle untere Kl.:50 t
Mengenschwelle obere Kl.:200 t
\n \n
\n
\n \n STÖRFALLVERORDNUNG (StoerfallV)\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
Anhang I Nummer:1.3.1
\n \n \n \n \n \n \n \n \n
\n E1 Gewässergefährdend, Kategorie Akut 1 oder Chronisch 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Mengenschwelle untere Kl.:100 t
Mengenschwelle obere Kl.:200 t
\n \n
\n
\n " + }, + { + "drnr": "1208", + "text": "\n VERWENDUNGSBESCHRÄNKUNGEN / VERWENDUNGSVERBOTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
REACH-Verordnung (EG) Nr. 1907/2006 Anhang XVII
Anhang XVII, Nummer 28, Nummer 29 bzw. Nummer 30
Der Stoff darf nicht in Verkehr gebracht oder verwendet werden als Stoff, als Bestandteil anderer Stoffe oder in Gemischen, die zum Verkauf an die breite Öffentlichkeit bestimmt sind, wenn die Einzelkonzentration des Stoffs oder Gemischs die Konzentrationsgrenzwerte nach CLP-Verordnung erreicht oder übersteigt. Beim Inverkehrbringen für gewerbliche Anwender muss der Lieferant gewährleisten, dass die Verpackung mit der Aufschrift „Nur für gewerbliche Anwender.“ versehen ist. Weitere Einzelheiten sind der Verordnung zu entnehmen.
\n \n
\n
\n \n \n \n \n \n \n \n
Anhang XVII, Nummer 75
Gemische, die bestimmte gefährliche Stoffe enthalten, dürfen für Tätowierungszwecke nicht mehr in Verkehr gebracht werden. Gemische die solche Stoffe in vorgegebener Konzentration enthalten, dürfen nach dem 04.01.2022 nicht mehr für Tätowierungszwecke verwendet werden. Bei den Stoffen handelt es sich um:
- karzinogene oder reproduktionstoxische Stoffe gemäß Anhang VI Teil 3 der CLP-Verordnung (es sei denn, die Einstufung gründet sich auf Wirkungen, die nur nach Exposition durch Inhalation auftreten),
- hautsensibilisierende, hautätzende, hautreizende, schwer augenschädigende oder augenreizende Stoffe gemäß Anhang VI Teil 3 der CLP-Verordnung,
- Stoffe, die mit maßgeblichen Bedingungen in Anhang II oder IV der Verordnung (EG) Nr. 1223/2009 [Kosmetikverordnung] aufgeführt sind und
- Stoffe, die in der Anlage 13 des Anhang XVII (Nummer 75) der REACH-Verordnung aufgeführt sind.
Generell müssen Gemische, die zur Verwendung für Tätowierungszwecke in Verkehr gebracht werden, ab dem 04.01.2022 mit der Kennzeichnung “Gemisch zur Verwendung in Tätowierungen oder Permanent-Make-up.” versehen werden und dürfen ohne diese Kennzeichnung nicht zu Tätowierungszwecken verwendet werden. Weitere Sicherheitsinformationen sind auf der Verpackung oder in der Gebrauchsanweisung anzugeben. Der Tätowierer hat der Person, die sich dem Verfahren unterzieht, diese Informationen bereitzustellen.
Weitere Informationen zu den Beschränkungen, Konzentrationsgrenzen und den Ausnahmen sind der Verordnung zu entnehmen.
\n \n
\n
\n \n \n \n \n \n \n \n
Anhang XVII der Verordnung (EG) 1907/2006, konsolidierte Version (BAUA)
\n " + }, + { + "drnr": "1209", + "text": "\n TECHNISCHE REGELN FÜR GEFAHRSTOFFE (TRGS)\n \n \n
\n
\n \n \n \n \n \n \n \n
TRGS 201
Einstufung und Kennzeichnung bei Tätigkeiten mit Gefahrstoffen; Ausgabe Februar 2017, zuletzt geändert und ergänzt April 2018
\n
TRGS 400
Gefährdungsbeurteilung für Tätigkeiten mit Gefahrstoffen; Ausgabe Juli 2017
\n
TRGS 555
Betriebsanweisung und Information der Beschäftigten; Ausgabe Februar 2017
\n
TRGS 600
Substitution; Ausgabe Juli 2020
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 401
Gefährdung durch Hautkontakt, Ermittlung - Beurteilung - Maßnahmen; Ausgabe Juni 2008; zuletzt berichtigt März 2011
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 406
Sensibilisierende Stoffe für die Atemwege; Ausgabe Juni 2008, korrigiert März 2009
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 410
Expositionsverzeichnis bei Gefährdung gegenüber krebserzeugenden oder keimzellmutagenen Gefahrstoffen der Kategorien 1A oder 1B; Ausgabe Juni 2015, zuletzt berichtigt Februar 2021
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 500
Schutzmaßnahmen; Ausgabe September 2019
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 509
Lagern von flüssigen und festen Gefahrstoffen in ortsfesten Behältern sowie Füll- und Entleerstellen für ortsbewegliche Behälter; Ausgabe September 2014, zuletzt berichtigt, geändert und ergänzt Oktober 2020
\n
TRGS 510
Lagerung von Gefahrstoffen in ortsbeweglichen Behältern; Ausgabe Dezember 2020
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 800
Brandschutzmaßnahmen; Ausgabe Dezember 2010
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 560
Luftrückführung bei Tätigkeiten mit krebserzeugenden, erbgutverändernden und fruchtbarkeitsgefährdenden Stäuben; Ausgabe Januar 2012
\n " + }, + { + "drnr": "1210", + "text": "\n VORSCHRIFTEN DER UNFALLVERSICHERUNGSTRÄGER\n \n \n
\n
\n \n \n \n \n \n \n \n
DGUV Grundsatz 350-001 (BGG 904): DGUV Grundsätze für arbeitsmedizinische Untersuchungen
G 40 : Krebserzeugende und erbgutverändernde Gefahrstoffe - allgemein
\n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-190
Benutzung von Atemschutzgeräten, Ausgabe Dezember 2011
http://publikationen.dguv.de/dguv/pdf/10002/r-190.pdf
\n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-195
Benutzung von Schutzhandschuhen, Aktualisierte Nachdruckfassung Oktober 2007
http://publikationen.dguv.de/dguv/pdf/10002/bgr195.pdf
\n " + } + ], + "links": "\n \n \n \n
\n \n GHS-Einstufung/Kennzeichnung\n | \n Arbeitsplatzkennzeichnung\n | \n Wassergefährdungsklasse\n | \n TA Luft\n | \n Transportvorschriften\n | \n REACH-Kandidaten\n | \n Empfehlung MAK\n | \n Störfallverordnung\n | \n Verwendungsbeschränkungen\n | \n TRGS\n | \n Vorschriften UV-Träger\n | \n Arbeitsmedizinische Vorsorge\n \n
\n " + }, + { + "drnr": "1400", + "ueberschrift": "LINKS\n ", + "unterkapitel": [ + { + "drnr": "1400", + "text": "\n
\n
\n \n \n \n \n \n \n \n
\n Begründung zur Bewertung als krebserzeugend, erbgutverändernd oder fortpflanzungsgefährdend (Quelle BAuA)\n
\n Begründungen zu Exposition-Risiko-Beziehungen\n
\n
\n \n \n \n \n \n \n \n
\n Internationale Grenzwerte (nur auf Englisch)\n
\n
\n \n \n \n \n \n \n \n
\n OECD Screening Information DataSet (SIDS) (nur auf Englisch)\n
\n
\n \n \n \n \n \n \n \n
\n ECHA - Kandidatenliste von Stoffen mit sehr hohen Bedenken für Zulassung (nur auf Englisch)\n
\n
\n \n \n \n \n \n \n \n
\n DGUV Information 213-098: Stoffliste - Unterricht in Schulen\n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0900", + "ueberschrift": "LITERATURVERZEICHNIS\n ", + "unterkapitel": [], + "tables": "\n \n \n \n
\n

Quelle: 00001\n
IFA: Erfassungs- und Pflegehandbuch der GESTIS-Stoffdatenbank (nicht öffentlich)
Data acquisition and maintenance manual of the GESTIS substance database (non-public)

\n

Quelle: 00131\n
The Merck-Index; 14th Edition 2006

\n

Quelle: 00438\n
Registry of Toxic Effects of Chemical Substances (RTECS)

\n

Quelle: 00450\n
HSDB-Datenbankrecherche 2003

\n

Quelle: 01211\n
GHS-Sicherheitsdatenblatt, Merck
GHS Material Safety Data Sheet, Merck

\n

Quelle: 01221\n
GHS-Sicherheitsdatenblatt, Sigma-Aldrich
GHS Material Safety Data Sheet, Sigma-Aldrich

\n

Quelle: 01231\n
GHS-Sicherheitsdatenblatt, Thermo Fisher Scientific
GHS Material Safety Data Sheet, Thermo Fisher Scientific

\n

Quelle: 02071\n
Toxicological Data, compiled by the National Institute of Health (NIH), USA, selected and distributed by Technical Database Services (TDS), New York, 2009

\n

Quelle: 02072\n
Ecotoxicological Data, compiled by the US Environmental Protection Agency (EPA), selected and distributed by Technical Database Services (TDS), New York, 2009

\n

Quelle: 05300\n
TRGS 510 \"Lagerung von Gefahrstoffen in ortsbeweglichen Behältern\" Ausgabe Dezember 2020

\n

Quelle: 05323\n
Begründungen zur Bewertung von Stoffen als krebserzeugend, erbgutverändernd oder fortpflanzungsgefährdend (s. Kapitel LINKS)

\n

Quelle: 05326\n
TRGS 910 \"Risikobezogenes Maßnahmenkonzept für Tätigkeiten mit krebserzeugenden Gefahrstoffen \" Ausgabe Februar 2014, zuletzt geändert und ergänzt Februar 2021

\n

Quelle: 06002\n
L. Roth, U. Weller
\"Gefährliche Chemische Reaktionen\" Loseblattsammlung mit Ergänzungslieferungen
\"Dangerous chemical reactions\" loose-leaf collection with supplement deliveries
ecomed-Verlag

\n

Quelle: 07501\n
Verordnung (EG) Nr. 790/2009 der Kommission vom 10. August 2009 zur Änderung der Verordnung (EG) Nr. 1272/2008 des Europäischen Parlaments und des Rates über die Einstufung, Kennzeichnung und Verpackung von Stoffen und Gemischen zwecks Anpassung an den technischen und wissenschaftlichen Fortschritt (EG-GHS-Verordnung, 1. Änderung)

\n

Quelle: 07505\n
Verordnung (EU) Nr. 758/2013 der Kommission vom 7. August 2013 zur Berichtigung von Anhang VI der Verordnung (EG) Nr. 1272/2008 des Europäischen Parlaments und des Rates über die Einstufung, Kennzeichnung und Verpackung von Stoffen und Gemischen (EG-GHS-Verordnung, 2. Berichtigung)

\n

Quelle: 07580\n
Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt geändert 17.12.2020

\n

Quelle: 07596\n
REACH Kandidatenliste; Stand 19.01.2021

\n

Quelle: 07606\n
Wirth, Gloxhuber \"Toxikologie\" 4.Auflage, Thieme Verlag 1985

\n

Quelle: 07619\n
DFG: Toxikologisch-arbeitsmedizinische Begründungen von MAK-Werten; Verlag Chemie

\n

Quelle: 07620\n
DFG: Arbeitsmedizinisch-toxikologische Begründungen von BAT-Werten; Verlag Chemie

\n

Quelle: 07635\n
AUERDATA 98

\n

Quelle: 07748\n
American Conference of Governmental Industrial Hygienists \"Documentation of the threshold limit values and biological exposure indices Loseblattsammlung mit Ergänzungslieferungen

\n

Quelle: 07750\n
R. E. Lenga \"The Sigma-Aldrich Library of Chemical Safety Data\" 2nd edition, Sigma-Aldrich, Milwaukee 1988

\n

Quelle: 07783\n
E. Merian (Edt.): Metals and their Compounds in the
Environment; VCH Verlagsgellschaft mbH, Weinheim 1991

\n

Quelle: 07795\n
H. Geerißen \"GloSaDa 2000 Plus - Glove Safety Data\"

\n

Quelle: 07866\n
G.D. Clayton, F.E. Clayton (edt.) \"Patty's Industrial Hygiene and Toxicology\" Volume II \"Toxicology\" Fourth Edition, John Wiley & Sons, New York 1993

\n

Quelle: 07890\n
F. Klaschka; D. Vossmann: Kontaktallergene: Chemische, klinische und experimentelle Daten; (Allergen-Liste), Erich Schmidt Verlag, Berlin 1994

\n

Quelle: 07906\n
G. Heinemeyer, U. Fabian (Hrsg.) \"Der Vergiftungs- und Drogennotfall. Allgemeine und spezielle Maßnahmen im ärztlichen Not- und Rettungsdienst\" 3. Auflage, Ullstein Mosby, Berlin/Wiesbaden 1997

\n

Quelle: 08013\n
Ludewig \"Akute Vergiftungen\" 9. Auflage, Wissenschaftliche Verlagsgesellschaft, Stuttgart 1999

\n

Quelle: 08112\n
DFG Deutsche Forschungsgemeinschaft: MAK- und BAT-Werte-Liste 2020, Senatskommission zur Prüfung gesundheitsschädlicher Arbeitsstoffe, Mitteilung 56; GMS PUBLISSO

\n

Quelle: 99983\n
Liste arbeitsmedizinisch-toxikologischer Standardwerke (2)
List of standard references regarding occupational health and toxikology (2)

\n

Quelle: 99996\n
Projektgebundene arbeitsmedizinisch-toxikologische Literatur (2)
Project related bibliographical references regarding occupational health and toxikology (2)

\n

Quelle: 99999\n
Angabe des Bearbeiters
Indication of the editor

\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
\n \n \n \n \n \n \n \n
Dieses Stoffdatenblatt wurde sorgfältig erstellt. Dennoch kann für den Inhalt keine Haftung, gleich aus welchem Rechtsgrund, übernommen werden.
\n " + } + ] +} diff --git a/crates/search/tests/assets/wasser.json b/crates/search/tests/assets/wasser.json new file mode 100644 index 000000000..92fdedb8d --- /dev/null +++ b/crates/search/tests/assets/wasser.json @@ -0,0 +1,181 @@ +{ + "zvgnummer": "1140", + "zvgnummer_mit_null": "001140", + "name": "Wasser", + "sortiername": "Wasser", + "aliases": [{ "name": "R 718", "sortiername": "R718" }], + "hauptkapitel": [ + { + "drnr": "1300", + "ueberschrift": null, + "unterkapitel": [{ "drnr": "1303", "text": null }], + "tables": "\n \n \n \n \n \n
\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-Chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin und Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Literaturverzeichnis\n \n
\n " + }, + { + "drnr": "0100", + "ueberschrift": "IDENTIFIKATION\n ", + "unterkapitel": [ + { + "drnr": "0100", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Wasser\n
\n R 718\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
ZVG Nr:\n 1140\n
\n \n \n \n \n \n \n \n \n \n \n
CAS Nr:\n 7732-18-5\n \n
\n \n \n \n \n \n \n \n \n \n \n
EG Nr:\n 231-791-2\n \n
\n \n \n \n \n \n \n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0300", + "ueberschrift": "CHARAKTERISIERUNG\n ", + "unterkapitel": [ + { + "drnr": "0301", + "text": "\n STOFFGRUPPENSCHLÜSSEL\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
121120Nichtmetalloxide
\n " + }, + { + "drnr": "0303", + "text": "\n AGGREGATZUSTAND\n \n \n
\n
\n \n \n \n \n \n \n \n
\n FlüssigkeitDer Stoff ist flüssig.
\n " + }, + { + "drnr": "0304", + "text": "\n EIGENSCHAFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
farblos
geruchlos
\n " + }, + { + "drnr": "0305", + "text": "\n CHEMISCHE CHARAKTERISIERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Reines Wasser ist geschmacklos, geruchlos und farblos, in dicker Schicht schimmert es jedoch bläulich. Eis kommt in sieben Modifikationen vor.
Gesundheitliche Gefahren gehen von Wasser nur unter bestimmten Bedingungen aus, z.B. bei ständigem Hautkontakt (Feuchtarbeit) oder beim Umgang mit verdichtetem Dampf durch Einatmen.
\n
\n " + }, + { + "drnr": "0307", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Stoffinformationen in Wikipedia\n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0400", + "ueberschrift": "FORMEL\n ", + "unterkapitel": [ + { + "drnr": "0400", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n H2O\n
\n \n \n \n \n \n \n \n \n \n \n
H2O
\n \"001140\"\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Molmasse: 18,02 g/mol
\n
Umrechnungsfaktor (Gasphase) bei 1013 mbar und 20 °C:
\n \n \n \n \n \n \n \n \n \n
1 ml/m³  =   0,749 mg/m³
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0600", + "ueberschrift": "PHYSIKALISCH CHEMISCHE EIGENSCHAFTEN\n ", + "unterkapitel": [ + { + "drnr": "0602", + "text": "\n SCHMELZPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Schmelzpunkt: 0,0 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01221 
\n " + }, + { + "drnr": "0603", + "text": "\n SIEDEPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Siedepunkt:100 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01221 
\n " + }, + { + "drnr": "0617", + "text": "\n KRITISCHE DATEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Kritische Temp.:374,15 °C
\n
\n \n \n \n \n \n \n \n \n \n
Kritischer Druck:224,13 bar
\n
\n \n \n \n \n \n \n \n \n \n
Kritische Dichte:0,315 g/cm³
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n " + }, + { + "drnr": "0604", + "text": "\n DICHTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert: 1,000 g/cm³
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur: 3,98 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01221 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert: 0,99705 g/cm³
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur: 25 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
RELATIVE GASDICHTE
Dichteverhältnis zu trockener Luft bei gleicher Temperatur und gleichem Druck
\n \n \n \n \n \n \n \n \n \n
Wert: 0,631
\n
(100°C/1,013bar)
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n " + }, + { + "drnr": "0605", + "text": "\n DAMPFDRUCK\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 6,1 hPa
Temperatur: 0 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 12 hPa
Temperatur: 10 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 23 hPa
Temperatur: 20 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 42 hPa
Temperatur: 30 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 74 hPa
Temperatur: 40 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 123 hPa
Temperatur: 50 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck: 199 hPa
Temperatur: 60 °C
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00150 
\n " + }, + { + "drnr": "0614", + "text": "\n pH-WERT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
pH-Wert: 7,00
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur: 20 °C
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n " + }, + { + "drnr": "0619", + "text": "\n GEFÄHRLICHES REAKTIONSVERHALTEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefährliche chemische Reaktionen:
Wasser reagiert mit einer großen Zahl von Stoffen heftig oder explosiv unter Entzündung des freigesetzten Wasserstoffs.
\n
Stoffgruppen, die mit Wasser gefährlich reagieren:
Aluminiumalkylverbindungen, Alkalimetalle, Erdalkalimetalle, Metallhydride oder Nichtmetallhydride; Säureanhydride; Säurechloride; Metall- oder Nichtmetalloxide
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 06002 99999 
\n " + } + ], + "links": "\n \n \n \n
\n \n Schmelzpunkt\n | \n Siedepunkt\n | \n Kritische Daten\n | \n Dichte\n | \n Dampfdruck\n | \n pH - Wert\n | \n Gefährliche Reaktionen\n \n
\n " + }, + { + "drnr": "0500", + "ueberschrift": "TOXIKOLOGIE / ÖKOTOXIKOLOGIE\n ", + "unterkapitel": [ + { + "drnr": "0501", + "text": "\n TOXIKOLOGISCHE DATEN\n \n \n
\n
\n \n \n \n \n \n \n \n
LD50 oral Ratte
\n \n \n \n \n \n \n \n \n \n
Wert:> 89800 mg/kg
\n \n \n \n \n \n \n \n
Food Research. Vol. 21, Pg. 348, 1956.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 02071 
\n " + } + ], + "links": null + }, + { + "drnr": "0700", + "ueberschrift": "ARBEITSMEDIZIN UND ERSTE HILFE\n ", + "unterkapitel": [ + { + "drnr": "1211", + "text": "\n ARBEITSMEDIZINISCHE VORSORGE\n \n \n
\n
\n \n \n \n \n \n \n \n
Pflichtvorsorge: Bei Feuchtarbeiten von regelmäßig 4 Stunden oder mehr pro Tag ist arbeitsmedizinische Vorsorge zu veranlassen.
Angebotsvorsorge: Bei Feuchtarbeiten von regelmäßig mehr als 2 Stunden pro Tag ist arbeitsmedizinische Vorsorge anzubieten.
\n
\n \n \n \n \n \n \n \n
\n
Fristen: Beschäftigte dürfen eine Tätigkeit mit diesem Stoff nur nach Teilnahme an der Pflichtvorsorge ausüben. Angebotsvorsorge muss vor Aufnahme der Tätigkeiten angeboten werden. Fristen für die Veranlassung bzw. das Angebot von regelmäßiger arbeitsmedizinischer Vorsorge sind der arbeitsmedizinischen Regel „AMR Nummer 2.1“ zu entnehmen.
\n " + } + ], + "links": "\n \n \n \n
\n \n Arbeitsmedizinische Vorsorge\n \n
\n " + }, + { + "drnr": "0800", + "ueberschrift": "SICHERER UMGANG\n ", + "unterkapitel": [ + { + "drnr": "0802", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – HANDHABUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitsraum - Ausstattung/Belüftung:
Keine besonderen Maßnahmen erforderlich.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise zum sicheren Umgang:
Besondere Maßnahmen zum sicheren Umgang mit reinem Wasser sind, von Ausnahmen abgesehen, nicht erforderlich. (Eine Ausnahme ist z.B. der Umgang mit verdichtetem Dampf)
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reinigung und Instandhaltung:
Entfällt
\n
\n " + }, + { + "drnr": "0803", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – LAGERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Lagerbedingungen:
Entfällt
\n
\n " + }, + { + "drnr": "0804", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN - BRAND- UND EXPLOSIONSSCHUTZ\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Technische, konstruktive Maßnahmen:
Entfällt
\n
\n " + }, + { + "drnr": "0805", + "text": "\n ORGANISATORISCHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Unvermeidbare Feuchtarbeit ist soweit wie möglich auf mehrere Personen zu verteilen, um die Exposition für den Einzelnen zu verringern.
Anzustreben ist ein Wechsel von Feucht- und Trockenarbeit.
\n
\n " + }, + { + "drnr": "0806", + "text": "\n PERSÖNLICHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Körperschutz:
Bei Arbeiten mit erhitztem Wasser oder Wasserdampf ist zur Vermeidung von Verbrennungen (Verbrühungen) entsprechender Körperschutz zu tragen.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemschutz:
Atemschutz ist nicht erforderlich.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Handschutz:
Handschutz auf die anderen verwendeten Stoffe abstimmen.
Bei ständigem Hautkontakt mit Wasser (Feuchtarbeit) sollten unbedingt Schutzhandschuhe getragen werden. Vorbeugenden Hautschutz beachten.
Geeignet sind Handschuhe aus folgenden Materialien (Durchbruchzeit >= 8 Stunden):
Naturkautschuk/Naturlatex - NR (0,5 mm) (ungepuderte und allergenfreie Produkte verwenden)
Polychloropren - CR (0,5 mm)
Nitrilkautschuk/Nitrillatex - NBR (0,35 mm)
Butylkautschuk - Butyl (0,5 mm)
Fluorkautschuk - FKM (0,4 mm)
Polyvinylchlorid - PVC (0,5 mm)
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitshygiene:
Übliche Hygienemaßnahmen für den Umgang mit chemischen Stoffen beachten, insbesondere Haut vor Pausen und bei Arbeitsende mit Wasser und Seife reinigen und fetthaltige Hautpflegemittel nach der Reinigung verwenden.
\n " + }, + { + "drnr": "0807", + "text": "\n ENTSORGUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Entfällt
\n
\n " + }, + { + "drnr": "0808", + "text": "\n MASSNAHMEN BEI UNBEABSICHTIGTER FREISETZUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Aufwischen.
\n
\n " + }, + { + "drnr": "0809", + "text": "\n MASSNAHMEN BEI BRÄNDEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verhaltensmaßregeln:
Entfällt
\n
\n " + } + ], + "links": "\n \n \n \n
\n \n Handhabung\n | \n Lagerung\n | \n Brand- und Explosionsschutz\n | \n Organisatorische Maßnahmen\n | \n Persönl. Schutzmaßnahmen\n | \n Entsorgung\n | \n Freisetzung\n | \n Maßnahmen bei Bränden\n \n
\n " + }, + { + "drnr": "1100", + "ueberschrift": "VORSCHRIFTEN\n ", + "unterkapitel": [ + { + "drnr": "1303", + "text": "\n EU-GHS-EINSTUFUNG UND KENNZEICHNUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Kein gefährlicher Stoff nach GHS.
Herstellerangabe Sigma-Aldrich
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01221 
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Stand:2019
geprüft:2020
\n " + }, + { + "drnr": "1209", + "text": "\n TECHNISCHE REGELN FÜR GEFAHRSTOFFE (TRGS)\n \n \n
\n
\n \n \n \n \n \n \n \n
TRGS 500
Schutzmaßnahmen; Ausgabe September 2019
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 509
Lagern von flüssigen und festen Gefahrstoffen in ortsfesten Behältern sowie Füll- und Entleerstellen für ortsbewegliche Behälter; Ausgabe September 2014, zuletzt berichtigt, geändert und ergänzt Oktober 2020
\n
TRGS 510
Lagerung von Gefahrstoffen in ortsbeweglichen Behältern; Ausgabe Dezember 2020
\n " + } + ], + "links": "\n \n \n \n
\n \n GHS-Einstufung/Kennzeichnung\n | \n TRGS\n | \n Arbeitsmedizinische Vorsorge\n \n
\n " + }, + { + "drnr": "0900", + "ueberschrift": "LITERATURVERZEICHNIS\n ", + "unterkapitel": [], + "tables": "\n \n \n \n
\n

Quelle: 00001\n
IFA: Erfassungs- und Pflegehandbuch der GESTIS-Stoffdatenbank (nicht öffentlich)
Data acquisition and maintenance manual of the GESTIS substance database (non-public)

\n

Quelle: 00150\n
D'Ans-Lax \"Taschenbuch für Chemiker und Physiker\" (\"Paperback for chemists and physicists\"), 4. Auflage; Springer-Verlag, 1992

\n

Quelle: 01221\n
GHS-Sicherheitsdatenblatt, Sigma-Aldrich
GHS Material Safety Data Sheet, Sigma-Aldrich

\n

Quelle: 02071\n
Toxicological Data, compiled by the National Institute of Health (NIH), USA, selected and distributed by Technical Database Services (TDS), New York, 2009

\n

Quelle: 06002\n
L. Roth, U. Weller
\"Gefährliche Chemische Reaktionen\" Loseblattsammlung mit Ergänzungslieferungen
\"Dangerous chemical reactions\" loose-leaf collection with supplement deliveries
ecomed-Verlag

\n

Quelle: 07795\n
H. Geerißen \"GloSaDa 2000 Plus - Glove Safety Data\"

\n

Quelle: 99999\n
Angabe des Bearbeiters
Indication of the editor

\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Literaturverzeichnis\n \n
\n \n \n \n \n \n \n \n
Dieses Stoffdatenblatt wurde sorgfältig erstellt. Dennoch kann für den Inhalt keine Haftung, gleich aus welchem Rechtsgrund, übernommen werden.
\n " + } + ] +} diff --git a/crates/search/tests/assets/wasserglas.json b/crates/search/tests/assets/wasserglas.json new file mode 100644 index 000000000..f76e43c60 --- /dev/null +++ b/crates/search/tests/assets/wasserglas.json @@ -0,0 +1,137 @@ +{ + "zvgnummer_mit_null": "535603", + "name": "Wasserglas (Molverhältnis >1,6 ... 3,2)", + "hauptkapitel": [ + { + "drnr": "1300", + "unterkapitel": [ + { + "drnr": "1303", + "text": null + } + ] + }, + { + "drnr": "0100", + "unterkapitel": [ + { + "drnr": "0100", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Wasserglas (Molverhältnis >1,6 ... 3,2)\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
ZVG Nr:\n 535603\n
\n \n
\n
\n \n \n \n \n \n \n \n
Verwandte
\n \n \n \n \n \n \n \n \n \n \n \n
CAS Nr:1344-09-8Kieselsäure, Natriumsalz
\n \n \n \n \n \n \n \n \n \n \n
EG Nr:215-687-4\n
\n " + } + ] + }, + { + "drnr": "0300", + "unterkapitel": [ + { + "drnr": "0301", + "text": "\n STOFFGRUPPENSCHLÜSSEL\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
122200
126500
Natriumverbindungen
Silikate
\n " + }, + { + "drnr": "0303", + "text": "\n AGGREGATZUSTAND\n \n \n
\n
\n \n \n \n \n \n \n \n
\n FlüssigkeitDer Stoff ist flüssig.
\n " + }, + { + "drnr": "0305", + "text": "\n CHEMISCHE CHARAKTERISIERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Wassergläser sind wässrige Lösungen von Alkalisilikaten (Schmelzprodukte aus Quarzsand und Soda). Diese wässrigen Lösungen unterscheiden sich durch die Gewichtsverhältnisse der Kieselsäure-(SiO2) und Alkalioxidanteile (Na2O) der gelösten Alkalisilikatsalze und in ihren Feststoffgehalten.
Das Gewichtsverhältnis ist der Quotient aus Kieselsäure- und Alkalioxidanteil: GV= SiO2/Na2O. Das Molverhältnis ergibt sich aus dem Gewichtverhältnis: Molverhältnis (MV) = Gewichtsverhältnis (GV) x 1,032
Natronwassergläser gibt es in drei verschiedenen Formen:
- festes stückiges Wasserglas
- Wasserglaslösungen
- sprühgetrocknetes wasserlösliches Pulver
Die Herstellung der Natron-Wassergläser erfolgt durch Zusammenschmelzen von Siliciumdioxid und Natriumoxid (oder Natriumcarbonat unter Entwicklung von Kohlendioxid) in molaren Verhältnissen zwischen 1:2 bis 1:4. Die so erhaltenen Feststoffe werden bei ca. 150 Grad C und 5 bar Dampfdruck in Wasser gelöst.
Die Wassergläser reagieren infolge teilweiser Hydrolyse der Alkalisilikate alkalisch (silikatreiche Wassergläser) bis stark alkalisch (silikatarme Wassergläser). Durch Kohlendioxid der Luft werden Lösungen allmählich neutralisiert, wobei je nach Konzentration Fällungsprodukte der Kieselsäure entstehen.
 
Nicht brennbarer Stoff.
Mit Wasser mischbar.
Von dem Stoff gehen akute oder chronische Gesundheitsgefahren aus.
(s. Kapitel VORSCHRIFTEN).
\n " + }, + { + "drnr": "0400", + "text": "\n \n \n \n \n \n
\n
\n " + } + ] + }, + { + "drnr": "0600", + "unterkapitel": [ + { + "drnr": "0613", + "text": "\n WASSERLÖSLICHKEIT\n \n \n
\n
\n \n \n \n \n \n \n \n
vollständig mischbar mit Wasser
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 08005 
\n " + }, + { + "drnr": "0614", + "text": "\n pH-WERT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
pH-Wert:
alkalisch
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 08005 
\n " + } + ] + }, + { + "drnr": "0800", + "unterkapitel": [ + { + "drnr": "0802", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – HANDHABUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitsraum - Ausstattung/Belüftung:
Gute Be- und Entlüftung des Arbeitsraumes vorsehen.
Waschgelegenheit am Arbeitsplatz vorsehen.
Augenbrausen vorsehen. Standorte auffallend kennzeichnen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Apparaturen:
Möglichst geschlossene Apparaturen verwenden.
Ist das Austreten des Stoffes nicht zu verhindern, ist dieser an der Austrittsstelle gefahrlos abzusaugen.
Behälter und Leitungen sind eindeutig zu kennzeichnen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise zum sicheren Umgang:
Auf Sauberkeit am Arbeitsplatz achten.
An Arbeitsplätzen dürfen nur die Substanzmengen vorhanden sein, die für den Fortgang der Arbeiten erforderlich sind.
Gefäße nicht offenstehen lassen.
Beim Ab- und Umfüllen sowie bei offener Anwendung muss eine ausreichende Lüftung gewährleistet sein.
Verspritzen vermeiden.
Nur in gekennzeichnete Behälter abfüllen.
Bei offenem Hantieren jeglichen Kontakt vermeiden.
Beim Transport in zerbrechlichen Gefäßen geeignete Überbehälter benutzen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reinigung und Instandhaltung:
Beim Reinigen ggf. persönliche Schutzausrüstung benutzen.
Instandhaltungsarbeiten und Arbeiten in Behältern oder engen Räumen nur mit schriftlicher Erlaubnis durchführen.
\n " + }, + { + "drnr": "0803", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – LAGERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Lagerbedingungen:
Keine Lebensmittelgefäße verwenden - Verwechslungsgefahr!
Behälter sind eindeutig und dauerhaft zu kennzeichnen.
Möglichst im Originalbehälter aufbewahren.
Unzerbrechliche Behälter sind Glasbehältern vorzuziehen.
Zerbrechliche Gefäße in bruchsichere Übergefäße einstellen.
Behälter dicht verschlossen an einem kühlen, trockenen, gut belüfteten Ort aufbewahren.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Zusammenlagerungsbedingungen:
Lagerklasse 10 - 13 (Auf eine weitere Differenzierung wird verzichtet, da es innerhalb der Lagerklassen 10 - 13 keine gesetzlichen Zusammenlagerungsbeschränkungen gibt.)
Es sollten nur Stoffe derselben Lagerklasse zusammengelagert werden.
Die Zusammenlagerung mit folgenden Stoffen ist verboten:
- Arzneimittel, Lebensmittel und Futtermittel einschließlich Zusatzstoffe.
- Ansteckungsgefährliche, radioaktive und explosive Stoffe.
- Stark oxidierend wirkende Stoffe der Lagerklasse 5.1A.
Die Zusammenlagerung mit folgenden Stoffen ist nur unter bestimmten Bedingungen erlaubt (Einzelheiten siehe TRGS 510):
- Gase
- Entzündbare flüssige Stoffe der Lagerklasse 3.
- Sonstige explosionsgefährliche Stoffe der Lagerklasse 4.1A.
- Pyrophore Stoffe.
- Stoffe, die in Berührung mit Wasser entzündbare Gase entwickeln.
- Oxidierend wirkende Stoffe der Lagerklasse 5.1B.
- Ammoniumnitrat und ammoniumnitrathaltige Zubereitungen.
- Organische Peroxide und selbstzersetzliche Stoffe.
- Brennbare und nicht brennbare akut giftige Stoffe der Lagerklassen 6.1A und 6.1B.
Der Stoff sollte nicht mit Stoffen zusammengelagert werden, mit denen gefährliche chemische Reaktionen möglich sind.
\n " + }, + { + "drnr": "0804", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN - BRAND- UND EXPLOSIONSSCHUTZ\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Technische, konstruktive Maßnahmen:
Stoff ist nicht brennbar. Brand- und Explosionsschutzmaßnahmen auf die brennbaren Stoffe im Bereich abstimmen.
\n " + }, + { + "drnr": "0805", + "text": "\n ORGANISATORISCHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Unterweisung über Gefahren und Schutzmaßnahmen anhand der Betriebsanweisung (TRGS 555) mit Unterschrift erforderlich, falls mehr als nur eine geringe Gefährdung festgestellt wurde.
Unterweisungen vor der Beschäftigung und danach mindestens einmal jährlich durchführen.
Beschäftigungsbeschränkungen für Jugendliche nach dem Jugendarbeitsschutzgesetz beachten.
\n " + }, + { + "drnr": "0806", + "text": "\n PERSÖNLICHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Körperschutz:
Je nach Gefährdung geeignete Schutzkleidung oder geeigneten Chemikalienschutzanzug tragen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemschutz:
In Ausnahmesituationen (z.B. unbeabsichtigte Stofffreisetzung) ist das Tragen von Atemschutz erforderlich. Tragezeitbegrenzungen beachten.
Informationen über geeignete Filtergeräte liegen uns zurzeit nicht vor.
Isoliergeräte können in jedem Fall verwendet werden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Augenschutz:
Es muss ausreichender Augenschutz getragen werden.
Korbbrille verwenden.
Können augenschädigende Dämpfe oder Aerosole auftreten, ist der Schutz der Augen am besten durch eine Vollmaske sicherzustellen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Handschutz:
Schutzhandschuhe verwenden. Das Handschuhmaterial muss gegen den verwendeten Stoff ausreichend undurchlässig und beständig sein. Vor Gebrauch Dichtheit prüfen. Handschuhe vor dem Ausziehen vorreinigen, danach gut belüftet aufbewahren. Hautpflege beachten.
Hautschutzsalben bieten keinen ausreichenden Schutz gegen diesen Stoff.
Informationen über geeignete Handschuhmaterialien liegen uns zurzeit nicht vor.
Geeignete Materialien beim Hersteller erfragen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitshygiene:
Übliche Hygienemaßnahmen für den Umgang mit chemischen Stoffen beachten, insbesondere Haut vor Pausen und bei Arbeitsende mit Wasser und Seife reinigen und fetthaltige Hautpflegemittel nach der Reinigung verwenden.
Berührung mit der Haut vermeiden. Nach Substanzkontakt ist Hautreinigung erforderlich.
Berührung mit den Augen vermeiden. Nach Substanzkontakt Augenspülung vornehmen.
Einatmen von Dämpfen/Stäuben vermeiden.
\n " + }, + { + "drnr": "0807", + "text": "\n ENTSORGUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Gefährlicher Abfall nach Abfallverzeichnis-Verordnung (AVV).
Wenn eine Verwertung nicht möglich ist, müssen Abfälle unter Beachtung der örtlichen behördlichen Vorschriften beseitigt werden.
 
Sammlung von Kleinmengen:
In Sammelbehälter für Salzlösungen geben, ein pH-Wert von 6-8 ist einzustellen.
Sammelgefäße sind deutlich mit der systematischen Bezeichnung ihres Inhaltes zu beschriften. Gefäße an einem gut gelüfteten Ort aufbewahren. Der zuständigen Stelle zur Abfallbeseitigung übergeben.
\n " + }, + { + "drnr": "0808", + "text": "\n MASSNAHMEN BEI UNBEABSICHTIGTER FREISETZUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Gefährdeten Bereich räumen, betroffene Umgebung warnen.
Zur Beseitigung des gefährlichen Zustandes darf der Gefahrenbereich nur mit geeigneten Schutzmaßnahmen betreten werden (s. Kapitel Persönliche Schutzmaßnahmen).
Mit Universalbinder (Absorptionsmittel und Neutralisationsmittel für verschüttete Laugen) aufnehmen und vorschriftsmäßig entsorgen.
Alternativ:
Verschüttetes Wasserglas oder Spritzer sollten sofort mit reichlich warmem Wasser fortgewaschen werden.
Anschließend Raum lüften und verschmutzte Gegenstände und Boden reinigen.
 
Gewässergefährdung:
Schwach wassergefährdend. Beim Eindringen sehr großer Mengen in Gewässer, Kanalisation oder Erdreich Behörden verständigen.
\n " + }, + { + "drnr": "0809", + "text": "\n MASSNAHMEN BEI BRÄNDEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verhaltensmaßregeln:
Stoff selbst brennt nicht, Löschmaßnahmen auf Umgebung abstimmen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Persönliche Schutzausrüstung bei der Brandbekämpfung:
Umgebungsluftunabhängiges Atemschutzgerät tragen.
\n " + } + ] + }, + { + "drnr": "1100", + "unterkapitel": [ + { + "drnr": "1303", + "text": "\n EU-GHS-EINSTUFUNG UND KENNZEICHNUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Einstufung:
Reizwirkung auf die Haut, Kategorie 2; H315
Augenreizung, Kategorie 2; H319
Spezifische Zielorgan-Toxizität (einmalige Exposition), Kategorie 3; H335
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs07\"\n \n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Signalwort:\"Achtung\"
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefahrenhinweise - H-Sätze:
H315: Verursacht Hautreizungen.
H319: Verursacht schwere Augenreizung.
H335: Kann die Atemwege reizen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Sicherheitshinweise - P-Sätze:
P261: Einatmen von Staub/Rauch/Gas/Nebel/Dampf/Aerosol vermeiden.
P262: Nicht in die Augen, auf die Haut oder auf die Kleidung gelangen lassen.
P280: Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen.
P303+P361+P353: BEI BERÜHRUNG MIT DER HAUT (oder dem Haar): Alle kontaminierten Kleidungsstücke sofort ausziehen. Haut mit Wasser abwaschen oder duschen.
P305+P351+P338: BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen.
\n \n
\n
\n \n \n \n \n \n \n \n
GESTIS-Hinweis:
H335 gilt nur für das Pulver und entfällt für Klumpen oder wässrige Lösungen.
 
Registrierungseintrag des Herstellers auf der Internetseite der ECHA
für Wasserglas mit Molverhältnis > 2,6
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07520 99999 
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Stand:2020
geprüft:2021
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Einstufung:
Reizwirkung auf die Haut, Kategorie 2; H315
Schwere Augenschädigung, Kategorie 1; H318
Spezifische Zielorgan-Toxizität (einmalige Exposition), Kategorie 3; H335
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs05\"\n \n \"ghs07\"\n \n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Signalwort:\"Gefahr\"
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefahrenhinweise - H-Sätze:
H315: Verursacht Hautreizungen.
H318: Verursacht schwere Augenschäden.
H335: Kann die Atemwege reizen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Sicherheitshinweise - P-Sätze:
P261: Einatmen von Staub/Rauch/Gas/Nebel/Dampf/Aerosol vermeiden.
P262: Nicht in die Augen, auf die Haut oder auf die Kleidung gelangen lassen.
P280: Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen.
P303+P361+P353: BEI BERÜHRUNG MIT DER HAUT (oder dem Haar): Alle kontaminierten Kleidungsstücke sofort ausziehen. Haut mit Wasser abwaschen oder duschen.
P305+P351+P338: BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen.
\n \n
\n
\n \n \n \n \n \n \n \n
GESTIS-Hinweis:
H335 und Piktogramm GHS05 gelten nur für das Pulver und entfallen für Klumpen oder wässrige Lösungen.
 
Registrierungseintrag des Herstellers auf der Internetseite der ECHA
für Wasserglas mit Molverhältnis >1,6 ... 2,6
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07520 99999 
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Stand:2020
geprüft:2021
\n " + }, + { + "drnr": "1302", + "text": "\n GHS-EINSTUFUNG VON GEMISCHEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Die Einstufung von Gemischen, die diesen Stoff enthalten, ergibt sich aus Anhang 1 der Verordnung (EG) 1272/2008.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n " + }, + { + "drnr": "1104", + "text": "\n ARBEITSPLATZKENNZEICHNUNG NACH ASR A1.3\n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Warnzeichen:
\n \n \n \n \n \n
\n \"W04_AETZ\"\n Warnung vor ätzenden Stoffen
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gebotszeichen:
\n \n \n \n \n \n
\n \"M01_auge\"\n Augenschutz benutzen
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n \"M06_hand\"\n Schutzhandschuhe benutzen
\n
\n " + }, + { + "drnr": "1106", + "text": "\n EINSTUFUNG WASSERGEFÄHRDENDER STOFFE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Stoff Nr.:1314
\n
WGK 1 - schwach wassergefährdend
Einstufung gemäß Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt ergänzt 18.11.2021
\n " + }, + { + "drnr": "1108", + "text": "\n TRANSPORTVORSCHRIFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Den Transportvorschriften nicht unterstellt.
\n \n
\n
\n \n \n \n \n \n \n \n
gilt für wässrige Löungen oder Stücke.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07520 99999 
\n " + }, + { + "drnr": "1208", + "text": "\n VERWENDUNGSBESCHRÄNKUNGEN / VERWENDUNGSVERBOTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
REACH-Verordnung (EG) Nr. 1907/2006 Anhang XVII
Anhang XVII, Nummer 3
1. Das Inverkehrbringen und die Verwendung des Stoffes ist nicht zugelassen in Dekorationsgegenständen, Spielen und Scherzspielen.
2. Stoffe, die mit H304 gekennzeichnet sind, die als Brennstoff in Zierlampen verwendet werden können und die in Mengen von 15 l oder weniger in den Verkehr gebracht werden, dürfen keinen Farbstoff und/oder kein Parfüm enthalten.
Weitere Informationen zu den Verboten sind der Verordnung zu entnehmen.
\n \n
\n
\n \n \n \n \n \n \n \n
Anhang XVII der Verordnung (EG) 1907/2006, konsolidierte Version (BAUA)
\n " + }, + { + "drnr": "1209", + "text": "\n TECHNISCHE REGELN FÜR GEFAHRSTOFFE (TRGS)\n \n \n
\n
\n \n \n \n \n \n \n \n
TRGS 201
Einstufung und Kennzeichnung bei Tätigkeiten mit Gefahrstoffen; Ausgabe Februar 2017, zuletzt geändert und ergänzt April 2018
\n
TRGS 400
Gefährdungsbeurteilung für Tätigkeiten mit Gefahrstoffen; Ausgabe Juli 2017
\n
TRGS 555
Betriebsanweisung und Information der Beschäftigten; Ausgabe Februar 2017
\n
TRGS 600
Substitution; Ausgabe Juli 2020
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 401
Gefährdung durch Hautkontakt, Ermittlung - Beurteilung - Maßnahmen; Ausgabe Juni 2008; zuletzt berichtigt März 2011
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 500
Schutzmaßnahmen; Ausgabe September 2019
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 509
Lagern von flüssigen und festen Gefahrstoffen in ortsfesten Behältern sowie Füll- und Entleerstellen für ortsbewegliche Behälter; Ausgabe September 2014, zuletzt berichtigt, geändert und ergänzt Oktober 2020
\n
TRGS 510
Lagerung von Gefahrstoffen in ortsbeweglichen Behältern; Ausgabe Dezember 2020
\n " + }, + { + "drnr": "1210", + "text": "\n VORSCHRIFTEN DER UNFALLVERSICHERUNGSTRÄGER\n \n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-190
Benutzung von Atemschutzgeräten, Ausgabe Dezember 2011
http://publikationen.dguv.de/dguv/pdf/10002/r-190.pdf
\n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-195
Benutzung von Schutzhandschuhen, Aktualisierte Nachdruckfassung Oktober 2007
http://publikationen.dguv.de/dguv/pdf/10002/bgr195.pdf
\n " + } + ] + }, + { + "drnr": "0900", + "unterkapitel": [] + } + ], + "aliases": [] +} \ No newline at end of file diff --git a/crates/search/tests/assets/wasserstoffperoxid.json b/crates/search/tests/assets/wasserstoffperoxid.json new file mode 100644 index 000000000..5e8d26a50 --- /dev/null +++ b/crates/search/tests/assets/wasserstoffperoxid.json @@ -0,0 +1,237 @@ +{ + "zvgnummer": "2430", + "zvgnummer_mit_null": "002430", + "name": "Wasserstoffperoxid ab 60 %", + "sortiername": "Wasserstoffperoxid", + "aliases": [ + { + "name": "Wasserstoffsuperoxid", + "sortiername": "Wasserstoffsuperoxid" + } + ], + "hauptkapitel": [ + { + "drnr": "1300", + "ueberschrift": null, + "unterkapitel": [{ "drnr": "1303", "text": null }], + "tables": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs03\"\n \n \"ghs05\"\n \n \"ghs07\"\n \n \n
\n \n \n \n \n \n \n
\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-Chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin und Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
\n " + }, + { + "drnr": "0100", + "ueberschrift": "IDENTIFIKATION\n ", + "unterkapitel": [ + { + "drnr": "0100", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Wasserstoffperoxid ab 60 %\n
\n Wasserstoffsuperoxid\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
ZVG Nr:\n 2430\n
\n \n \n \n \n \n \n \n \n \n \n
CAS Nr:\n 7722-84-1\n \n
\n \n \n \n \n \n \n \n \n \n \n
EG Nr:\n 231-765-0\n \n
\n \n \n \n \n \n \n \n \n \n
INDEX Nr:\n 008-003-00-9\n
\n \n \n \n \n \n \n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0300", + "ueberschrift": "CHARAKTERISIERUNG\n ", + "unterkapitel": [ + { + "drnr": "0301", + "text": "\n STOFFGRUPPENSCHLÜSSEL\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
121210Peroxide und Hyperoxide, anorganisch
\n " + }, + { + "drnr": "0303", + "text": "\n AGGREGATZUSTAND\n \n \n
\n
\n \n \n \n \n \n \n \n
\n FlüssigkeitDer Stoff ist flüssig.
\n " + }, + { + "drnr": "0304", + "text": "\n EIGENSCHAFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
farblos
fast geruchlos
\n " + }, + { + "drnr": "0305", + "text": "\n CHEMISCHE CHARAKTERISIERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Sehr reaktionsfähige oxidierende Flüssigkeit.
Stoff selbst brennt nicht, reagiert aber so heftig mit brennbaren Stoffen, dass er diese z.T. ohne weitere Zündquelle zur Entzündung bringen und einen bestehenden Brand erheblich fördern kann.
Mit Wasser mischbar.
Wässrige Lösung reagiert sauer.
Schwer oder sehr schwer flüchtig.
Durch erhöhte Temperaturen oder Katalysatoren zersetzt sich Wasserstoffperoxid zu Wasser und Sauerstoff.
Von dem Stoff gehen akute oder chronische Gesundheitsgefahren aus.
(s. Kapitel VORSCHRIFTEN).
\n " + }, + { + "drnr": "0307", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n Stoffinformationen in Wikipedia\n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0400", + "ueberschrift": "FORMEL\n ", + "unterkapitel": [ + { + "drnr": "0400", + "text": "\n \n \n \n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n H2O2\n
\n \n \n \n \n \n \n \n \n \n \n
H2O2
\n \"002430\"\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Molmasse: 34,01 g/mol
\n
Umrechnungsfaktor (Gasphase) bei 1013 mbar und 20 °C:
\n \n \n \n \n \n \n \n \n \n
1 ml/m³  =   1,41 mg/m³
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0600", + "ueberschrift": "PHYSIKALISCH CHEMISCHE EIGENSCHAFTEN\n ", + "unterkapitel": [ + { + "drnr": "0602", + "text": "\n SCHMELZPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Schmelzpunkt:-0,43 °C
\n
Reinstoff
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00107 00132 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Schmelzpunkt:-11,5 °C
\n
Wasserstoffperoxid 90 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00419 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Schmelzpunkt:-40,3 °C
\n
Wasserstoffperoxid 70 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00419 
\n " + }, + { + "drnr": "0603", + "text": "\n SIEDEPUNKT\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Siedepunkt:150,2 °C
\n
Reinstoff
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00456 02110 07520 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Siedepunkt:141,3 °C
\n
Wasserstoffperoxid 90 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00419 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Siedepunkt:125,5 °C
\n
Wasserstoffperoxid 70 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00419 
\n " + }, + { + "drnr": "0604", + "text": "\n DICHTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert:1,463 g/cm³
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur:20 °C
\n
Reinstoff
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00132 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert:1,39 g/cm³
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur:20 °C
\n
Wasserstoffperoxid 90 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00419 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
DICHTE
\n \n \n \n \n \n \n \n \n \n
Wert:1,29 g/cm³
\n
\n \n \n \n \n \n \n \n \n \n
Temperatur:20 °C
\n
Wasserstoffperoxid 70 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00419 
\n " + }, + { + "drnr": "0605", + "text": "\n DAMPFDRUCK\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck:8 hPa
Temperatur:20 °C
\n \n \n \n \n \n \n \n
Partialdruck (H2O2) 0,98 hPa
Wasserstoffperoxid 70 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07869 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck:14,7 hPa
Temperatur:30 °C
\n \n \n \n \n \n \n \n
Partialdruck (H2O2) 2,00 hPa
Wasserstoffperoxid 70 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07869 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck:6,67 hPa
Temperatur:30 °C
\n \n \n \n \n \n \n \n
Partialdruck (H2O2) 3,33 hPa
Wasserstoffperoxid 90 %
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07869 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck:1,9 hPa
Temperatur:20 °C
\n \n \n \n \n \n \n \n
Reinstoff
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00107 00305 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck:3,9 hPa
Temperatur:30 °C
\n \n \n \n \n \n \n \n
Reinstoff
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00107 
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Dampfdruck:13,2 hPa
Temperatur:50 °C
\n \n \n \n \n \n \n \n
Reinstoff
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00107 
\n " + }, + { + "drnr": "0613", + "text": "\n WASSERLÖSLICHKEIT\n \n \n
\n
\n \n \n \n \n \n \n \n
vollständig mischbar mit Wasser
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 00107 
\n " + }, + { + "drnr": "0619", + "text": "\n GEFÄHRLICHES REAKTIONSVERHALTEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Thermische Zersetzung:
Die Zersetzungsgeschwindigkeit, die bei Zimmertemperatur gering ist, wird durch Wärme, Licht und Alkalien stark beschleunigt und bis zur Explosion gesteigert.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Zersetzungsprodukte:
Sauerstoff
Wasser
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefährliche chemische Reaktionen:
Für Wasserstoffperoxid > 60% gilt:
 
Explosionsgefahr bei Kontakt mit:
Ammoniak
brennbaren Stoffen
Kalium
Lithium
Natrium
organischen Stoffen
Reduktionsmitteln
Schwefelsäure
Acetaldehyd; Aceton; Aktivkohle; Alkalihydroxid + Schwermetallen; Alkoholen (selten); Ameisensäure; Anilin (selten); Blei; Bleihydroxid; t-Butanol/Schwefelsäure; Eisensalze; Essigsäure; Essigsäureanhydrid; Ethanol; Ether; Formaldehyd; Furfurylalkohol; Gadoliniumhydroxid; Glycerin; Hydrazin; Hydrazinhydrat; Hydride (selten); Iridium;
Kaliumiodid; Katalysatoren; Keten; Kobalt; Kupfersalzen; Lithiumaluminiumhydrid; organischen und peroxidierbaren Lösungsmitteln; Magnesium; Messing; Metalloxiden; Metallpulvern; Methanol; Nitromethan; rauhe Oberflächen (selten); Öl; Peroxybenzolsulfonsäureanhydrid; 1-Phenyl-2-methylpropan-2-ol; Phosphorpentoxid; porösen Stoffen wie Kork; Rost; Schwermetalle; Staubteilchen; Thioharnstoff + Methanol; Vinylacetat (Katalysator); Weinsäure
 
Der Stoff kann in gefährlicher Weise reagieren mit:
Alkalihydroxiden; Antimontrisulfid; Baumwollfasern -> Selbstentzündung; Calciumpermanganat; Chrom; Holz; Kaliumpermanganat; Kohlepulver/Braunstein; Mangan; Phenol (Eisen(III)-Katalysator); Phosphor; Propionaldehyd; konz. Salpetersäure; Sulfide; Tetrahydrothiophen; Textilien; Zinn(II)-chlorid
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 06002 99999 
\n " + } + ], + "links": "\n \n \n \n
\n \n Schmelzpunkt\n | \n Siedepunkt\n | \n Dichte\n | \n Dampfdruck\n | \n Löslichkeit\n | \n Gefährliche Reaktionen\n \n
\n " + }, + { + "drnr": "0500", + "ueberschrift": "TOXIKOLOGIE / ÖKOTOXIKOLOGIE\n ", + "unterkapitel": [ + { + "drnr": "0501", + "text": "\n TOXIKOLOGISCHE DATEN\n \n \n
\n
\n \n \n \n \n \n \n \n
LD50 oral Ratte
\n \n \n \n \n \n \n \n \n \n
Wert: 376 mg/kg
\n \n \n \n \n \n \n \n
Herstellerangabe Thermo Fisher Scientific
\n \n
\n
\n \n \n \n \n \n \n \n
Diese Angaben beziehen sich auf die 90 %ige Lösung.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01241 
\n \n
\n
\n \n \n \n \n \n \n \n
LD50 oral Ratte
\n \n \n \n \n \n \n \n \n \n
Wert:910 mg/kg
\n \n \n \n \n \n \n \n
Herstellerangabe Thermo Fisher Scientific
\n \n
\n
\n \n \n \n \n \n \n \n
Die Angaben beziehen sich auf die 20 - 60 %ige Lösung.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01241 
\n \n
\n
\n \n \n \n \n \n \n \n
LD50 oral Ratte
\n \n \n \n \n \n \n \n \n \n
Wert:1518 mg/kg
\n \n \n \n \n \n \n \n
Herstellerangabe Thermo Fisher Scientific
\n \n
\n
\n \n \n \n \n \n \n \n
Die Angaben beziehen sich auf die 8 - 20 %ige Lösung.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01241 
\n \n
\n
\n \n \n \n \n \n \n \n
LD50 dermal
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Species:Kaninchen
Wert:> 2000 mg/kg
\n \n \n \n \n \n \n \n
Herstellerangabe Thermo Fisher Scientific
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01241 
\n \n
\n
\n \n \n \n \n \n \n \n
LC50 inhalativ Ratte
\n \n \n \n \n \n \n \n \n \n \n \n
Wert:2000 mg/l/4 h(Dämpfe)
\n \n \n \n \n \n \n \n
MAK-Begründungen und
Herstellerangabe Thermo Fisher Scientific
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 01241 08100 
\n " + }, + { + "drnr": "0502", + "text": "\n ÖKOTOXIKOLOGISCHE DATEN\n \n \n
\n
\n \n \n \n \n \n \n \n
LC50 Fisch (96 Stunden)
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Minimalwert: 22 mg/l
Maximalwert: 26,7 mg/l
Medianwert: 24,4 mg/l
\n \n \n \n \n \n \n \n \n \n
Studienanzahl:2
\n \n \n \n \n \n \n \n
Referenz für Medianwert:
\n \n \n \n \n \n \n \n
Office of Pesticide Programs 2000. Pesticide Ecotoxicity Database (Formerly: Environmental Effects Database (EEDB)). Environmental Fate and Effects Division, U.S.EPA, Washington, D.C.
\n \n
\n
\n \n \n \n \n \n \n \n
EC50 Krustentiere (48 Stunden)
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Minimalwert:2,32 mg/l
Maximalwert:24 mg/l
Medianwert:13,2 mg/l
\n \n \n \n \n \n \n \n \n \n
Studienanzahl:2
\n \n \n \n \n \n \n \n
Referenz für Medianwert:
\n \n \n \n \n \n \n \n
Watanabe, H., E. Takahashi, Y. Nakamura, S. Oda, N. Tatarazako, and T. Iguchi 2007. Development of a Daphnia magna DNA Microarray for Evaluating the Toxicity of Environmental Chemicals. Environ.Toxicol.Chem. 26(4):669-676; Office of Pesticide Programs 2000. Pesticide Ecotoxicity Database (Formerly: Environmental Effects Database (EEDB)). Environmental Fate and Effects Division, U.S.EPA, Washington, D.C.
\n \n
\n
\n \n \n \n \n \n \n \n
EC50 Algen (72 bzw. 96 Stunden)
\n \n \n \n \n \n \n \n \n \n \n \n
Versuchsdauer:72Stunden
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Minimalwert: 0,71 mg/l
Maximalwert: 5,81 mg/l
Medianwert: 3,36 mg/l
\n \n \n \n \n \n \n \n \n \n
Studienanzahl:6
\n \n \n \n \n \n \n \n
Referenz für Medianwert:
\n \n \n \n \n \n \n \n
Smit, M.G.D., E. Ebbens, R.G. Jak, and M.A.J. Huijbregts 2008. Time and Concentration Dependency in the Potentially Affected Fraction of Species: The Case of Hydrogen Peroxide Treatment of Ballast Water. Environ.Toxicol.Chem. 27(3):746-753; Drabkova, M., B. Marsalek, and W. Admiraal 2007. Photodynamic Therapy Against Cyanobacteria. Environ.Toxicol. 22(1):112-115
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 02072 
\n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n
EC50 Algen (72 bzw. 96 Stunden)
\n \n \n \n \n \n \n \n \n \n \n \n
Versuchsdauer:96Stunden
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Minimalwert: 5,38 mg/l
Maximalwert: 6,49 mg/l
Medianwert: 5,74 mg/l
\n \n \n \n \n \n \n \n \n \n
Studienanzahl:3
\n \n \n \n \n \n \n \n
Referenz für Medianwert:
\n \n \n \n \n \n \n \n
Gregor, J., D. Jancula, and B. Marsalek 2008. Growth Assays with Mixed Cultures of Cyanobacteria and Algae Assessed by In Vivo Fluorescence: One Step Closer to Real Ecosystems?. Chemosphere 70(10):1873-1878
\n \n
\n
\n \n \n \n \n \n \n \n \n
\n \n 02072 
\n " + } + ], + "links": null + }, + { + "drnr": "0700", + "ueberschrift": "ARBEITSMEDIZIN UND ERSTE HILFE\n ", + "unterkapitel": [ + { + "drnr": "0701", + "text": "\n AUFNAHMEWEGE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hauptaufnahmewege:
Hauptaufnahmewege für Wasserstoffperoxid (W.) verlaufen über den Atemtrakt und über die Haut.[99997]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemwege:
H2O2 wird als Dampf oder Aerosol über die Lunge aufgenommen.[99997]
Resorptionsraten sind nicht bekannt.[99983]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Haut:
Aus Tierexperimenten wurde eine gute Resorbierbarkeit abgeleitet.[99997]
Angaben zu Resorptionsraten liegen jedoch nicht vor.[99983]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verdauungstrakt:
Aus zahlreichen Vergiftungen von Menschen nach oraler W.-Aufnahme sowie aus oralen Tierexperimenten ist grundsätzlich eine Resorbierbarkeit ableitbar.[07831]
Aufgrund des hohen Katalasegehaltes in den Darmwänden (insbesondere im Duodenum) ist jedoch davon auszugehen, daß der Hauptteil der Dosis vor der Resorption im Darmlumen zu Wasser und Sauerstoff abgebaut wird.[07784]
\n " + }, + { + "drnr": "0702", + "text": "\n WIRKUNGSWEISEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hauptwirkungsweisen:
akut:
konzentrationsabhängig: reizende bis ätzende Wirkung auf Haut und Schleimhäute, insbesondere der Augen; entzündliche Veränderungen an den Atemwegen, im Extremfall Lungenschädigung durch höher konzentrierte Dämpfe/Aerosole[07636, 07831]
chronisch:
Irritation der Schleimhäute (hauptsächlich Augen und Rachen) und allmähliches Ausbleichen der Haare; möglicherweise Hautveränderungen[07831]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Akute Toxizität:
1 - 3 %ige W.-Lösungen sind als antibakteriell wirkende Augentropfen benutzt worden und verursachten z.T. schnell vorübergehenden starken Schmerz. Sogar eine 0,5 %ige Lösung rief in einigen Fällen Schmerzen und eine Rötung der Bindehäute hervor. Andererseits wurden 10- und sogar 20 %ige Lösungen - nach Anästhesie - als Therapeutikum angewendet, ohne bleibende Schäden zu verursachen.
Als niedrigste augenreizende Konzentration für die meisten Menschen gilt eine 0,01 %ige Lösung.[07979]
8 %ige Lösungen zeigten am Kaninchenauge (unabhängig von anschließender Spülung) mäßige bis starke Reizeffekte (schwere Konjunktivitis, Iritis, Vaskularisation, Corneatrübung). 30 %ige Lösungen setzten neben der Hornhauttrübung Epitheldefekte, noch konzentriertere wirken stark ätzend.
Die weißen Hautverfärbungen, die nach Kontakt mit Lösungen > ca. 10 % auftreten, resultieren aus der Penetration von W. in interstitielles Gewebe und Blutkapillaren mit nachfolgender Zersetzung zu Sauerstoff und Wasser. Hierdurch erfolgt eine Aufblähung (Gasembolie) die jedoch nach relativ kurzer Zeit wieder verschwindet. Höhere Konzentrationen (bis ca. 50 %) bewirken starke Reizungen, noch höhere (> ca. 70 %) Verätzungen, die je nach Einwirkungszeit drittgradigen Verbrennungen ähneln können.
Ein sensibilisierendes Potential wurde am Meerschweinchen nicht festgestellt.[07831]
Bei großflächiger Hautbenetzung kann so viel H2O2 resorbiert werden, daß der in vivo durch Zersetzung gebildete Sauerstoff nicht mehr homogen gelöst werden kann. Dadurch kann plötzlich der Tod durch Verstopfen der Gefäße im Gehirn und im Herzen durch Gasblasen (Sauerstoffembolie) eintreten.
Hierzu genügte im Tierexperiment bereits die Applikation einer 15 - 20 %igen Lösung während 10 Minuten.
Bei Anwendung 10 %iger Lösungen traten nach 5- bis 10 Minuten systemische Intoxikationszeichen (Erregung -> Hemmung, unkoordinierter Bewegungsablauf, Tremor, Parese der Glieder, beschleunigte Atmung) auf.[99997]
Berichtete dermale LD50-Werte sind in Abhängigkeit von der Konzentration der Prüfsubstanz und der Tierspezies sehr unterschiedlich (ca. 600 bis > 7500 mg/kg KG).[07980]
Für den Menschen wurde ein erhöhtes Risiko einer dermalen Toxizität bisher noch nicht gesehen.[99997]
Inhalation von Dämpfen und Aerosolen kann eine erhebliche Irritation und Entzündung der Schleimhäute von Augen, Nase, Kehlkopf und Atemtrakt bis hin zum Lungenödem hervorrufen.[07636]
Die Schwelle der Reizwirkung auf die Schleimhäute des menschlichen Atemtraktes liegt bei 7 ppm und auf die Haut bei 14 ppm.
Systemische Wirkungen einer Resorption resultieren aus der Bildung verschiedener Formen aktiven Sauerstoffs aus H2O2 in vivo, die mit Makromolekülen (Eiweiß, Hormone, Pigmente), aber in erster Linie mit Enzymen in Wechselwirkung treten können. Die Aktivitätsänderungen betreffen insbesondere die Katalasen-Peroxidasen sowie die Lipasen. Hierdurch werden Stoffwechsel- und energetische Prozesse im Organismus gestört.[99997]
Symptome sind: Kopfschmerzen, Schwindelgefühl, Übelkeit, Erbrechen, Durchfall, Schlaflosigkeit, verstärkte Reflexe, Zittern, Empfindungslosigkeit in den Extremitäten, Krämpfe, Bewußtlosigkeit und Schock.[07636]
Als IDLH-Wert (immediately dangerous to life or health) wurde eine Konzentration von 75 ppm festgelegt.[07930]
Bei der oralen Intoxikation erfolgt in Abhängigkeit von der Konzentration eine geringe bis erhebliche Reizung bzw. Verätzung insbesondere des oberen Verdauungstraktes. Die bereits dort beginnende lebhafte Zersetzung kann zu einer massiven Sauerstofffreisetzung führen und eine Überdehnung des Magens und der Speiseröhre mit schweren mechanischen Schädigungen und inneren Blutungen zur Folge haben.[07636]
Je nach resorbiertem Anteil kann sich die Gasbildung auch auf das Blutgefäßsystem ausdehnen (z.B. Embolie im Portalvenen-System), was zu erheblichen Kreislaufstörungen führt.[07831]
Die häufigste Todesursache nach Ingestion > 10 %iger W.-Lösungen ist jedoch die Schaumbildung im Bereich des oberen Verdauungstraktes, die zu einer Obstruktion des Respirationstraktes führen kann (-> mechanische Asphyxie).[99997]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Chronische Toxizität:
Bei Einwirkung von Aerosolkonzentrationen von 8,6 - 29,5 ppm W. in Arbeitsbereichen (Einwirkungszeit nicht referiert) stellte man bei den Beschäftigten Schleimhautreizungen und eine allmähliche Ausbleichung der Haare fest.[07831]
Das reine W. soll keine Haut-Allergie-auslösenden Eigenschaften besitzen.[99997]
Es wurde von der US-FDA 1983 als GRAS (generally recognized as safe) eingestuft.
In neuerer Zeit wurde jedoch beim Umgang mit W. über einige wenige Fälle von Kontaktdermatitis berichtet.[07714]
In älteren Inhalationsexperimenten an Hunden (7 ppm, 6 h/d, 5 d/w über 6 Monate) stellte man keine Veränderungen des Körpergewichtes fest und konnte keine pathologischen, klinisch-chemischen oder hämatologischen Befunde erheben.
Allerdings wurden neben Schleimhautreizungen und Haarausbleichung bzw. -verlust Hinweise auf Gewebsveränderungen im Atemtrakt (atelektatische und emphysematöse Bereiche in der Lunge, Hyperplasie der Bronchialmuskulatur) erhalten.[07831]
Zusätzlich wurden aus diesen Untersuchungen über Hautveränderungen (Verdickung, aber keine Schädigung der Haarfollikel) berichtet.[07748]
In subchronischen Inhalationsversuchen (maximal 12 Wochen) fanden die gleichen Untersucher an Ratten, Mäusen und Kaninchen trotz z.T. wesentlich höherer Konzentrationen (bis 67 ppm) nur stärkere Reizeffekte im Atemtrakt. 77 ppm bewirkten allerdings bei Mäusen auch Todesfälle.[07831]
In einer etwas jüngeren inhalativen und dermalen (kombiniert und isoliert) Studie an Ratten (0,07; 0,7; 7,1 ppm; 5 h/d, 5 d/w über 4 Monate) wurde zunächst ein stärkerer Effekt auf die Atmungsorgane (unwirksame Dosis 0,7 ppm), später aber ein bevorzugter Angriff auf die Haut (unwirksame Dosis 0,07 ppm) festgestellt. Von einer Vielzahl gemessener Parameter änderten sich lediglich Enzymaktivitäten im Lungengewebe und in der Haut (extrem abhängig von der Expositionszeit). Bezüglich der Hautbeeinflussung wurde - bereits bei 0,7 ppm - zusätzlich eine \"bemerkenswerte Funktionsstörung der Hornschicht\" gemessen.[99997]
Eine Validierung aller genannten Ergebnisse scheint bislang nicht vorzuliegen.[99983]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reproduktionstoxizität, Mutagenität, Kanzerogenität:
Reproduktionstoxizität:
Es liegen keine ausreichenden Untersuchungsergebnisse vor.[07980]
Hinweise auf Beeinträchtigungen der Fertilität wurden in den bisherigen Tierversuchen nicht gefunden.[05323]
Mutagenität:
Es existiert eine Vielzahl von In-vitro-Untersuchungen, die eine gentoxische Wirkung aufgrund der Bildung freier Radikale nicht ausschließen. Die wenigen verfügbaren In-vivo-Tests belegen keine gentoxische Wirkung, was auf wirksame Schutzmechanismen des Organismus (s. \"Stoffwechsel und Ausscheidung\") zurückgeführt wurde.
Für Körperzellen, die in direkten Kontakt mit W. gelangen können (Applikationsstelle), wurden jedoch gentoxische Effekte nicht ausgeschlossen.
Kanzerogentität:
Es sind - trotz mehrerer Untersuchungen - keine ausreichenden Angaben verfügbar. Bisherige Abschätzungen des kanzerogenen Potentials reichen von \"insufficient evidence\" bis \"limited evidence\" für Labortiere.[07831]
Für den Menschen liegen keine Hinweise (aus Fallstudien oder epidemiologischen Studien) auf eine kanzerogene Wirkung vor.[07980]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Stoffwechsel und Ausscheidung:
Der Metabolismus von W. in aeroben Zellen wird durch die jeweilige Aktivität der Enzymsysteme Katalase, Peroxidase und Glutathion-Peroxidase determiniert. Eine Altersabhängigkeit von Individuen hinsichtlich der Aktivität dieser Systeme ging aus Tierexperimenten nicht hervor.
Katalase als wichtigstes System entwickelt ihre höchste Aktivität in Darm, Leber, Milz, Niere, Blut, Schleimhäuten und anderen stark vaskularisierten Geweben.[07831]
Eine in der Haut im Vergleich zum Lungengewebe wesentlich geringere Aktivität der Katalase wurde für die besondere Empfindlichkeit erstgenannten Organs nach Langzeitexposition verantwortlich gemacht.[99997]
Die Metabolisierung zu Sauerstoff und Wasser geht unter bestimmten Umständen mit der Bildung aktiver Sauerstofformen einher, die eine zellschädigende Wirkung ausüben können.[07831]
W. wird im Verlauf verschiedener Redoxcyclen auch im Organismus selbst gebildet und unter der Mitwirkung der o.a. Enzymsysteme sehr effektiv entgiftet.[07900]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Anmerkung:
Die Bearbeitung dieser arbeitsmedizinischen Informationen erfolgte am 03.09.2001.
Sie werden bei Bedarf angepasst.
\n " + }, + { + "drnr": "0703", + "text": "\n ERSTE HILFE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Augen:
So schnell wie möglich:
Auge unter Schutz des unverletzten Auges 10 Minuten unter fließendem Wasser bei weitgespreizten Lidern spülen.
Anschließend möglichst sofortiger Transport zum Augenarzt / zur Klinik.
Während des Transports mit isotonischer Kochsalzlösung weiterspülen, ersatzweise mit Wasser.
Besonders hohe Gefährdung durch Konzentrationen > 10 %.
[99983, 99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Haut:
Benetzte Kleidung entfernen, dabei Selbstschutz beachten.
Betroffene Hautpartien mindestens 10 bis 20 Minuten unter fließendem Wasser spülen.
Bei Kontamination mit Konzentrationen > 10 %ig in jedem Falle:
Für ärztliche Behandlung sorgen.
[00330, 99999]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atmungsorgane:
Verletzten unter Selbstschutz aus dem Gefahrenbereich an die frische Luft bringen.
Verletzten ruhig lagern, vor Unterkühlung schützen.
Ehestmöglich ein Glucocorticoid-Dosieraerosol zur Inhalation wiederholt tief einatmen lassen.
Bei Atemnot Sauerstoff inhalieren lassen.
Bei Bewusstlosigkeit und vorhandener Atmung stabile Seitenlage.
Bei Atemstillstand Mund-zu-Nase-Beatmung, falls nicht durchführbar Mund-zu-Mund-Beatmung. Atemwege freihalten.
Für ärztliche Behandlung sorgen.
[05107]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verschlucken:
In jedem Falle reichlich Flüssigkeit (am besten: Wasser) trinken lassen.
Entgegen manchen Empfehlungen sollten ein Erbrechen möglichst verhindert, Laxantien und A-Kohle nicht verabreicht werden!
Sofort Notarzt zur Unfallstelle rufen.
Bei spontanem Erbrechen Kopf des Verletzten unbedingt in Tieflage bringen (höchste Aspirationsgefahr durch Schaumbildung!).
[99983, 99997, 00330, 07638]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise für den Arzt:
Erfahrungen aus Vergiftungen mit Wasserstoffperoxid (W.) resultieren meist aus Ingestionen.[07831]
Hierbei sowie bei allen anderen denkbaren Expositionen (Augen, Haut, Atemtrakt) haben Konzentration der Noxe (> 3 bis 90 Vol. %) und Einwirkungszeit entscheidenden Einfluß auf das Ausmaß der (insbesondere) topischen Läsionen.[99983]
\n
- Symptomatik der akuten Vergiftung:
Augen: schmerzhafte Reizung bis starke Verätzung (konjunktivale Hyperämie, Konjunktivitis, Ödem, Blepharospasmus, Iritis, Corneatrübung, Epitheldefekte, permanente Corneaschädigung)
Haut: Lösungen ab ca. 10 %ig: vorübergehende Ausbleichung (Sauerstoffemphysem in interstitiellem Gewebe, Gasembolie in den Blutkapillaren), Erythem, Schmerzen; ab ca. 70 %ig: Verätzungen, vergleichbar einer Verbrennung dritten Grades;[07831] bei großflächiger Kontamination systemische Sauerstoffembolisation möglich[99997]
Inhalation: Schleimhautreizung, entzündliche Gewebsreaktionen, Obstruktion, Glottis- und Lungenödem, Dyspnoe bis Atemstillstand; systemische Effekte im Extremfall[99983]
Ingestion: Reizung bis Verätzung kontaktierter Schleimhäute insbesondere des oberen Verdauungstraktes, Magendistension, Verlegung der oberen Atemwege durch Schaumbildung, Gastritis, Duodenitis, Colitis, akute viszerale Kongestion, Vakuolenbildung in der gastrointestinalen Submukosa, in Lymphgefäßen, Mesenteriallymphknoten oder Mukosaassoziiertem lymphoidem Gewebe sowie Vakuolisierung in anderen Organen; systemische Effekte infolge Gasembolie Systemische Effekte: Schock, akute koronare Insuffizienz, Status epilepticus, cerebrovaskulärer Kollaps, Atemstillstand.
Bei Ingestion von Lösungen > 10 % ist die Obstruktion der Atemwege durch Schaumbildung (-> mechanische Asphyxie) die häufigste Todesursache.[99997]
\n
- Hinweise für die Erste ärztliche Hilfe:
Nach Augenkontakt sollte der Ersthilfe möglichst schnell eine Weiterbehandlung durch einen Ophthalmologen folgen.[00330]
Hautkontaminationen müssen besonders sorgfältig entfernt werden, da eine Nachresorption möglich ist. Stark gereizte Areale sollten mit einem Dermatocorticoid-Schaumspray behandelt werden.[07638] Nach großflächiger Verunreinigung der Haut mit W. (> 10 %ig) wird eine zumindest mehrstündige Nachbeobachtung empfohlen.[99999]
Nach Inhalation Fortsetzung der Lungenödemprophylaxe. Bei Atembeschwerden soll der Verunglückte aufrecht gesetzt und warmgehalten werden. Ggf. ist Sauerstoffzufuhr über eine Atemmaske (35 % Sauerstoff, 4 l/min) notwendig. Patienten mit chronischer Bronchitis dürfen nur 24 % Sauerstoff im Inspirationsgasgemisch erhalten.[99997]
Nach oraler Aufnahme größerer H2O2-Mengen besteht die Gefahr einer Gasembolie, die eine sofortige Flachlagerung des Patienten (Kopf tief, Becken erhöht) erfordert.[07718]
Wenn der Patient nicht in der Lage ist, schaumige Sekrete abzuhusten und auszuspucken, sollte ein Absauggerät benutzt werden.
Während der Behandlung ist eine Kontrolle der Kreislauf-Funktionen einschließlich EKG erforderlich.
Die Möglichkeit einer frühen Intubation sollte geprüft werden. Sauerstoffapplikation, notwendigenfalls kardiale Massage.
Ein frühzeitig gelegter venöser Zugang ermöglicht notwendige Infusionen bzw. effektive Schmerzbekämpfung schon vor Erreichen der Intensivstation.[99997]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Empfehlungen:
Stoff/Produkt und durchgeführte Maßnahmen dem Arzt angeben.
Auf eine möglichst baldige Röntgendiagnostik (Lunge und Abdomen) sollte größter Wert gelegt werden.
Die Indikation einer Laparatomie sollte bei Hinweisen auf erhebliche Gasansammlungen im Gastrointestinaltrakt geprüft werden.[99997]
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Anmerkung:
Die Bearbeitung dieser Informationen zur Ersten Hilfe erfolgte am 03.03.2000.
Sie werden bei Bedarf angepasst.
\n " + } + ], + "links": "\n \n \n \n
\n \n Aufnahmewege\n | \n Wirkungsweisen\n | \n Erste Hilfe\n \n
\n " + }, + { + "drnr": "0800", + "ueberschrift": "SICHERER UMGANG\n ", + "unterkapitel": [ + { + "drnr": "0802", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – HANDHABUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitsraum - Ausstattung/Belüftung:
Gute Be- und Entlüftung des Arbeitsraumes vorsehen.
Waschgelegenheit am Arbeitsplatz vorsehen.
Augenbrausen vorsehen. Standorte auffallend kennzeichnen.
Beim Umgang mit größeren Mengen Notbrausen vorsehen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Apparaturen:
Möglichst geschlossene Apparaturen verwenden.
Kann in Apparaturen durch Wärmeeinwirkung oder Zersetzungsreaktionen ein gefährlicher Druck entstehen, so sind geeignete Sicherheitseinrichtungen vorzusehen.
Ist das Austreten des Stoffes nicht zu verhindern, ist dieser an der Austrittsstelle gefahrlos abzusaugen.
Behälter und Leitungen sind eindeutig zu kennzeichnen.
 
Geeignete Werkstoffe:
Reinaluminium (> 99,5 %)
Volkommen rostfreie Edelstähle (V2A)
Polyvinylchlorid PVC
Polytetrafluorethylen PTFE (Teflon)
 
Ungeeignete Werkstoffe:
Kupfer
Messing
Eisen
Silber
Bronze
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Hinweise zum sicheren Umgang:
Auf Sauberkeit am Arbeitsplatz achten.
An Arbeitsplätzen dürfen nur die Substanzmengen vorhanden sein, die für den Fortgang der Arbeiten erforderlich sind.
Gefäße nicht offenstehen lassen.
Beim Ab- und Umfüllen sowie bei offener Anwendung muss eine ausreichende Lüftung gewährleistet sein.
Verspritzen vermeiden.
Nur in gekennzeichnete Behälter abfüllen.
Restmengen niemals in die Aufbewahrungsgefäße zurückgeben.
Bei offenem Hantieren jeglichen Kontakt vermeiden.
Nicht zusammen mit unverträglichen Substanzen transportieren.
Beim Transport in zerbrechlichen Gefäßen geeignete Überbehälter benutzen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Reinigung und Instandhaltung:
Beim Reinigen ggf. persönliche Schutzausrüstung benutzen.
Instandhaltungsarbeiten und Arbeiten in Behältern oder engen Räumen nur mit schriftlicher Erlaubnis durchführen.
Arbeiten an Behältern und Leitungen nur nach sorgfältigem Freispülen durchführen.
\n " + }, + { + "drnr": "0803", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – LAGERUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Lagerbedingungen:
Keine Lebensmittelgefäße verwenden - Verwechslungsgefahr!
Behälter sind eindeutig und dauerhaft zu kennzeichnen.
Nur im Originalbehälter aufbewahren.
Unzerbrechliche Behälter sind Glasbehältern vorzuziehen.
Zerbrechliche Gefäße in bruchsichere Übergefäße einstellen.
Behälter nicht gasdicht verschließen.
Empfohlene Lagertemperatur:
ca. 15 Grad C
Behälter an einem gut belüfteten Ort aufbewahren.
An feuerbeständigem Ort lagern.
Kleinere Gebinde in Schränken mit Auffangwanne aufbewahren.
Es sind ausreichend große Auffangräume vorzusehen (Vertiefungen, Wälle oder standsichere Wände).
Vor Sonneneinstrahlung schützen.
Vor Überhitzung/Erwärmung schützen.
Stoff ist lichtempfindlich, vor Lichteinwirkung schützen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Zusammenlagerungsbedingungen:
Für Konzentrationen größer oder gleich 60 % gilt:
Lagerklasse 5.1 A (Stark oxidierend wirkende Stoffe)
Stark oxidierend wirkende Stoffe müssen separat gelagert werden. Eine Zusammenlagerung mit oxidierend wirkenden Stoffen der Lagerklasse 5.1B sowie nichtbrennbaren Stoffen der Lagerklassen 12 und 13 ist zulässig.
 
Für Konzentrationen kleiner als 60 % bis 8 % gilt:
Lagerklasse 5.1 B (Oxidierend wirkende Stoffe)
Es sollten nur Stoffe derselben Lagerklasse zusammengelagert werden.
Die Zusammenlagerung mit folgenden Stoffen ist verboten:
- Arzneimittel, Lebensmittel und Futtermittel einschließlich Zusatzstoffe.
- Ansteckungsgefährliche, radioaktive und explosive Stoffe.
- Gase.
- Aerosole (Spraydosen).
- Sonstige explosionsgefährliche Stoffe der Lagerklasse 4.1A.
- Pyrophore Stoffe.
- Stoffe, die in Berührung mit Wasser entzündbare Gase entwickeln.
- Organische Peroxide und selbstzersetzliche Stoffe.
Die Zusammenlagerung mit folgenden Stoffen ist nur unter bestimmten Bedingungen erlaubt (Einzelheiten siehe TRGS 510):
- Entzündbare flüssige Stoffe der Lagerklasse 3.
- Entzündbare feste Stoffe oder desensibilisierte Stoffe der Lagerklasse 4.1B.
- Ammoniumnitrat und ammoniumnitrathaltige Zubereitungen.
- Brennbare und nicht brennbare akut giftige Stoffe der Lagerklassen 6.1A und 6.1B.
- Brennbare giftige oder chronisch wirkende Stoffe der Lagerklasse 6.1C.
- Nichtbrennbare giftige oder chronisch wirkende Stoffe der Lagerklasse 6.1D.
- Brennbare ätzende Stoffe der Lagerklasse 8A.
- Brennbare Flüssigkeiten der Lagerklasse 10.
- Brennbare Feststoffe der Lagerklasse 11.
Der Stoff sollte nicht mit Stoffen zusammengelagert werden, mit denen gefährliche chemische Reaktionen möglich sind.
\n " + }, + { + "drnr": "0804", + "text": "\n TECHNISCHE SCHUTZMASSNAHMEN - BRAND- UND EXPLOSIONSSCHUTZ\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Technische, konstruktive Maßnahmen:
Stoff ist brandfördernd (oxidierend).
Feuerlöscheinrichtungen sind bereitzustellen.
Elektroinstallation wegen erhöhter Korrosionsgefahr regelmäßig überprüfen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Vorsichtsmaßnahmen beim Umgang:
Von offenen Flammen fernhalten.
Rauchverbot beachten!
Für Wasserstoffperoxid >= 60% gilt außerdem:
Schweißverbot im Arbeitsraum.
Arbeiten an Behältern und Leitungen nur nach sorgfältigem Freispülen und Inertisieren durchführen.
Feuerarbeiten mit schriftlicher Erlaubnis durchführen, wenn sich Feuer- und Explosionsgefahren nicht restlos beseitigen lassen.
Von brennbaren Stoffen fernhalten.
Filtrieren von Lösungen nur mit Glaswolle, Glasfritten oder Keramikfilter. Kein Filtermaterial aus Papier verwenden, nach Trocknung besteht Entzündungsgefahr. Keine Putzlappen offen liegen lassen.
\n " + }, + { + "drnr": "0805", + "text": "\n ORGANISATORISCHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n
Unterweisung über Gefahren und Schutzmaßnahmen anhand der Betriebsanweisung (TRGS 555) mit Unterschrift erforderlich, falls mehr als nur eine geringe Gefährdung festgestellt wurde.
Unterweisungen vor der Beschäftigung und danach mindestens einmal jährlich durchführen.
Ein Flucht- und Rettungsplan ist aufzustellen, wenn Lage, Ausdehnung und Nutzungsart der Arbeitsstätte dies erfordern.
Beschäftigungsbeschränkungen für Jugendliche nach dem Jugendarbeitsschutzgesetz beachten.
\n " + }, + { + "drnr": "0806", + "text": "\n PERSÖNLICHE SCHUTZMASSNAHMEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Körperschutz:
Je nach Gefährdung ausreichend lange Schürze und Stiefel oder geeigneten Chemikalienschutzanzug tragen.
Flammhemmende Schutzkleidung verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Atemschutz:
In Ausnahmesituationen (z.B. unbeabsichtigte Stofffreisetzung) ist das Tragen von Atemschutz erforderlich. Tragezeitbegrenzungen beachten.
Atemschutzgerät: Spezialfilter NO - P3, Kennfarbe blau-weiß.
Diese Filter dürfen nur im Anlieferungszustand zum einmaligen Gebrauch kommen.
(auch Spezialfilter CO möglich)
Bei Konzentrationen über der Anwendungsgrenze von Filtergeräten, bei Sauerstoffgehalten unter 17 Vol% oder bei unklaren Bedingungen ist ein Isoliergerät zu verwenden.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Augenschutz:
Es muss ausreichender Augenschutz getragen werden.
Korbbrille verwenden.
Ist auch das Gesicht gefährdet, ist zusätzlich ein Schutzschirm zu benutzen.
Können augenschädigende Dämpfe oder Aerosole auftreten, ist der Schutz der Augen am besten durch eine Vollmaske sicherzustellen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Handschutz:
Schutzhandschuhe verwenden. Das Handschuhmaterial muss gegen den verwendeten Stoff ausreichend undurchlässig und beständig sein. Vor Gebrauch Dichtheit prüfen. Handschuhe vor dem Ausziehen vorreinigen, danach gut belüftet aufbewahren. Hautpflege beachten.
Hautschutzsalben bieten keinen ausreichenden Schutz gegen diesen Stoff.
Völlig ungeeignet sind Stoff- oder Lederhandschuhe. 
Geeignet sind Schutzhandschuhe aus folgenden Materialien:
Butylkautschuk - Butyl
Naturkautschuk/Naturlatex - NR
Nitrilkautschuk/Nitrillatex - NBR
Einzelheiten zu Durchbruchszeiten und Materialstärken siehe Registrierungsdatensatz auf der ECHA-Website.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Arbeitshygiene:
In Arbeitsbereichen dürfen keine Nahrungs- und Genussmittel aufgenommen werden. Für diesen Zweck sind geeignete Bereiche einzurichten.
Berührung mit der Haut vermeiden. Nach Substanzkontakt ist Hautreinigung erforderlich.
Berührung mit den Augen vermeiden. Nach Substanzkontakt Augenspülung vornehmen.
Einatmen von Dämpfen oder Nebeln vermeiden.
Berührung mit der Kleidung vermeiden. Verunreinigte Kleidung wechseln und gründlich reinigen.
Getrennte Aufbewahrungsmöglichkeiten für Straßen- und Arbeitskleidung müssen zur Verfügung stehen, wenn eine Gefährdung durch Verunreinigung der Arbeitskleidung zu erwarten ist.
Vor Pausen und bei Arbeitsende Hautreinigung mit Wasser und Seife erforderlich. Nach der Reinigung fetthaltige Hautpflegemittel verwenden.
\n " + }, + { + "drnr": "0807", + "text": "\n ENTSORGUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Gefährlicher Abfall nach Abfallverzeichnis-Verordnung (AVV).
Wenn eine Verwertung nicht möglich ist, müssen Abfälle unter Beachtung der örtlichen behördlichen Vorschriften beseitigt werden.
 
Sammlung von Kleinmengen:
Stark verdünnt (maximal 3 %ig) dem Abwasser zuführen.
Am besten mit 20 Teilen Wasser verdünnen und mit 10 %iger Natriumhydroxidlösung neutralisieren.
Alternativ:
Durch Eintragen in eine Natriumthiosulfatlösung - ggf. unter Ansäuern - in weniger gefährliche Reduktionsprodukte überführen.
In Sammelbehälter für Salzlösungen geben, ein pH-Wert von 6-8 ist einzustellen, bzw.
in Sammelbehälter für giftige anorganische Rückstände sowie Schwermetallsalze und ihre Lösungen geben.
Sammelgefäße sind deutlich mit der systematischen Bezeichnung ihres Inhaltes zu beschriften. Gefäße an einem gut gelüfteten Ort aufbewahren. Der zuständigen Stelle zur Abfallbeseitigung übergeben.
\n " + }, + { + "drnr": "0808", + "text": "\n MASSNAHMEN BEI UNBEABSICHTIGTER FREISETZUNG\n \n \n
\n
\n \n \n \n \n \n \n \n
Gefährdeten Bereich räumen, betroffene Umgebung warnen.
Zur Beseitigung des gefährlichen Zustandes darf der Gefahrenbereich nur mit geeigneten Schutzmaßnahmen betreten werden (s. Kapitel Persönliche Schutzmaßnahmen).
Mit Universalbinder (Absorptionsmittel und Neutralisationsmittel für verschüttete Säuren) aufnehmen und vorschriftsmäßig entsorgen.
Anschließend Raum lüften und verschmutzte Gegenstände und Boden reinigen.
 
Gewässergefährdung:
Schwach wassergefährdend. Beim Eindringen sehr großer Mengen in Gewässer, Kanalisation oder Erdreich Behörden verständigen.
\n " + }, + { + "drnr": "0809", + "text": "\n MASSNAHMEN BEI BRÄNDEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verhaltensmaßregeln:
Stoff selbst brennt nicht, wirkt aber oxidierend.
Bei Einbeziehung in Umgebungsbrand:
Umliegende Gebinde und Behälter mit Sprühwasser kühlen.
Behälter wenn möglich aus der Gefahrenzone bringen.
Drucksteigerung und Berstgefahr beim Erhitzen.
Zündquellen beseitigen.
\n " + } + ], + "links": "\n \n \n \n
\n \n Handhabung\n | \n Lagerung\n | \n Brand- und Explosionsschutz\n | \n Organisatorische Maßnahmen\n | \n Persönl. Schutzmaßnahmen\n | \n Entsorgung\n | \n Freisetzung\n | \n Maßnahmen bei Bränden\n \n
\n " + }, + { + "drnr": "1100", + "ueberschrift": "VORSCHRIFTEN\n ", + "unterkapitel": [ + { + "drnr": "1303", + "text": "\n EU-GHS-EINSTUFUNG UND KENNZEICHNUNG\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Einstufung:
Oxidierende Flüssigkeiten, Kategorie 1; H271
Akute Toxizität, Kategorie 4, Verschlucken; H302
Akute Toxizität, Kategorie 4, Einatmen; H332
Ätzwirkung auf die Haut, Kategorie 1A; H314
Schwere Augenschädigung, Kategorie 1; H318
Spezifische Zielorgan-Toxizität (einmalige Exposition), Kategorie 3; H335
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \"ghs03\"\n \n \"ghs05\"\n \n \"ghs07\"\n \n \n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Signalwort:\"Gefahr\"
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gefahrenhinweise - H-Sätze:
H271: Kann Brand oder Explosion verursachen; starkes Oxidationsmittel.
\n H302 H332H302+H332: Gesundheitsschädlich bei Verschlucken oder bei Einatmen.
H314: Verursacht schwere Verätzungen der Haut und schwere Augenschäden.
H335: Kann die Atemwege reizen.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Ergänzende Gefahrenhinweise - EUH-Sätze:
EUH071: Wirkt ätzend auf die Atemwege.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Sicherheitshinweise - P-Sätze:
P220: Von Kleidung und anderen brennbaren Materialien fernhalten.
P261: Einatmen von Dampf oder Aerosol vermeiden.
P280: Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen.
P302+P352+P310: BEI BERÜHRUNG MIT DER HAUT: Mit viel Wasser und Seife waschen. Sofort GIFTINFORMATIONSZENTRUM oder Arzt anrufen.
P305+P351+P338: BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen.
P312: Bei Unwohlsein GIFTINFORMATIONSZENTRUM oder Arzt anrufen.
\n \n
\n
\n \n \n \n \n \n \n \n
Angabe des Gefahrstoffinformationssystems GisChem der Berufsgenossenschaft Rohstoffe und chemische Industrie
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07530 
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Stand:2020
geprüft:2020
\n \n
\n
\n \n \n \n \n \n \n \n
Der Stoff ist gelistet in Anhang VI, Tabelle 3 der EG-GHS-Verordnung.
Die angegebene Einstufung kann von der Listeneinstufung abweichen, da diese bezüglich fehlender oder abweichender Gefahrenklassen und Kategorien für den jeweiligen Stoff zu ergänzen ist.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 99999 
\n " + }, + { + "drnr": "1302", + "text": "\n GHS-EINSTUFUNG VON GEMISCHEN\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Spezifische Konzentrationsgrenzen
Oxid. Fl. 1; H271: C >= 70 % ****
Oxid. Fl. 2; H272: 50 % <= C < 70 % ****
Hautätz. 1A; H314: C >= 70 %
Hautätz. 1B; H314: 50 % <= C < 70 %
Hautreiz. 2; H315: 35 % <= C < 50 %
Augenschäd. 1; H318: 8 % <= C < 50 %
Augenreiz. 2; H319: 5 % <= C < 8 %
STOT einm. 3; H335; C >= 35 %
\n \n
\n
\n \n \n \n \n \n \n \n
Für weitere ggf. nicht aufgeführte Konzentrationsbereiche bzw. weitere evtl. vorhandene Gefahreneinstufungen des Stoffes sind die allgemeinen Konzentrationsgrenzen aus Anhang 1 der Verordnung (EG) 1272/2008 heranzuziehen.
\n \n
\n
\n \n \n \n \n \n \n \n
**** physikalische Gefahren, die durch Prüfungen bestätigt werden müssen
\n
Die Einstufung in die Gefahrenklasse \"Oxidierende Flüssigkeiten\" wurde aufgrund der Gefahrgut-Klassifizierung vorgenommen.
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07500 
\n " + }, + { + "drnr": "1104", + "text": "\n ARBEITSPLATZKENNZEICHNUNG NACH ASR A1.3\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Verbotszeichen:
\n \n \n \n \n \n
\n \"P02_FEUE\"\n Keine offene Flamme; Feuer, offene Zündquelle und Rauchen verboten
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Warnzeichen:
\n \n \n \n \n \n
\n \"W04_AETZ\"\n Warnung vor ätzenden Stoffen
\n
\n \n \n \n \n \n
\n \"W11_bran\"\n Warnung vor brandfördernden Stoffen
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Gebotszeichen:
\n \n \n \n \n \n
\n \"M01_auge\"\n Augenschutz benutzen
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n
\n \"M06_hand\"\n Schutzhandschuhe benutzen
\n
\n " + }, + { + "drnr": "1106", + "text": "\n EINSTUFUNG WASSERGEFÄHRDENDER STOFFE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
Stoff Nr.:288
\n
WGK 1 - schwach wassergefährdend
Einstufung gemäß Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt ergänzt 18.11.2021
\n " + }, + { + "drnr": "1108", + "text": "\n TRANSPORTVORSCHRIFTEN\n \n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n
\n 2015\n
UN-Nummer: 2015
Gefahrgut-Bezeichnung: Wasserstoffperoxid, stabilisiert oder Wasserstoffperoxid wässrige Lösung, stabilisiert, mit mehr als 60 % Wasserstoffperoxid
Nummer zur Kennzeichnung der Gefahr: 559
Klasse: 5.1 (Entzündend/oxidierend wirkende Stoffe)
Verpackungsgruppe: I (hohe Gefährlichkeit)
Gefahrzettel: 5.1/8
\n
\n \n
\n
\n \n \n \n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n
\n \n \n \n \n \n
\n \"TPlabel5_1\"\n \n \"TPlabel8\"\n \n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n
Klassifizierungscode:OC1
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Tunnelbeschränkungen:
Beförderungen in Tanks: Durchfahrt verboten durch Tunnel der Kategorien B, C, D und E.
Sonstige Beförderungen: Durchfahrt verboten durch Tunnel der Kategorie E.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Quelle:\n 07902 
\n " + }, + { + "drnr": "1203", + "text": "\n EMPFEHLUNGEN DER MAK-KOMMISSION\n \n \n
\n
\n \n \n \n \n \n \n \n
Die Angaben sind wissenschaftliche Empfehlungen und kein geltendes Recht.
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
0,5 ml/m³
0,71 mg/m³
\n \n
\n
\n \n \n \n \n \n \n \n \n \n
Spitzenbegrenzung: Überschreitungsfaktor1
\n \n \n \n \n \n \n \n
Dauer 15 min, Mittelwert; 4 mal pro Schicht; Abstand 1 h
Kategorie I - Stoffe bei denen die lokale Wirkung grenzwertbestimmend ist oder atemwegssensibilisierende Stoffe
\n \n
\n
\n \n \n \n \n \n \n \n
Krebserzeugend: Kategorie 4
Stoffe mit krebserzeugender Wirkung, bei denen genotoxische Effekte keine oder nur eine untergeordnete Rolle spielen. Liegt ein MAK-Wert vor, ist bei dessen Einhaltung kein nennenswerter Beitrag zum Krebsrisiko für den Menschen zu erwarten.
\n \n
\n
\n \n \n \n \n \n \n \n
Schwangerschaft: Gruppe C
Eine fruchtschädigende Wirkung ist bei Einhaltung des MAK‐ und BAT-Wertes nicht anzunehmen.
\n \n
\n
\n " + }, + { + "drnr": "1214", + "text": "\n STÖRFALLVERORDNUNG (StoerfallV)\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n
Anhang I Nummer:1.2.8
\n \n \n \n \n \n \n \n \n
\n P8 Oxidierende Flüssigkeiten oder Feststoffe der Kategorien 1, 2 oder 3
\n \n \n \n \n \n \n \n \n \n \n \n \n \n
Mengenschwelle untere Kl.:50 t
Mengenschwelle obere Kl.:200 t
\n \n
\n
\n " + }, + { + "drnr": "1208", + "text": "\n VERWENDUNGSBESCHRÄNKUNGEN / VERWENDUNGSVERBOTE\n \n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
REACH-Verordnung (EG) Nr. 1907/2006 Anhang XVII
Anhang XVII, Nummer 3
1. Das Inverkehrbringen und die Verwendung des Stoffes ist nicht zugelassen in Dekorationsgegenständen, Spielen und Scherzspielen.
2. Stoffe, die mit H304 gekennzeichnet sind, die als Brennstoff in Zierlampen verwendet werden können und die in Mengen von 15 l oder weniger in den Verkehr gebracht werden, dürfen keinen Farbstoff und/oder kein Parfüm enthalten.
Weitere Informationen zu den Verboten sind der Verordnung zu entnehmen.
\n \n
\n
\n \n \n \n \n \n \n \n
Anhang XVII, Nummer 75
Gemische, die bestimmte gefährliche Stoffe enthalten, dürfen für Tätowierungszwecke nicht mehr in Verkehr gebracht werden. Gemische die solche Stoffe in vorgegebener Konzentration enthalten, dürfen nach dem 04.01.2022 nicht mehr für Tätowierungszwecke verwendet werden. Bei den Stoffen handelt es sich um:
- karzinogene oder reproduktionstoxische Stoffe gemäß Anhang VI Teil 3 der CLP-Verordnung (es sei denn, die Einstufung gründet sich auf Wirkungen, die nur nach Exposition durch Inhalation auftreten),
- hautsensibilisierende, hautätzende, hautreizende, schwer augenschädigende oder augenreizende Stoffe gemäß Anhang VI Teil 3 der CLP-Verordnung,
- Stoffe, die mit maßgeblichen Bedingungen in Anhang II oder IV der Verordnung (EG) Nr. 1223/2009 [Kosmetikverordnung] aufgeführt sind und
- Stoffe, die in der Anlage 13 des Anhang XVII (Nummer 75) der REACH-Verordnung aufgeführt sind.
Generell müssen Gemische, die zur Verwendung für Tätowierungszwecke in Verkehr gebracht werden, ab dem 04.01.2022 mit der Kennzeichnung “Gemisch zur Verwendung in Tätowierungen oder Permanent-Make-up.” versehen werden und dürfen ohne diese Kennzeichnung nicht zu Tätowierungszwecken verwendet werden. Weitere Sicherheitsinformationen sind auf der Verpackung oder in der Gebrauchsanweisung anzugeben. Der Tätowierer hat der Person, die sich dem Verfahren unterzieht, diese Informationen bereitzustellen.
Weitere Informationen zu den Beschränkungen, Konzentrationsgrenzen und den Ausnahmen sind der Verordnung zu entnehmen.
\n \n
\n
\n \n \n \n \n \n \n \n
Anhang XVII der Verordnung (EG) 1907/2006, konsolidierte Version (BAUA)
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n
Bedarfsgegenständeverordnung (BedGgstV)
Anlage 1 zu § 3, Nummer 5
Der Stoff darf nicht beim Herstellen oder Behandeln von Scherzspielen verwendet werden.
\n \n
\n
\n \n \n \n \n \n \n \n
VERORDNUNG (EU) 2019/1148 DES EUROPÄISCHEN PARLAMENTS UND DES RATES
über die Vermarktung und Verwendung von Ausgangsstoffen für Explosivstoffe

Die Verordnung gilt ab dem 1.Februar 2021.
Der Stoff darf Mitgliedern der Allgemeinheit weder als solcher noch in Gemischen die diesen Stoff enthalten, bereitgestellt werden, es sei denn, die Konzentration entspricht den in Spalte 2 angegebenen Grenzwerten oder unterschreitet diese. Verdächtige Transaktionen, Abhandenkommen und Diebstahl erheblicher Mengen sind binnen 24 Stunden zu melden.
Weitere Informationen sind der Verordnung zu entnehmen.
Grenzwert: 12 % w/w
Oberer Konzentrationsgrenzwert für eine Genehmigung nach Artikel 5 Absatz 3: 35 % w/w

\n
\n " + }, + { + "drnr": "1209", + "text": "\n TECHNISCHE REGELN FÜR GEFAHRSTOFFE (TRGS)\n \n \n
\n
\n \n \n \n \n \n \n \n
TRGS 201
Einstufung und Kennzeichnung bei Tätigkeiten mit Gefahrstoffen; Ausgabe Februar 2017, zuletzt geändert und ergänzt April 2018
\n
TRGS 400
Gefährdungsbeurteilung für Tätigkeiten mit Gefahrstoffen; Ausgabe Juli 2017
\n
TRGS 555
Betriebsanweisung und Information der Beschäftigten; Ausgabe Februar 2017
\n
TRGS 600
Substitution; Ausgabe Juli 2020
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 401
Gefährdung durch Hautkontakt, Ermittlung - Beurteilung - Maßnahmen; Ausgabe Juni 2008; zuletzt berichtigt März 2011
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 500
Schutzmaßnahmen; Ausgabe September 2019
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 509
Lagern von flüssigen und festen Gefahrstoffen in ortsfesten Behältern sowie Füll- und Entleerstellen für ortsbewegliche Behälter; Ausgabe September 2014, zuletzt berichtigt, geändert und ergänzt Oktober 2020
\n
TRGS 510
Lagerung von Gefahrstoffen in ortsbeweglichen Behältern; Ausgabe Dezember 2020
\n \n
\n
\n \n \n \n \n \n \n \n
TRGS 800
Brandschutzmaßnahmen; Ausgabe Dezember 2010
\n " + }, + { + "drnr": "1210", + "text": "\n VORSCHRIFTEN DER UNFALLVERSICHERUNGSTRÄGER\n \n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-190
Benutzung von Atemschutzgeräten, Ausgabe Dezember 2011
http://publikationen.dguv.de/dguv/pdf/10002/r-190.pdf
\n \n
\n
\n \n \n \n \n \n \n \n
DGUV Regel 112-195
Benutzung von Schutzhandschuhen, Aktualisierte Nachdruckfassung Oktober 2007
http://publikationen.dguv.de/dguv/pdf/10002/bgr195.pdf
\n " + } + ], + "links": "\n \n \n \n
\n \n GHS-Einstufung/Kennzeichnung\n | \n Arbeitsplatzkennzeichnung\n | \n Wassergefährdungsklasse\n | \n Transportvorschriften\n | \n Empfehlung MAK\n | \n Störfallverordnung\n | \n Verwendungsbeschränkungen\n | \n TRGS\n | \n Vorschriften UV-Träger\n \n
\n " + }, + { + "drnr": "1400", + "ueberschrift": "LINKS\n ", + "unterkapitel": [ + { + "drnr": "1400", + "text": "\n
\n
\n \n \n \n \n \n \n \n
\n Begründung zur Bewertung als krebserzeugend, erbgutverändernd oder fortpflanzungsgefährdend (Quelle BAuA)\n
\n
\n \n \n \n \n \n \n \n
\n Internationale Grenzwerte (nur auf Englisch)\n
\n
\n \n \n \n \n \n \n \n
\n OECD Screening Information DataSet (SIDS) (nur auf Englisch)\n
\n
\n \n \n \n \n \n \n \n
\n Risk Assessment Report (nur auf Englisch)\n
\n
\n \n \n \n \n \n \n \n
\n The MAK Collection for Occupational Health and Safety\n
\n
\n \n \n \n \n \n \n \n
\n DGUV Information 213-098: Stoffliste - Unterricht in Schulen\n
\n
\n " + } + ], + "links": null + }, + { + "drnr": "0900", + "ueberschrift": "LITERATURVERZEICHNIS\n ", + "unterkapitel": [], + "tables": "\n \n \n \n
\n

Quelle: 00001\n
IFA: Erfassungs- und Pflegehandbuch der GESTIS-Stoffdatenbank (nicht öffentlich)
Data acquisition and maintenance manual of the GESTIS substance database (non-public)

\n

Quelle: 00107\n
Sorbe \"Sicherheitstechnische Kenndaten chemischer Stoffe\" (\"Safety-related characteristics of chemical substances\"), ecomed Sicherheit, Landsberg, 07/2015

\n

Quelle: 00132\n
The Merck-Index; 15th Edition 2013

\n

Quelle: 00305\n
G. Hommel \"Handbuch der gefährlichen Güter\" (\"Handbook of Dangerous Goods\"), CD-ROM \"Hommel interaktiv\" ab Version 15.0 Springer-Verlag, Berlin Heidelberg

\n

Quelle: 00330\n
U. Welzbacher \"Neue Datenblätter für gefährliche Arbeitsstoffe nach Gefahrstoffverordnung\" Loseblattsammlung mit Ergänzungslieferungen, WEKA-Verlag, Augsburg

\n

Quelle: 00419\n
CHEMINFO - Chemical Profiles Created by CCOHS

\n

Quelle: 00456\n
Hazardous Substances Data Bank (HSDB) in PubChem

\n

Quelle: 01241\n
GHS-Sicherheitsdatenblatt, Acros Organics (eine Marke von Thermo Fisher Scientific)
GHS Material Safety Data Sheet, Acros Organics (A Thermo Fisher Scientific Brand)

\n

Quelle: 02072\n
Ecotoxicological Data, compiled by the US Environmental Protection Agency (EPA), selected and distributed by Technical Database Services (TDS), New York, 2009

\n

Quelle: 02110\n
National Center for Biotechnology Information:
PubChem
https://pubchem.ncbi.nlm.nih.gov/

\n

Quelle: 05107\n
Kühn-Birett-Merkblätter: 107. Ergänzungslieferung; 05/98

\n

Quelle: 05142\n
Kühn-Birett-Merkblätter: 142. Ergänzungslieferung; 10/2001

\n

Quelle: 05300\n
TRGS 510 \"Lagerung von Gefahrstoffen in ortsbeweglichen Behältern\" Ausgabe Dezember 2020

\n

Quelle: 05323\n
Begründungen zur Bewertung von Stoffen als krebserzeugend, erbgutverändernd oder fortpflanzungsgefährdend (s. Kapitel LINKS)

\n

Quelle: 06002\n
L. Roth, U. Weller
\"Gefährliche Chemische Reaktionen\" Loseblattsammlung mit Ergänzungslieferungen
\"Dangerous chemical reactions\" loose-leaf collection with supplement deliveries
ecomed-Verlag

\n

Quelle: 07500\n
Verordnung (EG) Nr. 1272/2008 des Europäischen Parlaments und des Rates vom 16. Dezember 2008 über die Einstufung, Kennzeichnung und Verpackung von Stoffen und Gemischen, zur Änderung und Aufhebung der Richtlinien 67/548/EWG und 1999/45/EG und zur Änderung der Verordnung (EG) Nr.1907/2006 (EG-GHS-Verordnung)

\n

Quelle: 07520\n
Europäische Chemikalienagentur ECHA: Informationen über registrierte Substanzen
European Chemicals Agency ECHA: Information on registered substances

\n

Quelle: 07530\n
Angabe des Gefahrstoffinformationssystems GisChem der Berufsgenossenschaft Rohstoffe und chemische Industrie

\n

Quelle: 07580\n
Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt geändert 18.11.2021

\n

Quelle: 07635\n
AUERDATA 98

\n

Quelle: 07636\n
L. Parmeggiani (Edt.) \"Enzyclopedia of Occupational Health and Safety\" 3. Auflage, International Labour Office, Genf 1983

\n

Quelle: 07638\n
M. Daunderer \"Toxikologische Enzyklopädie - Klinische Toxikologie - Giftinformation, Giftnachweis, Vergiftungstherapie\" Loseblatt-Ausgabe, ecomed-Verlagsgesellschaft mbH, Landsberg

\n

Quelle: 07714\n
H. P. Fiedler \"Lexikon der Hilfsstoffe für Pharmazie, Kosmetik und angrenzende Gebiete\" 3. überarbeitete und ergänzte Auflage

\n

Quelle: 07718\n
R. Ludewig, KH. Lohs \"Akute Vergiftungen\" 8. Auflage, Gustav Fischer Verlag, Jena 1991

\n

Quelle: 07727\n
L. Roth \"Gefahrstoff-Entsorgung\" Loseblattsammlung mit Ergänzungslieferungen, ecomed-Verlag, Landsberg

\n

Quelle: 07748\n
American Conference of Governmental Industrial Hygienists \"Documentation of the threshold limit values and biological exposure indices Loseblattsammlung mit Ergänzungslieferungen

\n

Quelle: 07784\n
M.L. Richardson, S. Gangolli \"The Dictionary of Substances and their Effects\" Royal Society of Chemistry, 1992

\n

Quelle: 07831\n
Verband der chemischen Industrie e.V.: \"Altstoff-Grunddatensätze\" Frankfurt a.M. ab 1991

\n

Quelle: 07869\n
European Chemical Industry Ecology and Toxicology Centre (Edt.) \"ECETOC Joint Assessment of Commodity Chemicals\" ECETOC, Brüssel

\n

Quelle: 07900\n
H. Marquardt, S.G. Schäfer (Hrsg.): Lehrbuch der Toxikologie; BI-Wissenschaftsverlag, Mannheim 1994

\n

Quelle: 07902\n
BAM: Datenbank Gefahrgut-Schnellinfo

\n

Quelle: 07930\n
NIOSH IDLHs \"Dokumentation for Immediately Dangerous to Life or Health Concentrations (IDLHs)\" U.S. Department of Health and Human Service, Cincinnati Mai 1994

\n

Quelle: 07979\n
W.M. Grant, J.S. Schuman: Toxicology of the eyes; 4th Edition, Charles C Thomas Publisher, Springfield, Illinois; 1993

\n

Quelle: 07980\n
IARC - International Agency for research on cancer: Monographs on the evaluation of carcinogenic risks to humans WHO, Lyon; Serie

\n

Quelle: 08100\n
DFG Deutsche Forschungsgemeinschaft: The MAK Collection for Occupational Health and Safety, Online ISBN: 9783527600410, DOI: 10.1002/3527600418, http://onlinelibrary.wiley.com/book/10.1002/3527600418/topics?filter=#

\n

Quelle: 08112\n
DFG Deutsche Forschungsgemeinschaft: MAK- und BAT-Werte-Liste 2021, Senatskommission zur Prüfung gesundheitsschädlicher Arbeitsstoffe, Mitteilung 57; GMS PUBLISSO

\n

Quelle: 99983\n
Liste arbeitsmedizinisch-toxikologischer Standardwerke (2)
List of standard references regarding occupational health and toxikology (2)

\n

Quelle: 99997\n
Projektgebundene arbeitsmedizinisch-toxikologische Literatur (1)
Project related bibliographical references regarding occupational health and toxikology (1)

\n

Quelle: 99999\n
Angabe des Bearbeiters
Indication of the editor

\n
\n \n \n \n \n
\n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
\n \n \n \n \n \n \n \n
Dieses Stoffdatenblatt wurde sorgfältig erstellt. Dennoch kann für den Inhalt keine Haftung, gleich aus welchem Rechtsgrund, übernommen werden.
\n " + } + ] +} diff --git a/src-tauri/cabr2_types/Cargo.toml b/crates/types/Cargo.toml similarity index 66% rename from src-tauri/cabr2_types/Cargo.toml rename to crates/types/Cargo.toml index 9bab81235..626bb1624 100644 --- a/src-tauri/cabr2_types/Cargo.toml +++ b/crates/types/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "cabr2_types" +name = "types" version = "0.0.0" authors = [ "crapStone ", @@ -10,11 +10,14 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +cfg-if = { version = "1.0.0", optional = true } chrono = { version = "0.4.19", features = ["serde"] } log = "0.4.14" serde = { version = "1.0.133", features = ["derive"] } -warp = { version = "0.3.2", default-features = false, optional = true } +tokio = { version = "1.15.0", features = ["sync"], default-features = false, optional = true } [features] -webserver = ["warp"] +lock = ["cfg-if"] +rt-tokio = ["tokio"] + default = [] diff --git a/src-tauri/cabr2_types/src/lib.rs b/crates/types/src/lib.rs similarity index 98% rename from src-tauri/cabr2_types/src/lib.rs rename to crates/types/src/lib.rs index 53da2a12a..9ec882f5b 100644 --- a/src-tauri/cabr2_types/src/lib.rs +++ b/crates/types/src/lib.rs @@ -1,8 +1,8 @@ #![allow(clippy::upper_case_acronyms)] +#[cfg(feature = "lock")] +pub mod lock; pub mod logging; -#[cfg(feature = "webserver")] -pub mod webserver; use std::collections::HashMap; diff --git a/crates/types/src/lock.rs b/crates/types/src/lock.rs new file mode 100644 index 000000000..6acb99815 --- /dev/null +++ b/crates/types/src/lock.rs @@ -0,0 +1,44 @@ +use cfg_if::cfg_if; + +// because tokio doesn't fully support wasm we have to use two different implementations for these locks +cfg_if! { + if #[cfg(feature = "rt-tokio")] { + use tokio::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; + } else { + use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; + } +} + +pub struct RwLockWrapper { + inner: RwLock, +} + +impl RwLockWrapper { + pub fn new(inner: T) -> RwLockWrapper { + RwLockWrapper { + inner: RwLock::new(inner), + } + } + + #[inline(always)] + pub async fn write(&self) -> RwLockWriteGuard<'_, T> { + cfg_if! { + if #[cfg(feature = "rt-tokio")] { + self.inner.write().await + } else { + self.inner.write().expect("failed to get write lock") + } + } + } + + #[inline(always)] + pub async fn read(&self) -> RwLockReadGuard<'_, T> { + cfg_if! { + if #[cfg(feature = "rt-tokio")] { + self.inner.read().await + } else { + self.inner.read().expect("failed to get read lock") + } + } + } +} diff --git a/src-tauri/cabr2_types/src/logging.rs b/crates/types/src/logging.rs similarity index 100% rename from src-tauri/cabr2_types/src/logging.rs rename to crates/types/src/logging.rs diff --git a/crowdin.example.yml b/crowdin.example.yml index 4c5c65a7f..9aad160dd 100644 --- a/crowdin.example.yml +++ b/crowdin.example.yml @@ -1,12 +1,14 @@ +# Use this file to create your own crowdin.yml that is in the .gitignore because of the token + "project_id": "444900" "api_token": "-TOKEN-" -"base_path": "." +"base_path": "assets/translations" "preserve_hierarchy": false files: [ { - "source": "translations/en_us.json", - "translation": "translations/%locale_with_underscore%.json", + "source": "en_us.json", + "translation": "%locale_with_underscore%.json", }, ] diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js deleted file mode 100644 index 361e7f0cd..000000000 --- a/e2e/protractor.conf.js +++ /dev/null @@ -1,37 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter, StacktraceOption } = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './src/**/*.e2e-spec.ts' - ], - capabilities: { - browserName: 'chrome' - }, - directConnect: true, - SELENIUM_PROMISE_MANAGER: false, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') - }); - jasmine.getEnv().addReporter(new SpecReporter({ - spec: { - displayStacktrace: StacktraceOption.PRETTY - } - })); - } -}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts deleted file mode 100644 index 6ebd2c4d0..000000000 --- a/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AppPage } from './app.po'; -import { browser, logging } from 'protractor'; - -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', async () => { - await page.navigateTo(); - expect(await page.getTitleText()).toEqual('ang-CaBr2 app is running!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain(jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry)); - }); -}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts deleted file mode 100644 index c9c85ab9a..000000000 --- a/e2e/src/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AppPage { - async navigateTo(): Promise { - return browser.get(browser.baseUrl); - } - - async getTitleText(): Promise { - return element(by.css('app-root .content span')).getText(); - } -} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json deleted file mode 100644 index 0782539c0..000000000 --- a/e2e/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "module": "commonjs", - "target": "es2018", - "types": [ - "jasmine", - "node" - ] - } -} diff --git a/.eslintrc.json b/frontend/.eslintrc.json similarity index 62% rename from .eslintrc.json rename to frontend/.eslintrc.json index d9aba4db3..4f391c4b6 100644 --- a/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -52,13 +52,47 @@ ], "max-len": ["error", 120], "object-curly-spacing": ["error", "always"], - "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "_" }] + "@typescript-eslint/explicit-function-return-type": [ + "error", + { + "allowExpressions": true, + "allowTypedFunctionExpressions": true, + "allowHigherOrderFunctions": true, + "allowDirectConstAssertionInArrowFunctions": true, + "allowConciseArrowFunctionExpressionsStartingWithVoid": false + } + ] } }, { "files": ["*.html"], "extends": ["plugin:@angular-eslint/template/recommended"], "rules": {} + }, + { + "files": ["*.html"], + "excludedFiles": ["*inline-template-*.component.html"], + "extends": ["plugin:prettier/recommended"], + "rules": { + // NOTE: WE ARE OVERRIDING THE DEFAULT CONFIG TO ALWAYS SET THE PARSER TO ANGULAR (SEE BELOW) + "prettier/prettier": ["error", { "parser": "angular" }] + } + }, + { + "files": ["*.ts"], + "extends": ["airbnb-typescript/base", "prettier"], + "plugins": ["prettier"], + "rules": { + "prettier/prettier": ["error"], + "@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "_" }] + } + }, + { + "files": ["*.ts"], + "plugins": ["deprecation"], + "rules": { + "deprecation/deprecation": "error" + } } ] } diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 000000000..a12d22540 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,152 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/node,yarn +# Edit at https://www.toptal.com/developers/gitignore?templates=node,yarn + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test +.env*.local + +# build output +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +### yarn ### +# https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored + +.yarn/* +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions + +# if you are NOT using Zero-installs, then: +# comment the following lines +!.yarn/cache + +# and uncomment the following lines +# .pnp.* + +# End of https://www.toptal.com/developers/gitignore/api/node,yarn + +# Angular +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events*.json +speed-measure-plugin*.json + +# misc +/.angular/cache +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings diff --git a/.prettierignore b/frontend/.prettierignore similarity index 100% rename from .prettierignore rename to frontend/.prettierignore diff --git a/frontend/.prettierrc.json b/frontend/.prettierrc.json new file mode 100644 index 000000000..ddd8865dc --- /dev/null +++ b/frontend/.prettierrc.json @@ -0,0 +1,8 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "printWidth": 120, + "endOfLine": "lf" +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 000000000..ebc7878b8 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,118 @@ +# CaBr2 Angular Application + +This is the UI application of CaBr2. +It is written in [Angular](https://angular.io/) with [TypeScript](https://www.typescriptlang.org/). + +It can be build in two different ways: As a [Tauri](https://tauri.studio) desktop application and as web application +with a WASM implementation. + +In the `src` folder is the Angular source code. + +In the [`src-tauri`](src-tauri) folder is the Tauri source code. + +In the [`src-wasm`](src-wasm) folder is the WASM glue code for the CaBr2 core logic. + +## Development requirements + +> Using Windows for development is not recommended, because it isn't tested and all of us use Linux so we most likely +> can't help you when you have problems. + +> It is recommended to use your system's package manager for each of these. +> For Windows you can use [chocolatey](https://chocolatey.org/). + +1. Install [Rust](https://www.rust-lang.org/tools/install) +2. Install [Node.js](https://nodejs.org) and [yarn](https://yarnpkg.com/getting-started/install) +3. Set up the Tauri development environment by following their [guide](https://tauri.studio/docs/get-started/intro) + (This is only needed if you want to build the desktop app). +4. (optional) If you want to generate PDFs have a look at the [wkhtmltopdf](#wkhtmltopdf) section. + +Jump to the corresponding section to learn how to build this project: + +[Tauri Application](#tauri-app) +[Standalone Web Application](#web-app) + +## Tauri App + +[Tauri](https://tauri.studio) is an alternative to [Electron](https://www.electronjs.org/) that enables us to build +smaller apps and write a Rust backend. +It is still in beta and because of this not everything works at the moment. +We advise you to use the web app until Tauri is stable. + +### Develop + +First you have to install all npm dependencies: + +```bash +yarn install +``` + +To start the Angular application in development mode run: + +```bash +yarn start +``` + +Wait until the above command finishes (it says something like: `Angular Live Development Server is listening on +localhost:4200`) and then run the following command to start Tauri in development mode: + +```bash +yarn tauri:dev +``` + +### Build + +To build the Tauri app in release mode you must first install the npm dependencies: + +```bash +yarn install --force --frozen-lockfile +``` + +Then you just have to run: + +```bash +yarn build:release +``` + +> This step most likely fails on linux. We are trying to fix the problem but haven't found a solution yet. + +## Web App + +### Develop + +You first have to compile the wasm binary. For instructions how to do this have a look at the [README in the `src-wasm` +folder](src-wasm/README.md). + +Then install all npm dependencies: + +```bash +yarn install +``` + +To start the Angular application in development mode run: + +```bash +yarn start:web +``` + +When the command finishes you can open in your Browser. + +### Build + +To build the Web app in release mode you must first install the npm dependencies: + +```bash +yarn install --force --frozen-lockfile +``` + +Then you just have to run: + +```bash +yarn build:web +``` + +## wkhtmltopdf + +> We will soon switch to another method of generating PDFs + +We generate the PDFs from html templates using `wkhtmltopdf`, so you have to install +[`wkhtmltox`](https://wkhtmltopdf.org/downloads.html). diff --git a/angular.json b/frontend/angular.json similarity index 96% rename from angular.json rename to frontend/angular.json index 6ba23607b..4899d4ac9 100644 --- a/angular.json +++ b/frontend/angular.json @@ -79,12 +79,12 @@ "src/assets", { "glob": "**/*", - "input": "ghs_symbols/", + "input": "../assets/ghs_symbols/", "output": "/ghs_symbols/" }, { "glob": "**/**", - "input": "translations", + "input": "../assets/translations", "output": "/translations/" } ] @@ -124,12 +124,12 @@ "src/assets", { "glob": "**/*", - "input": "ghs_symbols/", + "input": "../assets/ghs_symbols/", "output": "/ghs_symbols/" }, { "glob": "**/**", - "input": "translations", + "input": "../assets/translations", "output": "/translations/" } ] diff --git a/karma.conf.js b/frontend/karma.conf.js similarity index 100% rename from karma.conf.js rename to frontend/karma.conf.js diff --git a/package.json b/frontend/package.json similarity index 50% rename from package.json rename to frontend/package.json index 9090d47fa..f76aab0fc 100644 --- a/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "cabr2", - "version": "0.4.1", + "version": "0.5.0", "scripts": { "ng": "ng", "start": "ng serve", @@ -8,31 +8,31 @@ "build": "ng build", "test": "ng test", "lint": "ng lint", - "e2e": "ng e2e", "tauri": "tauri", "tauri:dev": "tauri dev", - "build:web": "ng build --configuration webProd", + "build:web": "yarn run wasm_lib:release && ng build --configuration webProd", "build:release": "ng build --configuration production && tauri build", - "build:server": "cd src-tauri && cargo build --features webserver --release", "wasm_lib:debug": "cd src-wasm && wasm-pack build --out-dir ../cabr2_wasm --dev -- --features debug_build", "wasm_lib:release": "cd src-wasm && wasm-pack build --out-dir ../cabr2_wasm --release" }, "private": true, "dependencies": { - "@angular/animations": "~12.0.0", - "@angular/cdk": "^12.0.0", - "@angular/common": "~12.0.0", - "@angular/compiler": "~12.0.0", - "@angular/core": "~12.0.0", - "@angular/forms": "~12.0.0", - "@angular/material": "^12.0.0", - "@angular/platform-browser": "~12.0.0", - "@angular/platform-browser-dynamic": "~12.0.0", - "@angular/router": "~12.0.0", - "@ngneat/transloco": "3.1.1", + "@angular/animations": "~13.1.2", + "@angular/cdk": "^13.1.2", + "@angular/common": "~13.1.2", + "@angular/compiler": "~13.1.2", + "@angular/core": "~13.1.2", + "@angular/forms": "~13.1.2", + "@angular/material": "^13.1.2", + "@angular/platform-browser": "~13.1.2", + "@angular/platform-browser-dynamic": "~13.1.2", + "@angular/router": "~13.1.2", + "@ngneat/transloco": "3.1.3", + "@ngxs/form-plugin": "^3.7.3", + "@ngxs/storage-plugin": "^3.7.3", + "@ngxs/store": "^3.7.3", "@tauri-apps/api": "^1.0.0-beta.8", - "lodash.merge": "^4.6.2", - "rxjs": "~6.6.7", + "rxjs": "~7.5.2", "tslib": "^2.3.1", "zone.js": "~0.11.4" }, @@ -40,37 +40,42 @@ "defaults", "not IE 11" ], + "engines": { + "node": ">=12.17.4" + }, "devDependencies": { - "@angular-devkit/build-angular": "~12.2.12", + "@angular-devkit/build-angular": "~13.2.1", "@angular-eslint/builder": "13.0.1", "@angular-eslint/eslint-plugin": "13.0.1", "@angular-eslint/eslint-plugin-template": "13.0.1", - "@angular-eslint/schematics": "12.7.0", + "@angular-eslint/schematics": "13.0.1", "@angular-eslint/template-parser": "13.0.1", - "@angular/cli": "~12.2.15", - "@angular/compiler-cli": "~12.0.0", + "@angular/cli": "~13.2.1", + "@angular/compiler-cli": "~13.1.2", "@tauri-apps/cli": "^1.0.0-beta.10", "@types/jasmine": "~3.10.3", - "@types/lodash.merge": "^4.6.6", - "@types/node": "^17.0.8", - "@typescript-eslint/eslint-plugin": "4.33.0", - "@typescript-eslint/parser": "4.33.0", - "eslint": "^7.32.0", + "@types/node": "^17.0.14", + "@typescript-eslint/eslint-plugin": "5.10.2", + "@typescript-eslint/parser": "5.10.2", + "eslint": "^8.8.0", + "eslint-config-airbnb-base": "15.0.0", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-deprecation": "^1.3.2", "eslint-plugin-import": "2.25.4", - "eslint-plugin-jsdoc": "37.6.1", + "eslint-plugin-jsdoc": "37.7.0", "eslint-plugin-prefer-arrow": "1.2.3", + "eslint-plugin-prettier": "^4.0.0", "jasmine-core": "~4.0.0", "jasmine-spec-reporter": "~7.0.0", - "karma": "~6.3.11", + "karma": "~6.3.13", "karma-chrome-launcher": "~3.1.0", "karma-coverage": "~2.1.0", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", "prettier": "^2.5.1", - "prettier-eslint": "^13.0.0", - "protractor": "~7.0.0", "ts-node": "~10.4.0", - "typescript": "~4.2.4", - "webpack-bundle-analyzer": "^4.4.1" + "typescript": "~4.5.5", + "webpack-bundle-analyzer": "^4.5.0" } } diff --git a/src-tauri/.gitignore b/frontend/src-tauri/.gitignore similarity index 100% rename from src-tauri/.gitignore rename to frontend/src-tauri/.gitignore diff --git a/src-tauri/Cargo.lock b/frontend/src-tauri/Cargo.lock similarity index 92% rename from src-tauri/Cargo.lock rename to frontend/src-tauri/Cargo.lock index ee5da5c32..0925186e1 100644 --- a/src-tauri/Cargo.lock +++ b/frontend/src-tauri/Cargo.lock @@ -23,15 +23,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi", -] - [[package]] name = "anyhow" version = "1.0.43" @@ -128,17 +119,6 @@ dependencies = [ "wildmatch", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.0.1" @@ -222,15 +202,6 @@ dependencies = [ "generic-array 0.12.4", ] -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.4", -] - [[package]] name = "block-padding" version = "0.1.5" @@ -249,16 +220,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "buf_redux" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" -dependencies = [ - "memchr", - "safemem", -] - [[package]] name = "bumpalo" version = "3.7.0" @@ -306,107 +267,18 @@ dependencies = [ [[package]] name = "cabr2" -version = "0.4.1" -dependencies = [ - "cabr2_config", - "cabr2_load_save", - "cabr2_logger", - "cabr2_search", - "log", - "tauri", - "tauri-build", - "tokio", - "warp", -] - -[[package]] -name = "cabr2_config" -version = "0.4.1" -dependencies = [ - "base64", - "cabr2_types", - "directories-next", - "lazy_static", - "log", - "serde", - "serde_json", - "tauri", - "thiserror", - "tokio", - "toml", - "warp", -] - -[[package]] -name = "cabr2_load_save" -version = "0.0.0" -dependencies = [ - "async-trait", - "cabr2_config", - "cabr2_types", - "cfg-if 1.0.0", - "chrono", - "handlebars", - "lazy_static", - "log", - "lopdf", - "quick-xml", - "regex", - "serde", - "serde_json", - "tauri", - "thiserror", - "tokio", - "uuid", - "warp", - "wkhtmltopdf", -] - -[[package]] -name = "cabr2_logger" -version = "0.0.0" -dependencies = [ - "cabr2_config", - "cabr2_types", - "chrono", - "fern", - "log", - "serde", - "serde_json", - "tauri", - "tokio", -] - -[[package]] -name = "cabr2_search" -version = "0.0.0" +version = "0.5.0" dependencies = [ - "async-trait", - "cabr2_types", - "cfg-if 1.0.0", - "chrono", - "futures", - "lazy_static", + "config", + "load_save", "log", - "reqwest", - "roxmltree", - "serde", + "logger", + "search", "serde_json", - "structopt", "tauri", - "thiserror", + "tauri-build", "tokio", - "warp", -] - -[[package]] -name = "cabr2_types" -version = "0.0.0" -dependencies = [ - "chrono", - "log", - "serde", - "warp", + "types", ] [[package]] @@ -491,31 +363,14 @@ version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" dependencies = [ - "js-sys", "libc", "num-integer", "num-traits", "serde", "time 0.1.44", - "wasm-bindgen", "winapi", ] -[[package]] -name = "clap" -version = "2.33.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" -dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - [[package]] name = "cocoa" version = "0.24.0" @@ -587,6 +442,22 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "config" +version = "0.0.0" +dependencies = [ + "base64", + "directories-next", + "lazy_static", + "log", + "serde", + "serde_json", + "thiserror", + "tokio", + "toml", + "types", +] + [[package]] name = "const_fn" version = "0.4.8" @@ -687,15 +558,6 @@ dependencies = [ "objc", ] -[[package]] -name = "cpufeatures" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" -dependencies = [ - "libc", -] - [[package]] name = "crc32fast" version = "1.2.1" @@ -796,7 +658,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote 1.0.9", - "strsim 0.9.3", + "strsim", "syn 1.0.75", ] @@ -1048,6 +910,13 @@ dependencies = [ "syn 1.0.75", ] +[[package]] +name = "error-ser" +version = "0.0.0" +dependencies = [ + "serde", +] + [[package]] name = "fake-simd" version = "0.1.2" @@ -1599,31 +1468,6 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -[[package]] -name = "headers" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7591fb62902706ae8e7aaff416b1b0fa2c0fd0878b46dc13baa3712d8a855" -dependencies = [ - "base64", - "bitflags 1.3.2", - "bytes", - "headers-core", - "http", - "mime", - "sha-1 0.9.8", - "time 0.1.44", -] - -[[package]] -name = "headers-core" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" -dependencies = [ - "http", -] - [[package]] name = "heck" version = "0.3.3" @@ -1915,6 +1759,28 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +[[package]] +name = "load_save" +version = "0.0.0" +dependencies = [ + "async-trait", + "chrono", + "config", + "error-ser", + "handlebars", + "lazy_static", + "log", + "lopdf", + "quick-xml 0.22.0", + "regex", + "serde", + "serde_json", + "thiserror", + "tokio", + "types", + "wkhtmltopdf", +] + [[package]] name = "lock_api" version = "0.4.5" @@ -1933,6 +1799,18 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "logger" +version = "0.0.0" +dependencies = [ + "chrono", + "config", + "fern", + "log", + "tokio", + "types", +] + [[package]] name = "loom" version = "0.5.1" @@ -2045,16 +1923,6 @@ version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" -[[package]] -name = "mime_guess" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" -dependencies = [ - "mime", - "unicase", -] - [[package]] name = "minisign-verify" version = "0.1.8" @@ -2102,24 +1970,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "multipart" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" -dependencies = [ - "buf_redux", - "httparse", - "log", - "mime", - "mime_guess", - "quick-error 1.2.3", - "rand 0.8.4", - "safemem", - "tempfile", - "twoway", -] - [[package]] name = "native-tls" version = "0.2.8" @@ -2391,12 +2241,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "open" version = "2.0.1" @@ -2569,7 +2413,7 @@ checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" dependencies = [ "maplit", "pest", - "sha-1 0.8.2", + "sha-1", ] [[package]] @@ -2670,26 +2514,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" -dependencies = [ - "proc-macro2", - "quote 1.0.9", - "syn 1.0.75", -] - [[package]] name = "pin-project-lite" version = "0.2.7" @@ -2843,6 +2667,15 @@ dependencies = [ "serde", ] +[[package]] +name = "quick-xml" +version = "0.23.0-alpha3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c002cfafa1de674ef8557e3dbf2ad8c03ac8eb3d162672411b1b7fb4d272ef" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "0.3.15" @@ -3104,15 +2937,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "roxmltree" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" -dependencies = [ - "xmlparser", -] - [[package]] name = "rust-argon2" version = "0.8.3" @@ -3155,12 +2979,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - [[package]] name = "same-file" version = "1.0.6" @@ -3192,6 +3010,25 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "search" +version = "0.0.0" +dependencies = [ + "async-trait", + "cfg-if 1.0.0", + "chrono", + "error-ser", + "lazy_static", + "log", + "quick-xml 0.23.0-alpha3", + "regex", + "reqwest", + "serde", + "serde_json", + "thiserror", + "types", +] + [[package]] name = "security-framework" version = "2.4.0" @@ -3277,18 +3114,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote 1.0.9", @@ -3297,9 +3134,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.74" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" dependencies = [ "itoa 1.0.1", "ryu", @@ -3357,23 +3194,10 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" dependencies = [ - "block-buffer 0.7.3", + "block-buffer", "digest 0.8.1", "fake-simd", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", + "opaque-debug", ] [[package]] @@ -3539,42 +3363,12 @@ dependencies = [ "quote 1.0.9", ] -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" -[[package]] -name = "structopt" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote 1.0.9", - "syn 1.0.75", -] - [[package]] name = "strum" version = "0.8.0" @@ -3913,15 +3707,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "thin-slice" version = "0.1.1" @@ -4034,9 +3819,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.15.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbbf1c778ec206785635ce8ad57fe52b3009ae9e0c9f574a728f3049d3e55838" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" dependencies = [ "bytes", "libc", @@ -4069,30 +3854,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-stream" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-tungstenite" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511de3f85caf1c98983545490c3d09685fa8eb634e57eec22bb4db271f46cbd8" -dependencies = [ - "futures-util", - "log", - "pin-project", - "tokio", - "tungstenite", -] - [[package]] name = "tokio-util" version = "0.6.7" @@ -4130,7 +3891,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", - "log", "pin-project-lite", "tracing-core", ] @@ -4151,54 +3911,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "tungstenite" -version = "0.14.0" +name = "typenum" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b2d8558abd2e276b0a8df5c05a2ec762609344191e5fd23e292c910e9165b5" -dependencies = [ - "base64", - "byteorder", - "bytes", - "http", - "httparse", - "log", - "rand 0.8.4", - "sha-1 0.9.8", - "thiserror", - "url", - "utf-8", -] +checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" [[package]] -name = "twoway" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" +name = "types" +version = "0.0.0" dependencies = [ - "memchr", + "cfg-if 1.0.0", + "chrono", + "log", + "serde", + "tokio", ] -[[package]] -name = "typenum" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" - [[package]] name = "ucd-trie" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" -[[package]] -name = "unicase" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.6" @@ -4220,12 +3954,6 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" -[[package]] -name = "unicode-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" - [[package]] name = "unicode-xid" version = "0.0.4" @@ -4264,7 +3992,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ "getrandom 0.2.3", - "serde", ] [[package]] @@ -4273,12 +4000,6 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version-compare" version = "0.0.10" @@ -4330,36 +4051,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "warp" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cef4e1e9114a4b7f1ac799f16ce71c14de5778500c5450ec6b7b920c55b587e" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "headers", - "http", - "hyper", - "log", - "mime", - "mime_guess", - "multipart", - "percent-encoding", - "pin-project", - "scoped-tls", - "serde", - "serde_json", - "serde_urlencoded 0.7.0", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tokio-util", - "tower-service", - "tracing", -] - [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -4374,9 +4065,9 @@ checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" [[package]] name = "wasm-bindgen" -version = "0.2.76" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce9b1b516211d33767048e5d47fa2a381ed8b76fc48d2ce4aa39877f9f183e0" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -4384,9 +4075,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.76" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe8dc78e2326ba5f845f4b5bf548401604fa20b1dd1d365fb73b6c1d6364041" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" dependencies = [ "bumpalo", "lazy_static", @@ -4411,9 +4102,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.76" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44468aa53335841d9d6b6c023eaab07c0cd4bddbcfdee3e2bb1e8d2cb8069fef" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" dependencies = [ "quote 1.0.9", "wasm-bindgen-macro-support", @@ -4421,9 +4112,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.76" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0195807922713af1e67dc66132c7328206ed9766af3858164fb583eedc25fbad" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" dependencies = [ "proc-macro2", "quote 1.0.9", @@ -4434,9 +4125,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.76" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdb075a845574a1fa5f09fd77e43f7747599301ea3417a9fbffdeedfc1f4a29" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" [[package]] name = "web-sys" @@ -4695,12 +4386,6 @@ dependencies = [ "bitflags 0.9.1", ] -[[package]] -name = "xmlparser" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" - [[package]] name = "zbus" version = "1.9.1" diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml new file mode 100644 index 000000000..3cd5e7b21 --- /dev/null +++ b/frontend/src-tauri/Cargo.toml @@ -0,0 +1,53 @@ +[package] +name = "cabr2" +version = "0.5.0" +description = 'Generate "experiment wise safety sheets" in compliance to European law.' +authors = [ + "Epsilon_02 ", + "crapStone ", + "6543 <6543@obermui.de>", +] +license = "GPLv3+" +repository = "https://github.com/Calciumdibromid/CaBr2/" +default-run = "cabr2" +edition = "2021" +build = "src/build.rs" + +[build-dependencies] +tauri-build = { version = "1.0.0-beta.4" } + +[dependencies] +config = { path = "../../crates/config/", features = [ "tauri-app" ] } +load_save = { path = "../../crates/load_save/" } +log = "0.4.14" +logger = { path = "../../crates/logger/" } +search = { path = "../../crates/search/" } +serde_json = "1.0.78" +tauri = { version = "1.0.0-beta.8", features = ["api-all"] } +tokio = { version = "1.16.1", features = ["macros", "rt-multi-thread"] } +types = { path = "../../crates/types" } + +[features] +custom-protocol = [ "tauri/custom-protocol" ] # needed for tauri release builds +portable = [ "config/portable" ] + +# load_save file types +beryllium = [ "load_save/beryllium" ] +cabr2 = [ "load_save/cabr2" ] +pdf = [ "load_save/pdf" ] + +# search providers +gestis = [ "search/gestis" ] + +default = [ + "portable", + "beryllium", + "cabr2", + "pdf", + "gestis", +] + +[profile.release] +panic = "abort" +codegen-units = 1 +lto = true diff --git a/src-tauri/icons/128x128.png b/frontend/src-tauri/icons/128x128.png similarity index 100% rename from src-tauri/icons/128x128.png rename to frontend/src-tauri/icons/128x128.png diff --git a/src-tauri/icons/128x128@2x.png b/frontend/src-tauri/icons/128x128@2x.png similarity index 100% rename from src-tauri/icons/128x128@2x.png rename to frontend/src-tauri/icons/128x128@2x.png diff --git a/src-tauri/icons/32x32.png b/frontend/src-tauri/icons/32x32.png similarity index 100% rename from src-tauri/icons/32x32.png rename to frontend/src-tauri/icons/32x32.png diff --git a/src-tauri/icons/Square107x107Logo.png b/frontend/src-tauri/icons/Square107x107Logo.png similarity index 100% rename from src-tauri/icons/Square107x107Logo.png rename to frontend/src-tauri/icons/Square107x107Logo.png diff --git a/src-tauri/icons/Square142x142Logo.png b/frontend/src-tauri/icons/Square142x142Logo.png similarity index 100% rename from src-tauri/icons/Square142x142Logo.png rename to frontend/src-tauri/icons/Square142x142Logo.png diff --git a/src-tauri/icons/Square150x150Logo.png b/frontend/src-tauri/icons/Square150x150Logo.png similarity index 100% rename from src-tauri/icons/Square150x150Logo.png rename to frontend/src-tauri/icons/Square150x150Logo.png diff --git a/src-tauri/icons/Square284x284Logo.png b/frontend/src-tauri/icons/Square284x284Logo.png similarity index 100% rename from src-tauri/icons/Square284x284Logo.png rename to frontend/src-tauri/icons/Square284x284Logo.png diff --git a/src-tauri/icons/Square30x30Logo.png b/frontend/src-tauri/icons/Square30x30Logo.png similarity index 100% rename from src-tauri/icons/Square30x30Logo.png rename to frontend/src-tauri/icons/Square30x30Logo.png diff --git a/src-tauri/icons/Square310x310Logo.png b/frontend/src-tauri/icons/Square310x310Logo.png similarity index 100% rename from src-tauri/icons/Square310x310Logo.png rename to frontend/src-tauri/icons/Square310x310Logo.png diff --git a/src-tauri/icons/Square44x44Logo.png b/frontend/src-tauri/icons/Square44x44Logo.png similarity index 100% rename from src-tauri/icons/Square44x44Logo.png rename to frontend/src-tauri/icons/Square44x44Logo.png diff --git a/src-tauri/icons/Square71x71Logo.png b/frontend/src-tauri/icons/Square71x71Logo.png similarity index 100% rename from src-tauri/icons/Square71x71Logo.png rename to frontend/src-tauri/icons/Square71x71Logo.png diff --git a/src-tauri/icons/Square89x89Logo.png b/frontend/src-tauri/icons/Square89x89Logo.png similarity index 100% rename from src-tauri/icons/Square89x89Logo.png rename to frontend/src-tauri/icons/Square89x89Logo.png diff --git a/src-tauri/icons/StoreLogo.png b/frontend/src-tauri/icons/StoreLogo.png similarity index 100% rename from src-tauri/icons/StoreLogo.png rename to frontend/src-tauri/icons/StoreLogo.png diff --git a/src-tauri/icons/icon.icns b/frontend/src-tauri/icons/icon.icns similarity index 100% rename from src-tauri/icons/icon.icns rename to frontend/src-tauri/icons/icon.icns diff --git a/src-tauri/icons/icon.ico b/frontend/src-tauri/icons/icon.ico similarity index 100% rename from src-tauri/icons/icon.ico rename to frontend/src-tauri/icons/icon.ico diff --git a/src-tauri/icons/icon.png b/frontend/src-tauri/icons/icon.png similarity index 100% rename from src-tauri/icons/icon.png rename to frontend/src-tauri/icons/icon.png diff --git a/src-wasm/rustfmt.toml b/frontend/src-tauri/rustfmt.toml similarity index 94% rename from src-wasm/rustfmt.toml rename to frontend/src-tauri/rustfmt.toml index 87611a89b..93db0f0ab 100644 --- a/src-wasm/rustfmt.toml +++ b/frontend/src-tauri/rustfmt.toml @@ -6,7 +6,7 @@ use_small_heuristics = "Default" reorder_imports = true reorder_modules = true remove_nested_parens = true -edition = "2018" +edition = "2021" merge_derives = true use_try_shorthand = false use_field_init_shorthand = false diff --git a/frontend/src-tauri/src/build.rs b/frontend/src-tauri/src/build.rs new file mode 100644 index 000000000..795b9b7c8 --- /dev/null +++ b/frontend/src-tauri/src/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/src-tauri/cabr2_config/src/plugin.rs b/frontend/src-tauri/src/impls/config.rs similarity index 95% rename from src-tauri/cabr2_config/src/plugin.rs rename to frontend/src-tauri/src/impls/config.rs index 71151e3e3..557639374 100644 --- a/src-tauri/cabr2_config/src/plugin.rs +++ b/frontend/src-tauri/src/impls/config.rs @@ -1,10 +1,11 @@ use serde_json::Value; use tauri::{plugin::Plugin, Invoke, Runtime, Window}; -use crate::{ +use config::{ error::Result, handler, - types::{FrontendConfig, GHSSymbols, LocalizedStringsHeader}, + types::{FrontendConfig, LocalizedStringsHeader}, + GHSSymbols, }; #[tauri::command] diff --git a/src-tauri/cabr2_load_save/src/plugin.rs b/frontend/src-tauri/src/impls/load_save.rs similarity index 95% rename from src-tauri/cabr2_load_save/src/plugin.rs rename to frontend/src-tauri/src/impls/load_save.rs index 116b11c52..999a7c3ae 100644 --- a/src-tauri/cabr2_load_save/src/plugin.rs +++ b/frontend/src-tauri/src/impls/load_save.rs @@ -1,15 +1,14 @@ use std::path::PathBuf; use tauri::{plugin::Plugin, Invoke, Runtime, Window}; - -use cabr2_types::ProviderMapping; use tokio::fs; -use crate::{ +use load_save::{ error::{LoadSaveError, Result}, - handler::{self, init_handlers}, + handler, types::{CaBr2Document, DocumentTypes}, }; +use types::ProviderMapping; #[tauri::command] pub async fn save_document(file_type: String, filename: PathBuf, document: CaBr2Document) -> Result<()> { @@ -78,7 +77,7 @@ pub struct LoadSave { impl LoadSave { pub async fn new(provider_mapping: ProviderMapping) -> Self { - init_handlers(provider_mapping).await; + handler::init_handlers(provider_mapping).await; LoadSave { invoke_handler: Box::new(tauri::generate_handler![ save_document, diff --git a/src-tauri/cabr2_logger/src/plugin.rs b/frontend/src-tauri/src/impls/logger.rs similarity index 92% rename from src-tauri/cabr2_logger/src/plugin.rs rename to frontend/src-tauri/src/impls/logger.rs index 5dd9b3ea5..9faaf2c94 100644 --- a/src-tauri/cabr2_logger/src/plugin.rs +++ b/frontend/src-tauri/src/impls/logger.rs @@ -1,9 +1,7 @@ use serde_json::{to_string_pretty, Value}; use tauri::{async_runtime, plugin::Plugin, Invoke, Runtime, Window}; -use cabr2_types::logging::LogLevel; - -use crate::setup_logger; +use ::types::logging::LogLevel; #[tauri::command] pub fn log(level: LogLevel, path: String, messages: Vec) -> Result<(), String> { @@ -36,7 +34,7 @@ pub struct Logger { impl Logger { pub fn new() -> Self { - async_runtime::block_on(setup_logger()).unwrap(); + async_runtime::block_on(::logger::setup_logger()).unwrap(); Logger { invoke_handler: Box::new(tauri::generate_handler![log]), diff --git a/frontend/src-tauri/src/impls/mod.rs b/frontend/src-tauri/src/impls/mod.rs new file mode 100644 index 000000000..bf459f211 --- /dev/null +++ b/frontend/src-tauri/src/impls/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod config; +pub(crate) mod load_save; +pub(crate) mod logger; +pub(crate) mod search; diff --git a/src-tauri/cabr2_search/src/plugin.rs b/frontend/src-tauri/src/impls/search.rs similarity index 91% rename from src-tauri/cabr2_search/src/plugin.rs rename to frontend/src-tauri/src/impls/search.rs index 0850bbc0e..f905261e8 100644 --- a/src-tauri/cabr2_search/src/plugin.rs +++ b/frontend/src-tauri/src/impls/search.rs @@ -2,9 +2,8 @@ use std::collections::HashMap; use tauri::{plugin::Plugin, Invoke, Runtime, Window}; -use cabr2_types::SubstanceData; - -use crate::{ +use ::types::SubstanceData; +use search::{ error::Result, handler, types::{ProviderInfo, SearchArguments, SearchResponse, SearchType}, @@ -41,7 +40,9 @@ pub async fn get_provider_mapping() -> HashMap { impl Search { pub async fn new() -> Self { // Must be finished when this function exits, because other init functions depend on the result of this. - handler::init_providers().await.expect("failed to initialize providers"); + handler::init_providers(env!("CARGO_PKG_VERSION")) + .await + .expect("failed to initialize providers"); Search { invoke_handler: Box::new(tauri::generate_handler![ get_available_providers, diff --git a/frontend/src-tauri/src/main.rs b/frontend/src-tauri/src/main.rs new file mode 100644 index 000000000..7fbbf9365 --- /dev/null +++ b/frontend/src-tauri/src/main.rs @@ -0,0 +1,32 @@ +#![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")] + +mod impls; + +use tauri::async_runtime; + +use impls::{config, load_save, logger, search}; + +pub fn main() { + // must be initialized first + let logger = logger::Logger::new(); + + let config = config::Config::default(); + let search = async_runtime::block_on(search::Search::new()); + + let provider_mapping = async_runtime::block_on(search::get_provider_mapping()); + let load_save = async_runtime::block_on(load_save::LoadSave::new(provider_mapping)); + + log::debug!("initializing tauri application..."); + + tauri::Builder::default() + .plugin(logger) + .plugin(config) + .plugin(search) + .plugin(load_save) + .setup(|_| { + log::debug!("tauri setup complete"); + Ok(()) + }) + .run(tauri::generate_context!()) + .unwrap(); +} diff --git a/src-tauri/tauri.conf.json b/frontend/src-tauri/tauri.conf.json similarity index 93% rename from src-tauri/tauri.conf.json rename to frontend/src-tauri/tauri.conf.json index abf260904..3e3ea518c 100644 --- a/src-tauri/tauri.conf.json +++ b/frontend/src-tauri/tauri.conf.json @@ -5,7 +5,6 @@ "beforeDevCommand": "", "beforeBuildCommand": "", "features": [ - "tauri_app", "beryllium", "cabr2", "pdf", @@ -25,9 +24,9 @@ "icons/icon.ico" ], "resources": [ - "../ghs_symbols/", - "../templates/", - "../translations/" + "../../assets/ghs_symbols/", + "../../assets/templates/", + "../../assets/translations/" ], "externalBin": [], "copyright": "", diff --git a/src-wasm/.gitignore b/frontend/src-wasm/.gitignore similarity index 100% rename from src-wasm/.gitignore rename to frontend/src-wasm/.gitignore diff --git a/src-wasm/Cargo.lock b/frontend/src-wasm/Cargo.lock similarity index 97% rename from src-wasm/Cargo.lock rename to frontend/src-wasm/Cargo.lock index e47e1ab95..4f2c98831 100644 --- a/src-wasm/Cargo.lock +++ b/frontend/src-wasm/Cargo.lock @@ -52,62 +52,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" -[[package]] -name = "cabr2_load_save" -version = "0.0.0" -dependencies = [ - "async-trait", - "cabr2_types", - "cfg-if", - "chrono", - "lazy_static", - "log", - "quick-xml", - "regex", - "serde", - "thiserror", -] - -[[package]] -name = "cabr2_search" -version = "0.0.0" -dependencies = [ - "async-trait", - "cabr2_types", - "cfg-if", - "chrono", - "lazy_static", - "log", - "reqwest", - "roxmltree", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "cabr2_types" -version = "0.0.0" -dependencies = [ - "chrono", - "log", - "serde", -] - [[package]] name = "cabr2_wasm_lib" -version = "0.4.1" +version = "0.5.0" dependencies = [ "base64", - "cabr2_load_save", - "cabr2_search", - "cabr2_types", "cfg-if", + "chrono", "console_error_panic_hook", "console_log", + "load_save", "log", + "search", "serde", "serde_json", + "types", "wasm-bindgen", "wasm-bindgen-futures", ] @@ -186,6 +145,13 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "error-ser" +version = "0.0.0" +dependencies = [ + "serde", +] + [[package]] name = "fastrand" version = "1.6.0" @@ -430,6 +396,22 @@ version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +[[package]] +name = "load_save" +version = "0.0.0" +dependencies = [ + "async-trait", + "chrono", + "error-ser", + "lazy_static", + "log", + "quick-xml 0.22.0", + "regex", + "serde", + "thiserror", + "types", +] + [[package]] name = "log" version = "0.4.14" @@ -607,6 +589,15 @@ dependencies = [ "serde", ] +[[package]] +name = "quick-xml" +version = "0.23.0-alpha3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c002cfafa1de674ef8557e3dbf2ad8c03ac8eb3d162672411b1b7fb4d272ef" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.14" @@ -687,15 +678,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "roxmltree" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" -dependencies = [ - "xmlparser", -] - [[package]] name = "ryu" version = "1.0.9" @@ -712,6 +694,25 @@ dependencies = [ "winapi", ] +[[package]] +name = "search" +version = "0.0.0" +dependencies = [ + "async-trait", + "cfg-if", + "chrono", + "error-ser", + "lazy_static", + "log", + "quick-xml 0.23.0-alpha3", + "regex", + "reqwest", + "serde", + "serde_json", + "thiserror", + "types", +] + [[package]] name = "security-framework" version = "2.4.2" @@ -737,18 +738,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.133" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" dependencies = [ "proc-macro2", "quote", @@ -757,9 +758,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.74" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" +checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085" dependencies = [ "itoa 1.0.1", "ryu", @@ -935,6 +936,16 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +[[package]] +name = "types" +version = "0.0.0" +dependencies = [ + "cfg-if", + "chrono", + "log", + "serde", +] + [[package]] name = "unicode-bidi" version = "0.3.7" @@ -1098,9 +1109,3 @@ checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" dependencies = [ "winapi", ] - -[[package]] -name = "xmlparser" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" diff --git a/frontend/src-wasm/Cargo.toml b/frontend/src-wasm/Cargo.toml new file mode 100644 index 000000000..767ca50d2 --- /dev/null +++ b/frontend/src-wasm/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "cabr2_wasm_lib" +version = "0.5.0" +edition = "2021" +description = 'Wasm implementation for CaBr2.' +authors = [ + "crapStone ", +] +license = "GPLv3+" +repository = "https://github.com/Calciumdibromid/CaBr2/" + +[lib] +crate-type = ["cdylib", "rlib"] + +[dependencies] +base64 = "0.13.0" +cfg-if = "1.0.0" +chrono = { version = "0.4.19", features = ["wasmbind"] } +console_error_panic_hook = { version = "0.1.7", optional = true } +console_log = { version = "0.2.0", features = ["color"] } +load_save = { path = "../../crates/load_save/", default-features = false } +log = "0.4.14" +search = { path = "../../crates/search/", default-features = false } +serde = "1.0.136" +serde_json = "1.0.78" +types = { path = "../../crates/types/" } +wasm-bindgen = { version = "=0.2.78", features = ["serde-serialize"] } # TODO(#1078) +wasm-bindgen-futures = "0.4.28" + +[features] +default = ["load_save/beryllium", "search/gestis"] +debug_build = ["console_error_panic_hook"] + +[profile.release] +panic = "abort" +opt-level = "s" +codegen-units = 1 +lto = true diff --git a/frontend/src-wasm/README.md b/frontend/src-wasm/README.md new file mode 100644 index 000000000..8881c4c54 --- /dev/null +++ b/frontend/src-wasm/README.md @@ -0,0 +1,49 @@ +# CaBr2 WASM Library + +This is the CaBr2 WASM library. +It is written in Rust with [`wasm-bindgen`](https://lib.rs/crates/wasm-bindgen). + +In the `src/impls` folder is the glue code for the CaBr2 core logic. + +## Build + +In order to build the WASM bindings you must first install [rust](https://www.rust-lang.org/tools/install) +and [wasm-pack](https://rustwasm.github.io/wasm-pack/installer/). +You can install them via your package manager or from the links above. +`wasm-pack` can also be installed via cargo after you installed Rust: + +```bash +cargo install wasm-pack +``` + +The WASM binaries can be built in two flavours: an optimized version that is small or an debug version that can also +display stack traces. + +These two `yarn` commands are available: + +```bash +# optimized version +yarn wasm_lib:release + +# debug buid +yarn wasm_lib:debug +``` + +Normally you just have to run the `yarn` commands but if you want to build them manually these are the commands: + +```bash +# optimized version +wasm-pack build --out-dir ../cabr2_wasm --release + +# debug buid +wasm-pack build --out-dir ../cabr2_wasm --dev -- --features debug_build +``` + +### Code Checking + +We use `clippy` for linting and `cargo fmt` to check the formatting of the code: + +```bash +cargo clippy --all-features -- --deny clippy::all +cargo fmt +``` diff --git a/frontend/src-wasm/rustfmt.toml b/frontend/src-wasm/rustfmt.toml new file mode 100644 index 000000000..93db0f0ab --- /dev/null +++ b/frontend/src-wasm/rustfmt.toml @@ -0,0 +1,13 @@ +max_width = 120 +hard_tabs = false +tab_spaces = 2 +newline_style = "Unix" +use_small_heuristics = "Default" +reorder_imports = true +reorder_modules = true +remove_nested_parens = true +edition = "2021" +merge_derives = true +use_try_shorthand = false +use_field_init_shorthand = false +force_explicit_abi = true diff --git a/src-tauri/cabr2_load_save/src/wasm.rs b/frontend/src-wasm/src/impls/load_save.rs similarity index 84% rename from src-tauri/cabr2_load_save/src/wasm.rs rename to frontend/src-wasm/src/impls/load_save.rs index ca574cd75..40dbbdbc8 100644 --- a/src-tauri/cabr2_load_save/src/wasm.rs +++ b/frontend/src-wasm/src/impls/load_save.rs @@ -1,9 +1,8 @@ -use cabr2_types::ProviderMapping; - -pub use crate::types::{CaBr2Document, DocumentTypes}; -use crate::{ +use ::types::ProviderMapping; +pub use load_save::{ error::Result, handler::{self, init_handlers}, + types::{CaBr2Document, DocumentTypes}, }; pub async fn init(provider_mapping: ProviderMapping) { diff --git a/frontend/src-wasm/src/impls/mod.rs b/frontend/src-wasm/src/impls/mod.rs new file mode 100644 index 000000000..ecb16ed49 --- /dev/null +++ b/frontend/src-wasm/src/impls/mod.rs @@ -0,0 +1,2 @@ +pub(crate) mod load_save; +pub(crate) mod search; diff --git a/src-tauri/cabr2_search/src/wasm.rs b/frontend/src-wasm/src/impls/search.rs similarity index 85% rename from src-tauri/cabr2_search/src/wasm.rs rename to frontend/src-wasm/src/impls/search.rs index e49c278bb..18faa9774 100644 --- a/src-tauri/cabr2_search/src/wasm.rs +++ b/frontend/src-wasm/src/impls/search.rs @@ -1,15 +1,16 @@ use std::collections::HashMap; -use cabr2_types::SubstanceData; - -use crate::{ +use ::types::SubstanceData; +use search::{ error::Result, handler, types::{ProviderInfo, SearchArguments, SearchResponse, SearchType}, }; pub async fn init() { - handler::init_providers().await.expect("failed to initialize providers"); + handler::init_providers(env!("CARGO_PKG_VERSION")) + .await + .expect("failed to initialize providers"); } pub async fn get_provider_mapping() -> HashMap { diff --git a/src-wasm/src/lib.rs b/frontend/src-wasm/src/lib.rs similarity index 73% rename from src-wasm/src/lib.rs rename to frontend/src-wasm/src/lib.rs index 8f2e6941d..cba21ac13 100644 --- a/src-wasm/src/lib.rs +++ b/frontend/src-wasm/src/lib.rs @@ -1,3 +1,5 @@ +mod impls; + use std::{env, future::Future}; use base64::encode; @@ -6,8 +8,10 @@ use log::Level; use serde::Serialize; use wasm_bindgen::prelude::*; -use cabr2_load_save::wasm::CaBr2Document; -use cabr2_search::types::{SearchArguments, SearchType}; +use ::load_save::types::CaBr2Document; +use ::search::types::{SearchArguments, SearchType}; + +use crate::impls::{load_save, search}; type Result = std::result::Result; @@ -26,9 +30,9 @@ pub async fn init() { log::debug!("Initializing WASM implementation..."); // must be initialized first - cabr2_search::wasm::init().await; + search::init().await; - cabr2_load_save::wasm::init(cabr2_search::wasm::get_provider_mapping().await).await; + load_save::init(search::get_provider_mapping().await).await; } /// Converts a `CaBr2Document` into a `base64` encoded `string` that can be saved by the client. @@ -43,7 +47,7 @@ pub async fn save_document(file_type: String, document: String) -> Result return Err(JsValue::from(err.to_string())), }; - match cabr2_load_save::wasm::save_document(file_type, document).await { + match load_save::save_document(file_type, document).await { Ok(res) => Ok(encode(res)), Err(err) => Err(JsValue::from(err.to_string())), } @@ -54,7 +58,7 @@ pub async fn save_document(file_type: String, document: String) -> Result) -> Result { - convert_result(cabr2_load_save::wasm::load_document(file_type, doc)).await + convert_result(load_save::load_document(file_type, doc)).await } /// Returns all available document types. @@ -63,7 +67,7 @@ pub async fn load_document(file_type: String, doc: Vec) -> Result { /// May throw errors. #[wasm_bindgen] pub async fn get_available_document_types() -> Result { - convert_value(cabr2_load_save::wasm::get_available_document_types()).await + convert_value(load_save::get_available_document_types()).await } /// Returns version as `string` @@ -75,7 +79,7 @@ pub fn get_program_version() -> String { /// May throw errors. #[wasm_bindgen] pub async fn get_available_providers() -> Result { - convert_value(cabr2_search::wasm::get_available_providers()).await + convert_value(search::get_available_providers()).await } /// May throw errors. @@ -86,7 +90,7 @@ pub async fn search_suggestions(provider: String, pattern: String, search_type: Err(err) => return Err(JsValue::from(err.to_string())), }; - convert_result(cabr2_search::wasm::search_suggestions(provider, pattern, search_type)).await + convert_result(search::search_suggestions(provider, pattern, search_type)).await } /// May throw errors. @@ -97,13 +101,13 @@ pub async fn search_results(provider: String, arguments_: String) -> Result return Err(JsValue::from(err.to_string())), }; - convert_result(cabr2_search::wasm::search_results(provider, arguments)).await + convert_result(search::search_results(provider, arguments)).await } /// May throw errors. #[wasm_bindgen] pub async fn substance_data(provider: String, identifier: String) -> Result { - convert_result(cabr2_search::wasm::get_substance_data(provider, identifier)).await + convert_result(search::get_substance_data(provider, identifier)).await } async fn convert_value(future: impl Future) -> Result @@ -119,13 +123,20 @@ where async fn convert_result(future: impl Future>) -> Result where S: Serialize, - E: std::error::Error, + E: std::error::Error + Serialize, { match future.await { - Ok(data) => match serde_json::to_string(&data) { - Ok(res) => Ok(res), - Err(err) => Err(JsValue::from(err.to_string())), - }, - Err(err) => Err(JsValue::from(err.to_string())), + Ok(data) => Ok(serde_json::to_string(&data).map_err(jsify)?), + Err(err) => Err(JsValue::from_serde(&err).map_err(jsify)?), } } + +#[cfg(feature = "debug_build")] +fn jsify(err: serde_json::Error) -> JsValue { + JsValue::from_str(&format!("{err:#?}")) +} + +#[cfg(not(feature = "debug_build"))] +fn jsify(err: serde_json::Error) -> JsValue { + JsValue::from_str(&format!("{err}")) +} diff --git a/frontend/src/app/@core/actions/disposal.actions.ts b/frontend/src/app/@core/actions/disposal.actions.ts new file mode 100644 index 000000000..5d3a014cf --- /dev/null +++ b/frontend/src/app/@core/actions/disposal.actions.ts @@ -0,0 +1,27 @@ +import { CdkDragDrop } from '@angular/cdk/drag-drop'; + +export class FillSentence { + static readonly type = '[Disposal] fill sentence'; + + constructor(public strings: string[]) {} +} + +export class AddEmptyLine { + static readonly type = '[Disposal] add empty line'; +} + +export class RemoveSentence { + static readonly type = '[Disposal] remove sentence'; + + constructor(public index: number) {} +} + +export class RearrangeSentences { + static readonly type = '[Disposal] rearrange sentences'; + + constructor(public event: CdkDragDrop | any) {} +} + +export class ResetSentences { + static readonly type = '[Disposal] reset sentences'; +} diff --git a/frontend/src/app/@core/actions/human-and-environment-danger.actions.ts b/frontend/src/app/@core/actions/human-and-environment-danger.actions.ts new file mode 100644 index 000000000..6a1da49c3 --- /dev/null +++ b/frontend/src/app/@core/actions/human-and-environment-danger.actions.ts @@ -0,0 +1,27 @@ +import { CdkDragDrop } from '@angular/cdk/drag-drop'; + +export class FillSentence { + static readonly type = '[HumanAndEnvironmentDanger] fill sentence'; + + constructor(public strings: string[]) {} +} + +export class AddEmptyLine { + static readonly type = '[HumanAndEnvironmentDanger] add empty line'; +} + +export class RemoveSentence { + static readonly type = '[HumanAndEnvironmentDanger] remove sentence'; + + constructor(public index: number) {} +} + +export class RearrangeSentences { + static readonly type = '[HumanAndEnvironmentDanger] rearrange sentences'; + + constructor(public event: CdkDragDrop | any) {} +} + +export class ResetSentences { + static readonly type = '[HumanAndEnvironmentDanger] reset sentences'; +} diff --git a/frontend/src/app/@core/actions/in-case-of-danger.actions.ts b/frontend/src/app/@core/actions/in-case-of-danger.actions.ts new file mode 100644 index 000000000..9107def42 --- /dev/null +++ b/frontend/src/app/@core/actions/in-case-of-danger.actions.ts @@ -0,0 +1,27 @@ +import { CdkDragDrop } from '@angular/cdk/drag-drop'; + +export class FillSentence { + static readonly type = '[InCaseOfDanger] fill sentence'; + + constructor(public strings: string[]) {} +} + +export class AddEmptyLine { + static readonly type = '[InCaseOfDanger] add empty line'; +} + +export class RemoveSentence { + static readonly type = '[InCaseOfDanger] remove sentence'; + + constructor(public index: number) {} +} + +export class RearrangeSentences { + static readonly type = '[InCaseOfDanger] rearrange sentences'; + + constructor(public event: CdkDragDrop | any) {} +} + +export class ResetSentences { + static readonly type = '[InCaseOfDanger] reset sentences'; +} diff --git a/frontend/src/app/@core/actions/rules-of-conduct-acitons.ts b/frontend/src/app/@core/actions/rules-of-conduct-acitons.ts new file mode 100644 index 000000000..29e539e92 --- /dev/null +++ b/frontend/src/app/@core/actions/rules-of-conduct-acitons.ts @@ -0,0 +1,27 @@ +import { CdkDragDrop } from '@angular/cdk/drag-drop'; + +export class FillSentence { + static readonly type = '[RulesOfConduct] fill sentence'; + + constructor(public strings: string[]) {} +} + +export class AddEmptyLine { + static readonly type = '[RulesOfConduct] add empty line'; +} + +export class RemoveSentence { + static readonly type = '[RulesOfConduct] remove sentence'; + + constructor(public index: number) {} +} + +export class RearrangeSentences { + static readonly type = '[RulesOfConduct] rearrange sentences'; + + constructor(public event: CdkDragDrop | any) {} +} + +export class ResetSentences { + static readonly type = '[RulesOfConduct] reset sentences'; +} diff --git a/src/app/@core/interfaces/DocTemplate.ts b/frontend/src/app/@core/interfaces/DocTemplate.ts similarity index 100% rename from src/app/@core/interfaces/DocTemplate.ts rename to frontend/src/app/@core/interfaces/DocTemplate.ts diff --git a/frontend/src/app/@core/interfaces/config.interface.ts b/frontend/src/app/@core/interfaces/config.interface.ts new file mode 100644 index 000000000..cc25ccec6 --- /dev/null +++ b/frontend/src/app/@core/interfaces/config.interface.ts @@ -0,0 +1,5 @@ +export interface Config { + readonly darkTheme: boolean; + readonly language: string; + readonly acceptedConsent: boolean; +} diff --git a/frontend/src/app/@core/interfaces/string-list-state-model.interface.ts b/frontend/src/app/@core/interfaces/string-list-state-model.interface.ts new file mode 100644 index 000000000..6e0d640dd --- /dev/null +++ b/frontend/src/app/@core/interfaces/string-list-state-model.interface.ts @@ -0,0 +1,11 @@ +export interface StringListStateModel { + form: { + model?: { + elements: ElementModel[]; + }; + }; +} + +export interface ElementModel { + value: string; +} diff --git a/frontend/src/app/@core/models/header.model.ts b/frontend/src/app/@core/models/header.model.ts new file mode 100644 index 000000000..933c0fdee --- /dev/null +++ b/frontend/src/app/@core/models/header.model.ts @@ -0,0 +1,11 @@ +import { Header } from '../interfaces/DocTemplate'; + +export const EMPTY_HEADER: Header = { + assistant: '', + documentTitle: '', + labCourse: '', + name: '', + organisation: '', + place: '', + preparation: '', +}; diff --git a/src/app/@core/models/substances.model.ts b/frontend/src/app/@core/models/substances.model.ts similarity index 73% rename from src/app/@core/models/substances.model.ts rename to frontend/src/app/@core/models/substances.model.ts index ce5b86554..2e9a12a12 100644 --- a/src/app/@core/models/substances.model.ts +++ b/frontend/src/app/@core/models/substances.model.ts @@ -1,20 +1,66 @@ +import { SafeResourceUrl } from '@angular/platform-browser'; + +export type GHSSymbols = Map; + +interface EmptyData { + originalData: T; +} + +// these are needed to create new objects every time and don't copy a reference +// because otherwise every field would reference the same values +const EMPTY_DATA = (): EmptyData => ({ originalData: undefined }); +const EMPTY_STRING_DATA = (): EmptyData => ({ originalData: '' }); +const EMPTY_LIST_DATA = (): EmptyData<[]> => ({ originalData: [] }); + +export const EMPTY_VIEW_SUBSTANCE_DATA: ViewSubstanceData = { + name: '', + cas: '', + molecularFormula: '', + molarMass: '', + meltingPoint: '', + boilingPoint: '', + waterHazardClass: '', + hPhrases: [], + pPhrases: [], + signalWord: '', + symbols: [], + lethalDose: '', + mak: '', +}; + export class SubstanceData { name: Data; + readonly alternativeNames: string[]; + cas: Data; + molecularFormula: Data; + molarMass: Data; + meltingPoint: Data; + boilingPoint: Data; + waterHazardClass: Data; + hPhrases: Data<[string, string][]>; + pPhrases: Data<[string, string][]>; + signalWord: Data; + symbols: Data; + lethalDose: Data; + mak: Data; + amount: Amount | undefined; + readonly source: Source; + checked: boolean; /** @@ -77,6 +123,25 @@ export class SubstanceData { return false; } + + convertToViewSubstanceData(): ViewSubstanceData { + return { + name: this.name.modifiedData ?? this.name.originalData, + cas: this.cas.modifiedData ?? this.cas.originalData, + molecularFormula: this.molecularFormula.modifiedData ?? this.molecularFormula.originalData, + molarMass: this.molarMass.modifiedData ?? this.molarMass.originalData, + meltingPoint: this.meltingPoint.modifiedData ?? this.meltingPoint.originalData, + boilingPoint: this.boilingPoint.modifiedData ?? this.boilingPoint.originalData, + waterHazardClass: this.waterHazardClass.modifiedData ?? this.waterHazardClass.originalData, + hPhrases: this.hPhrases.modifiedData ?? this.hPhrases.originalData, + pPhrases: this.pPhrases.modifiedData ?? this.pPhrases.originalData, + signalWord: this.signalWord.modifiedData ?? this.signalWord.originalData, + symbols: this.symbols.modifiedData ?? this.symbols.originalData, + lethalDose: this.lethalDose.modifiedData ?? this.lethalDose.originalData, + mak: this.mak.modifiedData ?? this.mak.originalData, + amount: this.amount, + }; + } } /** @@ -109,6 +174,23 @@ export interface Amount { unit: Unit; } +export interface ViewSubstanceData { + name: string; + cas?: string; + molecularFormula?: string; + molarMass?: string; + meltingPoint?: string; + boilingPoint?: string; + waterHazardClass?: string; + hPhrases: [string, string][]; + pPhrases: [string, string][]; + signalWord?: string; + symbols: string[]; + lethalDose?: string; + mak?: string; + amount?: Amount; +} + export interface Unit { type: UnitType; name?: string; @@ -181,14 +263,6 @@ const unitMapping = new Map([ [UnitType.FAHRENHEIT, 'F'], ]); -const getViewValue = (unit: Unit): string => { - if (unit.type === UnitType.CUSTOM) { - return unit.name ?? ''; - } - - return getViewName(unit); -}; - const getViewName = (unit: Unit): string => { const value = unitMapping.get(unit.type); @@ -199,6 +273,14 @@ const getViewName = (unit: Unit): string => { return value; }; +const getViewValue = (unit: Unit): string => { + if (unit.type === UnitType.CUSTOM) { + return unit.name ?? ''; + } + + return getViewName(unit); +}; + class UnitGroups { public readonly substanceUnits = [ UnitType.GRAM, @@ -211,6 +293,7 @@ class UnitGroups { UnitType.MILLIMOL, UnitType.PIECES, ]; + public readonly solutionUnits = [ UnitType.SOLUTION_MOL, UnitType.SOLUTION_MILLIMOL, @@ -218,8 +301,11 @@ class UnitGroups { UnitType.SOLUTION_GRAM, UnitType.SOLUTION_MILLIGRAM, ]; + public readonly temperatureUnits = [UnitType.CELSIUS, UnitType.FAHRENHEIT]; + public readonly lethalUnits = [UnitType.MILLIGRAM_PER_KILOGRAM, UnitType.MILLIGRAM_PER_LITER]; + public readonly defaultUnitGroups: GroupMapping[] = [ { viewValue: 'rawSubstance', unitMappings: this.substanceUnits }, { viewValue: 'solution', unitMappings: this.solutionUnits }, @@ -230,9 +316,3 @@ class UnitGroups { const unitGroups = new UnitGroups(); export { unitMapping, unitGroups, getViewValue, getViewName, modifiedOrOriginal }; - -// these are needed to create new objects every time and don't copy a reference -// because otherwise every field would reference the same values -const EMPTY_DATA = () => ({ originalData: undefined }); -const EMPTY_STRING_DATA = () => ({ originalData: '' }); -const EMPTY_LIST_DATA = () => ({ originalData: [] }); diff --git a/src/app/@core/modules/alert.module.ts b/frontend/src/app/@core/modules/alert.module.ts similarity index 100% rename from src/app/@core/modules/alert.module.ts rename to frontend/src/app/@core/modules/alert.module.ts diff --git a/src/app/@core/modules/mat.module.ts b/frontend/src/app/@core/modules/mat.module.ts similarity index 100% rename from src/app/@core/modules/mat.module.ts rename to frontend/src/app/@core/modules/mat.module.ts diff --git a/frontend/src/app/@core/operators/string-list-operators.ts b/frontend/src/app/@core/operators/string-list-operators.ts new file mode 100644 index 000000000..12ded93d0 --- /dev/null +++ b/frontend/src/app/@core/operators/string-list-operators.ts @@ -0,0 +1,47 @@ +import { append, patch, removeItem } from '@ngxs/store/operators'; +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { StateOperator } from '@ngxs/store'; + +import { StringListStateModel } from '../interfaces/string-list-state-model.interface'; + +export const addEmptySentence = (): StateOperator => + patch({ + form: patch({ + model: patch({ + elements: append([ + { + value: '', + }, + ]), + }), + }), + }); + +export const removeSentence = (index: number): StateOperator => + patch({ + form: patch({ + model: patch({ + elements: removeItem(index), + }), + }), + }); + +export const rearrangeSentences = + (event: CdkDragDrop | any): StateOperator => + (state: Readonly): StringListStateModel => { + const elements = state.form.model?.elements.slice(); + if (elements) { + moveItemInArray(elements, event.previousIndex, event.currentIndex); + return { + ...state, + form: { + ...state.form, + model: { + ...state.form.model, + elements, + }, + }, + }; + } + return state; + }; diff --git a/src/app/@core/pipes/molecularformula.pipe.ts b/frontend/src/app/@core/pipes/molecularformula.pipe.ts similarity index 100% rename from src/app/@core/pipes/molecularformula.pipe.ts rename to frontend/src/app/@core/pipes/molecularformula.pipe.ts diff --git a/src/app/@core/services/alertsnackbar/altersnackbar.model.ts b/frontend/src/app/@core/services/alertsnackbar/alertsnackbar.model.ts similarity index 99% rename from src/app/@core/services/alertsnackbar/altersnackbar.model.ts rename to frontend/src/app/@core/services/alertsnackbar/alertsnackbar.model.ts index 0e22e2edd..e8d26bd0c 100644 --- a/src/app/@core/services/alertsnackbar/altersnackbar.model.ts +++ b/frontend/src/app/@core/services/alertsnackbar/alertsnackbar.model.ts @@ -1,5 +1,6 @@ export class Alert { type!: AlertType; + message!: string; constructor(init?: Partial) { diff --git a/src/app/@core/services/alertsnackbar/altersnackbar.service.ts b/frontend/src/app/@core/services/alertsnackbar/alertsnackbar.service.ts similarity index 92% rename from src/app/@core/services/alertsnackbar/altersnackbar.service.ts rename to frontend/src/app/@core/services/alertsnackbar/alertsnackbar.service.ts index 190b6f784..efe298622 100644 --- a/src/app/@core/services/alertsnackbar/altersnackbar.service.ts +++ b/frontend/src/app/@core/services/alertsnackbar/alertsnackbar.service.ts @@ -1,4 +1,4 @@ -import { Alert, AlertType } from './altersnackbar.model'; +import { Alert, AlertType } from './alertsnackbar.model'; import { Observable, Subject } from 'rxjs'; import { Injectable } from '@angular/core'; diff --git a/src/app/@core/services/config/config.interface.ts b/frontend/src/app/@core/services/config/config.interface.ts similarity index 52% rename from src/app/@core/services/config/config.interface.ts rename to frontend/src/app/@core/services/config/config.interface.ts index 984e6fe3a..a3d3015b6 100644 --- a/src/app/@core/services/config/config.interface.ts +++ b/frontend/src/app/@core/services/config/config.interface.ts @@ -1,15 +1,16 @@ -import { ConfigModel } from '../../models/config.model'; -import { GHSSymbols } from '../../models/global.model'; import { Injectable } from '@angular/core'; + +import { Config } from '../../interfaces/config.interface'; +import { GHSSymbols } from '../../models/substances.model'; import { Observable } from 'rxjs'; @Injectable() export abstract class IConfigService { abstract getProgramVersion(): Observable; - abstract getConfig(): Observable; + abstract loadConfig(): Observable; - abstract saveConfig(config: ConfigModel): Observable; + abstract saveConfig(config: Config): Observable; abstract getHazardSymbols(): Observable; } diff --git a/src/app/@core/services/config/config.service.ts b/frontend/src/app/@core/services/config/config.service.ts similarity index 75% rename from src/app/@core/services/config/config.service.ts rename to frontend/src/app/@core/services/config/config.service.ts index 4caa648f9..deae44577 100644 --- a/src/app/@core/services/config/config.service.ts +++ b/frontend/src/app/@core/services/config/config.service.ts @@ -1,13 +1,12 @@ import { DomSanitizer } from '@angular/platform-browser'; import { Injectable } from '@angular/core'; +import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; -import { ConfigModel } from '../../models/config.model'; -import { GHSSymbols } from '../../models/global.model'; - +import { Config } from '../../interfaces/config.interface'; +import { GHSSymbols } from '../../models/substances.model'; import { IConfigService } from './config.interface'; import { INativeService } from '../native/native.interface'; -import { map } from 'rxjs/operators'; @Injectable() export class ConfigService implements IConfigService { @@ -17,12 +16,20 @@ export class ConfigService implements IConfigService { return this.nativeService.promisified('plugin:cabr2_config|get_program_version'); } - getConfig(): Observable { - return this.nativeService.promisified('plugin:cabr2_config|get_config'); + loadConfig(): Observable { + return this.nativeService.promisified('plugin:cabr2_config|get_config').pipe( + map((config) => ({ + ...config.global, + })), + ); } - saveConfig(config: ConfigModel): Observable { - return this.nativeService.promisified('plugin:cabr2_config|save_config', { config }); + saveConfig(config: Config): Observable { + return this.nativeService.promisified('plugin:cabr2_config|save_config', { + config: { + global: config, + }, + }); } getHazardSymbols(): Observable { diff --git a/src/app/@core/services/config/web/config.service.ts b/frontend/src/app/@core/services/config/web/config.service.ts similarity index 64% rename from src/app/@core/services/config/web/config.service.ts rename to frontend/src/app/@core/services/config/web/config.service.ts index c2447ee8f..6e1e57997 100644 --- a/src/app/@core/services/config/web/config.service.ts +++ b/frontend/src/app/@core/services/config/web/config.service.ts @@ -2,9 +2,9 @@ import { Observable, of } from 'rxjs'; import { Injectable } from '@angular/core'; import * as wasm from 'cabr2_wasm'; -import { ConfigModel } from 'src/app/@core/models/config.model'; -import { GHSSymbols } from 'src/app/@core/models/global.model'; +import { GHSSymbols } from 'src/app/@core/models/substances.model'; +import { Config } from '../../../interfaces/config.interface'; import { IConfigService } from '../config.interface'; @Injectable() @@ -13,17 +13,12 @@ export class ConfigWebService implements IConfigService { return of(wasm.get_program_version()); } - getConfig(): Observable { - const config = localStorage.getItem('config'); - if (config) { - return of(new ConfigModel(JSON.parse(config).global)); - } else { - return of(new ConfigModel()); - } + loadConfig(): Observable { + throw Error('Loadconfig is not required for web'); } - saveConfig(config: ConfigModel): Observable { - return of(localStorage.setItem('config', JSON.stringify(config))); + saveConfig(_: any): Observable { + throw Error('Saveconfig is not required for web'); } getHazardSymbols(): Observable { diff --git a/src/app/@core/services/document/document.service.ts b/frontend/src/app/@core/services/document/document.service.ts similarity index 64% rename from src/app/@core/services/document/document.service.ts rename to frontend/src/app/@core/services/document/document.service.ts index dbe31e687..49bd2b173 100644 --- a/src/app/@core/services/document/document.service.ts +++ b/frontend/src/app/@core/services/document/document.service.ts @@ -1,45 +1,69 @@ import { combineLatest, Observable } from 'rxjs'; import { first, map, switchMap } from 'rxjs/operators'; -import { GlobalModel } from '../../models/global.model'; +import { Select, Store } from '@ngxs/store'; +import { DialogFilter } from '@tauri-apps/api/dialog'; import { Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { translate } from '@ngneat/transloco'; -import { AlertService } from '../alertsnackbar/altersnackbar.service'; +import DocsTemplate, { Header } from '../../interfaces/DocTemplate'; +import { FillHeader, HeaderState } from '../../states/header.state'; +import { AlertService } from '../alertsnackbar/alertsnackbar.service'; import { CaBr2Document } from '../loadSave/loadSave.model'; import { compareArrays } from '../../utils/compare'; -import { DialogFilter } from '@tauri-apps/api/dialog'; -import DocsTemplate from '../../interfaces/DocTemplate'; +import { DisposalState } from '../../states/disposal.state'; +import { FillSentence as FillDisposalSentence } from '../../actions/disposal.actions'; +import { FillSentence as FillHumanAndEnvironmentDangerSentence } from '../../actions/human-and-environment-danger.actions'; +import { FillSentence as FillInCaseOfDangerSentence } from '../../actions/in-case-of-danger.actions'; +import { FillSentence as FillRulesOfConductSentence } from '../../actions/rules-of-conduct-acitons'; +import { FillSubstanceData } from '../../states/substance-data.state'; +import { HumanAndEnvironmentDangerState } from '../../states/human-and-environment-danger.state'; import { ILoadSaveService } from '../loadSave/loadSave.interface'; import { INativeService } from '../native/native.interface'; +import { InCaseOfDangerState } from '../../states/incase-of-danger.state'; import Logger from '../../utils/logger'; -import { YesNoDialogComponent } from 'src/app/components/yes-no-dialog/yes-no-dialog.component'; +import { RulesOfConductState } from '../../states/rules-of-conduct.state'; +import { SubstanceData } from '../../models/substances.model'; +import { YesNoDialogComponent } from '../../../components/yes-no-dialog/yes-no-dialog.component'; const logger = new Logger('documentService'); @Injectable() export default class DocumentService { + @Select(HeaderState.header) private header$!: Observable
; + + @Select((state: any) => state.substance_data.substanceData) private substanceData$!: Observable; + + @Select(DisposalState.elements) private disposal$!: Observable; + + @Select(HumanAndEnvironmentDangerState.elements) private humanAndEnvironmentDanger$!: Observable; + + @Select(InCaseOfDangerState.elements) private inCaseOfDanger$!: Observable; + + @Select(RulesOfConductState.elements) private rulesConduct$!: Observable; + private loadFilter: DialogFilter[] = []; + private saveFilter: DialogFilter[] = []; constructor( - private globals: GlobalModel, + private store: Store, private nativeService: INativeService, private loadSaveService: ILoadSaveService, private alertService: AlertService, private dialog: MatDialog, ) { - this.loadSaveService.getAvailableDocumentTypes().subscribe( - (types) => { + this.loadSaveService.getAvailableDocumentTypes().subscribe({ + next: (types) => { logger.debug(types); this.loadFilter = types.load; this.saveFilter = types.save; }, - (err) => { + error: (err) => { logger.error('could not get document types:', err); this.alertService.error(translate('error.getAvailableDocumentTypes')); }, - ); + }); } loadFile(): void { @@ -50,18 +74,21 @@ export default class DocumentService { multiple: false, }) .pipe(first()) - .subscribe( - (path) => { - this.loadSaveService.loadDocument(path).subscribe( - (res) => this.documentToModel(res), - (err) => { + .subscribe({ + next: (path) => { + // this is intentional, because we have to handle both errors independently + this.loadSaveService.loadDocument(path).subscribe({ + next: (res) => { + this.documentToModel(res); + }, + error: (err) => { logger.error('loading file failed:', err); this.alertService.error(translate('error.loadFile')); }, - ); + }); }, - (err) => logger.trace('open dialog returned error:', err), - ); + error: (err) => logger.trace('open dialog returned error:', err), + }); } saveFile(type: DialogFilter, document: CaBr2Document): void { @@ -79,9 +106,9 @@ export default class DocumentService { switchMap((filename) => this.loadSaveService.saveDocument(extension, filename as string, document)), first(), ) - .subscribe( - (res) => { - logger.debug(res === undefined ? 'saving successful:' : 'saving not successful:', res); + .subscribe({ + next: (res) => { + logger.debug(res === null || res === undefined ? 'saving successful:' : 'saving not successful:', res); switch (extension) { case 'pdf': @@ -93,7 +120,7 @@ export default class DocumentService { break; } }, - (err) => { + error: (err) => { logger.error(err); // fix for an error that occurs only on MS Windows (only needed with Tauri app) if (err === 'Could not initialize COM.') { @@ -113,7 +140,7 @@ export default class DocumentService { break; } }, - ); + }); } exportFile(type: DialogFilter, docsTemplate: DocsTemplate): void { @@ -145,12 +172,12 @@ export default class DocumentService { private modelToDocument(): Observable { return combineLatest([ - this.globals.headerObservable, - this.globals.substanceDataObservable, - this.globals.disposalObservable, - this.globals.humanAndEnvironmentDangerObservable, - this.globals.inCaseOfDangerObservable, - this.globals.rulesOfConductObservable, + this.header$, + this.substanceData$, + this.disposal$, + this.humanAndEnvironmentDanger$, + this.inCaseOfDanger$, + this.rulesConduct$, ]).pipe( map((value) => ({ header: value[0], @@ -164,12 +191,14 @@ export default class DocumentService { } private documentToModel(doc: CaBr2Document): void { - this.globals.headerSubject.next(doc.header); - this.globals.substanceDataSubject.next(doc.substanceData); - this.globals.disposalSubject.next(doc.disposal); - this.globals.humanAndEnvironmentDangerSubject.next(doc.humanAndEnvironmentDanger); - this.globals.inCaseOfDangerSubject.next(doc.inCaseOfDanger); - this.globals.rulesOfConductSubject.next(doc.rulesOfConduct); + this.store.dispatch([ + new FillHeader(doc.header), + new FillSubstanceData(doc.substanceData), + new FillDisposalSentence(doc.disposal), + new FillHumanAndEnvironmentDangerSentence(doc.humanAndEnvironmentDanger), + new FillInCaseOfDangerSentence(doc.inCaseOfDanger), + new FillRulesOfConductSentence(doc.rulesOfConduct), + ]); } /** diff --git a/src/app/@core/services/i18n/i18n.interface.ts b/frontend/src/app/@core/services/i18n/i18n.interface.ts similarity index 100% rename from src/app/@core/services/i18n/i18n.interface.ts rename to frontend/src/app/@core/services/i18n/i18n.interface.ts diff --git a/src/app/@core/services/i18n/i18n.service.ts b/frontend/src/app/@core/services/i18n/i18n.service.ts similarity index 100% rename from src/app/@core/services/i18n/i18n.service.ts rename to frontend/src/app/@core/services/i18n/i18n.service.ts diff --git a/src/app/@core/services/i18n/web/i18n.service.ts b/frontend/src/app/@core/services/i18n/web/i18n.service.ts similarity index 100% rename from src/app/@core/services/i18n/web/i18n.service.ts rename to frontend/src/app/@core/services/i18n/web/i18n.service.ts diff --git a/src/app/@core/services/loadSave/loadSave.interface.ts b/frontend/src/app/@core/services/loadSave/loadSave.interface.ts similarity index 100% rename from src/app/@core/services/loadSave/loadSave.interface.ts rename to frontend/src/app/@core/services/loadSave/loadSave.interface.ts diff --git a/src/app/@core/services/loadSave/loadSave.model.ts b/frontend/src/app/@core/services/loadSave/loadSave.model.ts similarity index 88% rename from src/app/@core/services/loadSave/loadSave.model.ts rename to frontend/src/app/@core/services/loadSave/loadSave.model.ts index c0bacd0b6..f9e0ce47e 100644 --- a/src/app/@core/services/loadSave/loadSave.model.ts +++ b/frontend/src/app/@core/services/loadSave/loadSave.model.ts @@ -1,5 +1,5 @@ import { DialogFilter } from '../native/tauri.service'; -import { Header } from '../../interfaces/Header'; +import { Header } from '../../interfaces/DocTemplate'; import { SubstanceData } from '../../models/substances.model'; export interface CaBr2Document { diff --git a/src/app/@core/services/loadSave/loadSave.service.spec.ts b/frontend/src/app/@core/services/loadSave/loadSave.service.spec.ts similarity index 100% rename from src/app/@core/services/loadSave/loadSave.service.spec.ts rename to frontend/src/app/@core/services/loadSave/loadSave.service.spec.ts diff --git a/src/app/@core/services/loadSave/loadSave.service.ts b/frontend/src/app/@core/services/loadSave/loadSave.service.ts similarity index 100% rename from src/app/@core/services/loadSave/loadSave.service.ts rename to frontend/src/app/@core/services/loadSave/loadSave.service.ts diff --git a/src/app/@core/services/loadSave/web/loadSave.service.ts b/frontend/src/app/@core/services/loadSave/web/loadSave.service.ts similarity index 90% rename from src/app/@core/services/loadSave/web/loadSave.service.ts rename to frontend/src/app/@core/services/loadSave/web/loadSave.service.ts index 7ed546c15..a41f678f1 100644 --- a/src/app/@core/services/loadSave/web/loadSave.service.ts +++ b/frontend/src/app/@core/services/loadSave/web/loadSave.service.ts @@ -22,6 +22,19 @@ const SERVER_URL = } })() + 'api/v1/'; +const getFileType = (file: File): string => { + const fileTypeSplit = file.name.split('.'); + return fileTypeSplit[fileTypeSplit.length - 1]; +}; + +const downloadFile = (contents: Blob, fileType: string): void => { + const anchor = document.createElement('a'); + anchor.download = 'Unbenannt.' + fileType; + anchor.href = (window.webkitURL || window.URL).createObjectURL(contents); + anchor.dataset.downloadurl = [contents.type, anchor.download, anchor.href].join(':'); + anchor.click(); +}; + @Injectable() export class LoadSaveService implements ILoadSaveService { constructor(private httpClient: HttpClient, private dialog: MatDialog) {} @@ -44,6 +57,7 @@ export class LoadSaveService implements ILoadSaveService { subscriber: sub, }, }); + sub.next(); break; case 'cb2': @@ -57,9 +71,7 @@ export class LoadSaveService implements ILoadSaveService { wasm .save_document(fileType, JSON.stringify(document)) .then((contents: string) => { - // `atob` is deprecated but `Buffer.from()` results in optimization problems with Angular. - // I'm pretty sure `atob` won't be removed from browsers in the foreseeable future so it should be ok ^^. - const blob2 = new Blob([atob(contents)], { type: 'application/octet-stream' }); + const blob2 = new Blob([window.atob(contents)], { type: 'application/octet-stream' }); downloadFile(blob2, fileType); sub.next(); }) @@ -101,19 +113,6 @@ export class LoadSaveService implements ILoadSaveService { } } -const getFileType = (file: File): string => { - const fileTypeSplit = file.name.split('.'); - return fileTypeSplit[fileTypeSplit.length - 1]; -}; - -const downloadFile = (contents: Blob, fileType: string) => { - const anchor = document.createElement('a'); - anchor.download = 'Unbenannt.' + fileType; - anchor.href = (window.webkitURL || window.URL).createObjectURL(contents); - anchor.dataset.downloadurl = [contents.type, anchor.download, anchor.href].join(':'); - anchor.click(); -}; - interface SaveDocumentResponse { downloadUrl: string; } diff --git a/src/app/@core/services/native/native.interface.ts b/frontend/src/app/@core/services/native/native.interface.ts similarity index 100% rename from src/app/@core/services/native/native.interface.ts rename to frontend/src/app/@core/services/native/native.interface.ts diff --git a/src/app/@core/services/native/tauri.service.spec.ts b/frontend/src/app/@core/services/native/tauri.service.spec.ts similarity index 100% rename from src/app/@core/services/native/tauri.service.spec.ts rename to frontend/src/app/@core/services/native/tauri.service.spec.ts diff --git a/src/app/@core/services/native/tauri.service.ts b/frontend/src/app/@core/services/native/tauri.service.ts similarity index 100% rename from src/app/@core/services/native/tauri.service.ts rename to frontend/src/app/@core/services/native/tauri.service.ts diff --git a/src/app/@core/services/native/web/browser.service.ts b/frontend/src/app/@core/services/native/web/browser.service.ts similarity index 100% rename from src/app/@core/services/native/web/browser.service.ts rename to frontend/src/app/@core/services/native/web/browser.service.ts diff --git a/src/app/@core/services/provider/provider.interface.ts b/frontend/src/app/@core/services/provider/provider.interface.ts similarity index 99% rename from src/app/@core/services/provider/provider.interface.ts rename to frontend/src/app/@core/services/provider/provider.interface.ts index 63f11fb37..c6934bbb3 100644 --- a/src/app/@core/services/provider/provider.interface.ts +++ b/frontend/src/app/@core/services/provider/provider.interface.ts @@ -5,6 +5,7 @@ import { SubstanceData } from '../../models/substances.model'; export abstract class IProviderService { abstract providerMappingsSubject: BehaviorSubject; + abstract providerMappingsObservable: Observable; /** diff --git a/src/app/@core/services/provider/provider.model.ts b/frontend/src/app/@core/services/provider/provider.model.ts similarity index 100% rename from src/app/@core/services/provider/provider.model.ts rename to frontend/src/app/@core/services/provider/provider.model.ts diff --git a/src/app/@core/services/provider/provider.service.spec.ts b/frontend/src/app/@core/services/provider/provider.service.spec.ts similarity index 100% rename from src/app/@core/services/provider/provider.service.spec.ts rename to frontend/src/app/@core/services/provider/provider.service.spec.ts diff --git a/src/app/@core/services/provider/provider.service.ts b/frontend/src/app/@core/services/provider/provider.service.ts similarity index 82% rename from src/app/@core/services/provider/provider.service.ts rename to frontend/src/app/@core/services/provider/provider.service.ts index 782f02c84..bef16d7c4 100644 --- a/src/app/@core/services/provider/provider.service.ts +++ b/frontend/src/app/@core/services/provider/provider.service.ts @@ -1,8 +1,7 @@ import { BehaviorSubject, Observable } from 'rxjs'; -import { first } from 'rxjs/operators'; +import { first, map } from 'rxjs/operators'; import { Injectable } from '@angular/core'; -import { GlobalModel } from '../../models/global.model'; import { IProviderService } from './provider.interface'; import { Provider, ProviderMapping, SearchArguments, SearchResult, SearchType } from './provider.model'; @@ -12,9 +11,10 @@ import { SubstanceData } from '../../models/substances.model'; @Injectable() export class ProviderService implements IProviderService { providerMappingsSubject = new BehaviorSubject(new Map()); + providerMappingsObservable = this.providerMappingsSubject.asObservable(); - constructor(private nativeService: INativeService, private globals: GlobalModel) { + constructor(private nativeService: INativeService) { this.getAvailableProviders() .pipe(first()) .subscribe((providers) => this.providerMappingsSubject.next(new Map(providers.map((p) => [p.identifier, p])))); @@ -40,9 +40,11 @@ export class ProviderService implements IProviderService { } substanceData(provider: string, identifier: string): Observable { - return this.nativeService.promisified('plugin:cabr2_search|get_substance_data', { - provider, - identifier, - }); + return this.nativeService + .promisified('plugin:cabr2_search|get_substance_data', { + provider, + identifier, + }) + .pipe(map((data) => new SubstanceData(data))); } } diff --git a/src/app/@core/services/provider/web/provider.service.ts b/frontend/src/app/@core/services/provider/web/provider.service.ts similarity index 97% rename from src/app/@core/services/provider/web/provider.service.ts rename to frontend/src/app/@core/services/provider/web/provider.service.ts index b59c33a43..cea002b99 100644 --- a/src/app/@core/services/provider/web/provider.service.ts +++ b/frontend/src/app/@core/services/provider/web/provider.service.ts @@ -10,6 +10,7 @@ import { SubstanceData } from 'src/app/@core/models/substances.model'; @Injectable() export class ProviderService implements IProviderService { providerMappingsSubject = new BehaviorSubject(new Map()); + providerMappingsObservable = this.providerMappingsSubject.asObservable(); constructor() { @@ -37,6 +38,7 @@ export class ProviderService implements IProviderService { substanceData(provider: string, identifier: string): Observable { return from(wasm.substance_data(provider, identifier) as Promise).pipe( map((substance) => JSON.parse(substance)), + map((data) => new SubstanceData(data)), ); } } diff --git a/src/app/@core/services/service.module.ts b/frontend/src/app/@core/services/service.module.ts similarity index 93% rename from src/app/@core/services/service.module.ts rename to frontend/src/app/@core/services/service.module.ts index fd214cc36..5e883cf97 100644 --- a/src/app/@core/services/service.module.ts +++ b/frontend/src/app/@core/services/service.module.ts @@ -3,7 +3,6 @@ import { NgModule } from '@angular/core'; import { ConfigService } from './config/config.service'; import DocumentService from './document/document.service'; -import { GlobalModel } from '../models/global.model'; import { I18nService } from './i18n/i18n.service'; import { IConfigService } from './config/config.interface'; import { II18nService } from './i18n/i18n.interface'; @@ -43,7 +42,7 @@ logger.trace('loading services for tauri environment'); { provide: IProviderService, useClass: ProviderService, - deps: [INativeService, GlobalModel], + deps: [INativeService], }, DocumentService, ], diff --git a/src/app/@core/services/web.service.module.ts b/frontend/src/app/@core/services/web.service.module.ts similarity index 100% rename from src/app/@core/services/web.service.module.ts rename to frontend/src/app/@core/services/web.service.module.ts diff --git a/frontend/src/app/@core/states/@generic.state.ts b/frontend/src/app/@core/states/@generic.state.ts new file mode 100644 index 000000000..d1fe9d8de --- /dev/null +++ b/frontend/src/app/@core/states/@generic.state.ts @@ -0,0 +1,33 @@ +import { StateContext } from '@ngxs/store'; + +import { StringListStateModel } from '../interfaces/string-list-state-model.interface'; + +class FillSentence { + constructor(public strings: string[]) {} +} + +export abstract class GenericSentenceState { + static elements(state: StringListStateModel): string[] { + return (state.form.model?.elements ?? []).map((element) => element.value); + } + + fillSentence(context: StateContext, action: FILL): void { + context.setState({ + form: { + model: { + elements: action.strings.map((sentence) => ({ value: sentence })), + }, + }, + }); + } + + resetSentences(context: StateContext, elements: string[]): void { + context.setState({ + form: { + model: { + elements: elements.map((sentence) => ({ value: sentence })), + }, + }, + }); + } +} diff --git a/frontend/src/app/@core/states/@states.ts b/frontend/src/app/@core/states/@states.ts new file mode 100644 index 000000000..6941c8a91 --- /dev/null +++ b/frontend/src/app/@core/states/@states.ts @@ -0,0 +1,21 @@ +import { ConfigState } from './config.state'; +import { DisposalState } from './disposal.state'; +import { GHSSymbolState } from './ghs-symbols.state'; +import { HeaderState } from './header.state'; +import { HumanAndEnvironmentDangerState } from './human-and-environment-danger.state'; +import { InCaseOfDangerState } from './incase-of-danger.state'; +import { RulesOfConductState } from './rules-of-conduct.state'; +import { SubstanceDataState } from './substance-data.state'; + +const States = [ + HeaderState, + GHSSymbolState, + SubstanceDataState, + HumanAndEnvironmentDangerState, + RulesOfConductState, + InCaseOfDangerState, + DisposalState, + ConfigState, +]; + +export default States; diff --git a/frontend/src/app/@core/states/config.state.ts b/frontend/src/app/@core/states/config.state.ts new file mode 100644 index 000000000..6d813189c --- /dev/null +++ b/frontend/src/app/@core/states/config.state.ts @@ -0,0 +1,126 @@ +import { Action, State, StateContext } from '@ngxs/store'; +import { translate, TranslocoService } from '@ngneat/transloco'; +import { first } from 'rxjs'; +import { Injectable } from '@angular/core'; + +import { AlertService } from '../services/alertsnackbar/alertsnackbar.service'; +import { Config } from '../interfaces/config.interface'; +import { environment } from 'src/environments/environment'; +import { IConfigService } from '../services/config/config.interface'; +import Logger from '../utils/logger'; + +const logger = new Logger('configstate'); + +export class LoadConfig { + static readonly type = '[Config] load config'; +} + +export class SaveConfig { + static readonly type = '[Config] save config'; + + constructor(public config: Config) {} +} + +export class ToggleDarkTheme { + static readonly type = '[Config] toggle darktheme'; + + constructor(public darkTheme: boolean) {} +} + +export class ChangeLanguage { + static readonly type = '[Config] change language'; + + constructor(public languageKey: string) {} +} + +export class AcceptConsent { + static readonly type = '[Config] accept consent'; +} + +@State({ + name: 'config', + defaults: { + darkTheme: false, + language: 'de_de', + acceptedConsent: false, + }, +}) +@Injectable() +export class ConfigState { + constructor( + private configService: IConfigService, + private alertService: AlertService, + private translocoService: TranslocoService, + ) {} + + @Action(LoadConfig) + loadConfig(context: StateContext): void { + if (environment.web) { + this.translocoService.setActiveLang(context.getState().language); + return; + } + + const state = context.getState(); + this.configService + .loadConfig() + .pipe(first()) + .subscribe({ + next: (newConfig) => { + context.setState({ + ...state, + ...newConfig, + }); + }, + error: (err) => { + logger.error('loading config failed:', err); + this.alertService.error(translate('error.configLoad')); + }, + }); + } + + @Action(ToggleDarkTheme) + toggleDarkTheme(context: StateContext, action: ToggleDarkTheme): void { + context.patchState({ + darkTheme: action.darkTheme, + }); + + this.saveConfig(context.getState()); + } + + @Action(ChangeLanguage) + changeLanguage(context: StateContext, action: ChangeLanguage): void { + context.patchState({ + language: action.languageKey, + }); + this.translocoService.setActiveLang(action.languageKey); + + this.saveConfig(context.getState()); + } + + @Action(AcceptConsent) + toggleAcceptConsent(context: StateContext): void { + context.patchState({ + acceptedConsent: true, + }); + + this.saveConfig(context.getState()); + } + + private saveConfig(config: Config): void { + if (environment.web) { + logger.info('Web target! Nothing todo'); + return; + } + + this.configService + .saveConfig(config) + .pipe(first()) + .subscribe({ + next: () => logger.info('config saved'), + error: (err) => { + logger.error('saving config failed', err); + this.alertService.error(translate('error.configSave')); + }, + }); + } +} diff --git a/frontend/src/app/@core/states/disposal.state.ts b/frontend/src/app/@core/states/disposal.state.ts new file mode 100644 index 000000000..b4b8fc068 --- /dev/null +++ b/frontend/src/app/@core/states/disposal.state.ts @@ -0,0 +1,53 @@ +import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { Injectable } from '@angular/core'; + +import * as DisposalActions from '../actions/disposal.actions'; +import { addEmptySentence, rearrangeSentences, removeSentence } from '../operators/string-list-operators'; +import { GenericSentenceState } from './@generic.state'; +import { StringListStateModel } from '../interfaces/string-list-state-model.interface'; +import TEMPLATES from '../../../assets/docsTemplate.json'; + +const DISPOSAL_TEMPLATE = TEMPLATES.docsTemplate.disposal; + +@State({ + name: 'disposal', + defaults: { + form: { + model: { + elements: DISPOSAL_TEMPLATE.map((sentence) => ({ value: sentence })), + }, + }, + }, +}) +@Injectable() +export class DisposalState extends GenericSentenceState { + @Selector() + static elements(state: StringListStateModel): string[] { + return super.elements(state); + } + + @Action(DisposalActions.FillSentence) + fillSentence(context: StateContext, action: DisposalActions.FillSentence): void { + super.fillSentence(context, action); + } + + @Action(DisposalActions.AddEmptyLine) + addSentence(context: StateContext): void { + context.setState(addEmptySentence()); + } + + @Action(DisposalActions.RemoveSentence) + removeSentence(context: StateContext, action: DisposalActions.RemoveSentence): void { + context.setState(removeSentence(action.index)); + } + + @Action(DisposalActions.RearrangeSentences) + rearrangeSentences(context: StateContext, action: DisposalActions.RearrangeSentences): void { + context.setState(rearrangeSentences(action.event)); + } + + @Action(DisposalActions.ResetSentences) + resetSentences(context: StateContext): void { + super.resetSentences(context, DISPOSAL_TEMPLATE); + } +} diff --git a/frontend/src/app/@core/states/ghs-symbols.state.ts b/frontend/src/app/@core/states/ghs-symbols.state.ts new file mode 100644 index 000000000..b2674fe02 --- /dev/null +++ b/frontend/src/app/@core/states/ghs-symbols.state.ts @@ -0,0 +1,53 @@ +import { Action, State, StateContext } from '@ngxs/store'; +import { Injectable } from '@angular/core'; +import { SafeResourceUrl } from '@angular/platform-browser'; +import { translate } from '@ngneat/transloco'; + +import { AlertService } from '../services/alertsnackbar/alertsnackbar.service'; +import { IConfigService } from '../services/config/config.interface'; +import Logger from '../utils/logger'; + +const logger = new Logger('ghs.symbols.state'); + +export type GHSSymbolMap = Map; + +export type SymbolKeys = string[]; + +export interface GHSSymbolsModel { + symbols: GHSSymbolMap; + symbolKeys: SymbolKeys; +} + +export class LoadGHSSymbols { + static readonly type = '[GHSSymbol] load GHS Symbols'; +} + +@State({ + name: 'ghs_symbols', + defaults: { + symbols: new Map(), + symbolKeys: [], + }, +}) +@Injectable() +export class GHSSymbolState { + constructor(private configService: IConfigService, private alertService: AlertService) {} + + @Action(LoadGHSSymbols) + loadGHSSymbols(context: StateContext): void { + this.configService.getHazardSymbols().subscribe({ + next: (symbols) => { + const symbolKeys = Array.from(symbols.keys()); + symbolKeys.sort(); + context.setState({ + symbols, + symbolKeys, + }); + }, + error: (err) => { + logger.error('loading ghs-symbols failed:', err); + this.alertService.error(translate('error.getHazardSymbols')); + }, + }); + } +} diff --git a/frontend/src/app/@core/states/header.state.ts b/frontend/src/app/@core/states/header.state.ts new file mode 100644 index 000000000..0b3dadfe0 --- /dev/null +++ b/frontend/src/app/@core/states/header.state.ts @@ -0,0 +1,58 @@ +import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { Injectable } from '@angular/core'; + +import { EMPTY_HEADER } from '../models/header.model'; +import { Header } from '../interfaces/DocTemplate'; +import TEMPLATES from '../../../assets/docsTemplate.json'; + +const HEADER_TEMPLATE = TEMPLATES.docsTemplate.header; + +interface HeaderStateModel { + headerForm: { + model?: Header; + }; +} + +export class FillHeader { + static readonly type = '[Header] fill header with new values'; + + constructor(public header: Header) {} +} + +export class ResetHeader { + static readonly type = '[Header] reset header to default values'; +} + +@State({ + name: 'header', + defaults: { + headerForm: { + model: HEADER_TEMPLATE, + }, + }, +}) +@Injectable() +export class HeaderState { + @Selector() + static header(state: HeaderStateModel): Header { + return state.headerForm.model ?? EMPTY_HEADER; + } + + @Action(FillHeader) + fillHeader(context: StateContext, action: FillHeader): void { + context.setState({ + headerForm: { + model: action.header, + }, + }); + } + + @Action(ResetHeader) + resetHeader(context: StateContext): void { + context.setState({ + headerForm: { + model: HEADER_TEMPLATE, + }, + }); + } +} diff --git a/frontend/src/app/@core/states/human-and-environment-danger.state.ts b/frontend/src/app/@core/states/human-and-environment-danger.state.ts new file mode 100644 index 000000000..d9d7067dd --- /dev/null +++ b/frontend/src/app/@core/states/human-and-environment-danger.state.ts @@ -0,0 +1,62 @@ +import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { Injectable } from '@angular/core'; + +import * as HumanAndEnvironmentDangerActions from '../actions/human-and-environment-danger.actions'; +import { addEmptySentence, rearrangeSentences, removeSentence } from '../operators/string-list-operators'; +import { GenericSentenceState } from './@generic.state'; +import { StringListStateModel } from '../interfaces/string-list-state-model.interface'; +import TEMPLATES from '../../../assets/docsTemplate.json'; + +const HUMAN_AND_ENVIRONMENT_DANGER_TEMPLATE = TEMPLATES.docsTemplate.humanAndEnvironmentDanger; + +@State({ + name: 'human_and_environment_danger', + defaults: { + form: { + model: { + elements: HUMAN_AND_ENVIRONMENT_DANGER_TEMPLATE.map((sentence) => ({ value: sentence })), + }, + }, + }, +}) +@Injectable() +export class HumanAndEnvironmentDangerState extends GenericSentenceState { + @Selector() + static elements(state: StringListStateModel): string[] { + return super.elements(state); + } + + @Action(HumanAndEnvironmentDangerActions.FillSentence) + fillSentence( + context: StateContext, + action: HumanAndEnvironmentDangerActions.FillSentence, + ): void { + super.fillSentence(context, action); + } + + @Action(HumanAndEnvironmentDangerActions.AddEmptyLine) + addSentence(context: StateContext): void { + context.setState(addEmptySentence()); + } + + @Action(HumanAndEnvironmentDangerActions.RemoveSentence) + removeSentence( + context: StateContext, + action: HumanAndEnvironmentDangerActions.RemoveSentence, + ): void { + context.setState(removeSentence(action.index)); + } + + @Action(HumanAndEnvironmentDangerActions.RearrangeSentences) + rearrangeSentences( + context: StateContext, + action: HumanAndEnvironmentDangerActions.RearrangeSentences, + ): void { + context.setState(rearrangeSentences(action.event)); + } + + @Action(HumanAndEnvironmentDangerActions.ResetSentences) + resetSentences(context: StateContext): void { + super.resetSentences(context, HUMAN_AND_ENVIRONMENT_DANGER_TEMPLATE); + } +} diff --git a/frontend/src/app/@core/states/incase-of-danger.state.ts b/frontend/src/app/@core/states/incase-of-danger.state.ts new file mode 100644 index 000000000..1b7e325de --- /dev/null +++ b/frontend/src/app/@core/states/incase-of-danger.state.ts @@ -0,0 +1,56 @@ +import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { Injectable } from '@angular/core'; + +import * as InCaseOfDangerActions from '../actions/in-case-of-danger.actions'; +import { addEmptySentence, rearrangeSentences, removeSentence } from '../operators/string-list-operators'; +import { GenericSentenceState } from './@generic.state'; +import { StringListStateModel } from '../interfaces/string-list-state-model.interface'; +import TEMPLATES from '../../../assets/docsTemplate.json'; + +const IN_CASE_OF_DANGER_TEMPLATE = TEMPLATES.docsTemplate.inCaseOfDanger; + +@State({ + name: 'in_case_of_danger', + defaults: { + form: { + model: { + elements: IN_CASE_OF_DANGER_TEMPLATE.map((sentence) => ({ value: sentence })), + }, + }, + }, +}) +@Injectable() +export class InCaseOfDangerState extends GenericSentenceState { + @Selector() + static elements(state: StringListStateModel): string[] { + return super.elements(state); + } + + @Action(InCaseOfDangerActions.FillSentence) + fillSentence(context: StateContext, action: InCaseOfDangerActions.FillSentence): void { + super.fillSentence(context, action); + } + + @Action(InCaseOfDangerActions.AddEmptyLine) + addSentence(context: StateContext): void { + context.setState(addEmptySentence()); + } + + @Action(InCaseOfDangerActions.RemoveSentence) + removeSentence(context: StateContext, action: InCaseOfDangerActions.RemoveSentence): void { + context.setState(removeSentence(action.index)); + } + + @Action(InCaseOfDangerActions.RearrangeSentences) + rearrangeSentences( + context: StateContext, + action: InCaseOfDangerActions.RearrangeSentences, + ): void { + context.setState(rearrangeSentences(action.event)); + } + + @Action(InCaseOfDangerActions.ResetSentences) + resetSentences(context: StateContext): void { + super.resetSentences(context, IN_CASE_OF_DANGER_TEMPLATE); + } +} diff --git a/frontend/src/app/@core/states/rules-of-conduct.state.ts b/frontend/src/app/@core/states/rules-of-conduct.state.ts new file mode 100644 index 000000000..7e874622b --- /dev/null +++ b/frontend/src/app/@core/states/rules-of-conduct.state.ts @@ -0,0 +1,56 @@ +import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { Injectable } from '@angular/core'; +import { StringListStateModel } from '../interfaces/string-list-state-model.interface'; + +import * as RulesOfConductActions from '../actions/rules-of-conduct-acitons'; +import { addEmptySentence, rearrangeSentences, removeSentence } from '../operators/string-list-operators'; +import { GenericSentenceState } from './@generic.state'; +import TEMPLATES from '../../../assets/docsTemplate.json'; + +const RULES_OF_CONDUCT_TEMPLATE = TEMPLATES.docsTemplate.rulesOfConduct; + +@State({ + name: 'rules_of_conduct_state', + defaults: { + form: { + model: { + elements: RULES_OF_CONDUCT_TEMPLATE.map((sentence) => ({ value: sentence })), + }, + }, + }, +}) +@Injectable() +export class RulesOfConductState extends GenericSentenceState { + @Selector() + static elements(state: StringListStateModel): string[] { + return super.elements(state); + } + + @Action(RulesOfConductActions.FillSentence) + fillSentence(context: StateContext, action: RulesOfConductActions.FillSentence): void { + super.fillSentence(context, action); + } + + @Action(RulesOfConductActions.AddEmptyLine) + addSentence(context: StateContext): void { + context.setState(addEmptySentence()); + } + + @Action(RulesOfConductActions.RemoveSentence) + removeSentence(context: StateContext, action: RulesOfConductActions.RemoveSentence): void { + context.setState(removeSentence(action.index)); + } + + @Action(RulesOfConductActions.RearrangeSentences) + rearrangeSentences( + context: StateContext, + action: RulesOfConductActions.RearrangeSentences, + ): void { + context.setState(rearrangeSentences(action.event)); + } + + @Action(RulesOfConductActions.ResetSentences) + resetSentences(context: StateContext): void { + super.resetSentences(context, RULES_OF_CONDUCT_TEMPLATE); + } +} diff --git a/frontend/src/app/@core/states/substance-data.state.ts b/frontend/src/app/@core/states/substance-data.state.ts new file mode 100644 index 000000000..0fa9cd864 --- /dev/null +++ b/frontend/src/app/@core/states/substance-data.state.ts @@ -0,0 +1,164 @@ +import { Action, Selector, State, StateContext } from '@ngxs/store'; +import { append, patch, removeItem, updateItem } from '@ngxs/store/operators'; +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { Injectable } from '@angular/core'; +import { translate } from '@ngneat/transloco'; + +import { Data, EMPTY_VIEW_SUBSTANCE_DATA, SubstanceData, ViewSubstanceData } from '../models/substances.model'; +import { AlertService } from '../services/alertsnackbar/alertsnackbar.service'; +import { IProviderService } from '../services/provider/provider.interface'; +import Logger from '../utils/logger'; +import { ProviderMapping } from '../services/provider/provider.model'; + +const logger = new Logger('substance.data.state'); + +interface SubstanceDataStateModel { + substanceData: SubstanceData[]; + providers: Set; +} + +export class FillSubstanceData { + static readonly type = '[SubstanceData] fill data with payload'; + + constructor(public substanceData: SubstanceData[]) {} +} + +export class AddSubstanceData { + static readonly type = '[SubstanceData] add data'; + + constructor(public substanceData: SubstanceData) {} +} + +export class RemoveSubstanceData { + static readonly type = '[SubstanceData] remove data'; + + constructor(public dataToRemove: SubstanceData) {} +} + +export class ModifySubstanceData { + static readonly type = '[SubstanceData] modify data'; + + constructor(public origData: SubstanceData, public modifiedData: SubstanceData) {} +} + +export class RearrangeSubstanceData { + static readonly type = '[SubstanceData] rearrange data'; + + constructor(public event: CdkDragDrop | any) {} +} + +export class ClearAllSubstanceData { + static readonly type = '[SubstanceData] clear all substance data'; +} + +@State({ + name: 'substance_data', + defaults: { + substanceData: [], + providers: new Set(), + }, +}) +@Injectable() +export class SubstanceDataState { + private providerMapping!: ProviderMapping; + + constructor(private alertService: AlertService, private providerService: IProviderService) { + this.providerService.providerMappingsObservable.subscribe((providers) => (this.providerMapping = providers)); + } + + @Selector() + static viewSubstanceData(state: SubstanceDataStateModel): ViewSubstanceData[] { + const substanceData = state.substanceData; + const viewData = substanceData.map((value) => value.convertToViewSubstanceData()); + + // to prefill or fill up at least 5 substance data rows + for (let i = viewData.length; i < 5; i++) { + viewData.push(EMPTY_VIEW_SUBSTANCE_DATA); + } + + return viewData; + } + + @Action(FillSubstanceData) + fillSubstanceData(context: StateContext, action: FillSubstanceData): void { + const providers = new Set(); + const substanceData = action.substanceData.map((data) => new SubstanceData(data)); + + substanceData.forEach((data) => this.setProviders(providers, data)); + + context.setState({ + substanceData, + providers, + }); + } + + @Action(AddSubstanceData) + addSubstanceData(context: StateContext, action: AddSubstanceData): void { + const substanceState = context.getState().substanceData; + const providers = new Set(context.getState().providers); + const cas = this.modifiedOrOriginal(action.substanceData.cas); + if (cas && substanceState.some((s) => cas === this.modifiedOrOriginal(s.cas))) { + logger.warning('substance with same cas number already present:', cas); + this.alertService.error(translate('error.substanceWithCASExist')); + return; + } + + this.setProviders(providers, action.substanceData); + + context.setState( + patch({ + substanceData: append([action.substanceData]), + providers, + }), + ); + } + + @Action(RemoveSubstanceData) + removeSubstanceData(context: StateContext, action: RemoveSubstanceData): void { + const index = context.getState().substanceData.indexOf(action.dataToRemove); + context.setState( + patch({ + substanceData: removeItem(index), + }), + ); + } + + @Action(ModifySubstanceData) + modifySubstanceData(context: StateContext, action: ModifySubstanceData): void { + const index = context.getState().substanceData.indexOf(action.origData); + action.modifiedData.checked = true; + context.setState( + patch({ + substanceData: updateItem(index, action.modifiedData), + }), + ); + } + + @Action(RearrangeSubstanceData) + rearrangeSubstanceData(context: StateContext, action: RearrangeSubstanceData): void { + const state = context.getState().substanceData.slice(); + moveItemInArray(state, action.event.previousIndex, action.event.currentIndex); + context.patchState({ + substanceData: state, + }); + } + + @Action(ClearAllSubstanceData) + clearAllSubstanceData(context: StateContext): void { + context.setState({ + substanceData: [], + providers: new Set(), + }); + } + + private modifiedOrOriginal(obj: Data): T { + return obj.modifiedData ?? obj.originalData; + } + + private setProviders(providers: Set, data: SubstanceData): void { + const provider = this.providerMapping.get(data.source.provider); + if (provider && provider.identifier !== 'custom') { + providers.add(provider.name); + } + } +} diff --git a/frontend/src/app/@core/utils/action-newable.ts b/frontend/src/app/@core/utils/action-newable.ts new file mode 100644 index 000000000..5f780a094 --- /dev/null +++ b/frontend/src/app/@core/utils/action-newable.ts @@ -0,0 +1,7 @@ +/** + * Defines a constructor with an optional argument. + * + * @param R result + * @param T argument + */ +export type ActionNewable = new (args: T) => R; diff --git a/src/app/@core/utils/compare.ts b/frontend/src/app/@core/utils/compare.ts similarity index 96% rename from src/app/@core/utils/compare.ts rename to frontend/src/app/@core/utils/compare.ts index 12737998d..b48fb0a58 100644 --- a/src/app/@core/utils/compare.ts +++ b/frontend/src/app/@core/utils/compare.ts @@ -1,6 +1,6 @@ // Comparison library inspired by https://stackoverflow.com/a/14853974/9737947 -export const compareArrays = (array1: Array, array2: Array) => { +export const compareArrays = (array1: Array, array2: Array): boolean => { // compare lengths - can save a lot of time if (array1.length !== array2.length) { return false; @@ -29,7 +29,7 @@ export const compareArrays = (array1: Array, array2: Array) => { return true; }; -export const compareObjects = (object1: any, object2: any) => { +export const compareObjects = (object1: any, object2: any): boolean => { //For the first loop, we only check for types for (const propName in object1) { if ({}.hasOwnProperty.call(object1, propName)) { @@ -93,8 +93,14 @@ export const compareObjects = (object1: any, object2: any) => { return true; }; +const assert = (truthy: boolean, msg: string): void => { + if (!truthy) { + throw new Error(msg); + } +}; + // TODO move to tests -export const testComparer = () => { +export const testComparer = (): void => { assert(compareArrays([], []), 'array empty'); assert(!compareArrays([1], []), 'array number first'); @@ -142,9 +148,3 @@ export const testComparer = () => { assert(compareObjects({}, {}), 'object empty'); }; - -const assert = (truthy: boolean, msg: string) => { - if (!truthy) { - throw new Error(msg); - } -}; diff --git a/frontend/src/app/@core/utils/forms.helper.ts b/frontend/src/app/@core/utils/forms.helper.ts new file mode 100644 index 000000000..05aef66ed --- /dev/null +++ b/frontend/src/app/@core/utils/forms.helper.ts @@ -0,0 +1,21 @@ +import { FormBuilder, FormGroup } from '@angular/forms'; +import { Observable } from 'rxjs'; +import { Store } from '@ngxs/store'; + +import { ElementModel, StringListStateModel } from '../interfaces/string-list-state-model.interface'; + +export const initForm = (value: string, formBuilder: FormBuilder): FormGroup => + formBuilder.group({ + value, + }); + +export const elementsToFormGroup = (formBuilder: FormBuilder, elements?: ElementModel[]): FormGroup => + formBuilder.group({ + elements: formBuilder.array(elements?.map((element) => initForm(element.value, formBuilder)) ?? []), + }); + +export const stateToElements = (store: Store, stateName: string): Observable => + store.selectOnce( + (state) => + Object.entries(state).find((entry) => entry[0] === stateName)?.[1].form.model?.elements, + ); diff --git a/src/app/@core/utils/logger.ts b/frontend/src/app/@core/utils/logger.ts similarity index 97% rename from src/app/@core/utils/logger.ts rename to frontend/src/app/@core/utils/logger.ts index 3c1d345d8..3fe45176b 100644 --- a/src/app/@core/utils/logger.ts +++ b/frontend/src/app/@core/utils/logger.ts @@ -8,7 +8,7 @@ export enum LogLevel { ERROR = 'ERROR', } -const logImplWeb = (level: LogLevel, path: string, ...messages: any[]) => { +const logImplWeb = (level: LogLevel, path: string, ...messages: any[]): void => { let fn; switch (level) { case LogLevel.TRACE: @@ -43,6 +43,7 @@ const logImplTauri = (() => { }); return (level: LogLevel, path: string, ...messages: any[]) => { + logImplWeb(level, path, ...messages); invoke('plugin:cabr2_logger|log', { level, path, diff --git a/src/app/app.component.html b/frontend/src/app/app.component.html similarity index 93% rename from src/app/app.component.html rename to frontend/src/app/app.component.html index d105cd29c..1d9ff07c5 100644 --- a/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -52,7 +52,7 @@ } - +
{{ name }} {{ version }}
diff --git a/src/app/app.component.scss b/frontend/src/app/app.component.scss similarity index 100% rename from src/app/app.component.scss rename to frontend/src/app/app.component.scss diff --git a/src/app/app.component.spec.ts b/frontend/src/app/app.component.spec.ts similarity index 100% rename from src/app/app.component.spec.ts rename to frontend/src/app/app.component.spec.ts diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts new file mode 100644 index 000000000..0cb1736b6 --- /dev/null +++ b/frontend/src/app/app.component.ts @@ -0,0 +1,87 @@ +import { Actions, ofActionDispatched, Select, Store } from '@ngxs/store'; +import { Component, HostBinding, Inject, OnDestroy, OnInit, Renderer2 } from '@angular/core'; +import { first, Observable, Subscription } from 'rxjs'; +import { DOCUMENT } from '@angular/common'; +import { MatDialog } from '@angular/material/dialog'; + +import { AcceptConsent, LoadConfig, ToggleDarkTheme } from './@core/states/config.state'; +import { Config } from './@core/interfaces/config.interface'; +import { ConsentComponent } from './components/consent/consent.component'; +import { LoadGHSSymbols } from './@core/states/ghs-symbols.state'; +import packageInfo from '../../package.json'; +import { TranslocoService } from '@ngneat/transloco'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'], +}) +export class AppComponent implements OnInit, OnDestroy { + @Select((store: any) => store.config) config$!: Observable; + + name = packageInfo.name; + + version = packageInfo.version; + + darkTheme = false; + + dispatchSubscription!: Subscription; + + constructor( + @Inject(DOCUMENT) private document: Document, + private renderer: Renderer2, + private dialog: MatDialog, + + private translocoService: TranslocoService, + private store: Store, + private actions$: Actions, + ) {} + + @HostBinding('class') + get themeMode(): string { + return this.darkTheme ? 'theme-dark' : 'theme-light'; + } + + ngOnInit(): void { + this.store + .dispatch([new LoadConfig(), new LoadGHSSymbols()]) + .pipe(first()) + .subscribe(() => { + this.store + .select((store: any) => store.config) + .subscribe((config: Config) => { + this.switchMode(config.darkTheme); + this.translocoService.setActiveLang(config.language); + if (!config.acceptedConsent) { + this.dialog + .open(ConsentComponent, { + data: { + duration: 5, + }, + disableClose: true, + }) + .afterClosed() + .subscribe(() => { + this.store.dispatch(new AcceptConsent()); + }); + } + }); + }); + + this.dispatchSubscription = this.actions$ + .pipe(ofActionDispatched(ToggleDarkTheme)) + .subscribe((action: ToggleDarkTheme) => { + this.switchMode(action.darkTheme); + }); + } + + ngOnDestroy(): void { + this.dispatchSubscription.unsubscribe(); + } + + switchMode(isDarkMode: boolean): void { + this.darkTheme = isDarkMode; + const hostClass = isDarkMode ? 'theme-dark' : 'theme-light'; + this.renderer.setAttribute(this.document.body, 'class', hostClass); + } +} diff --git a/src/app/app.module.ts b/frontend/src/app/app.module.ts similarity index 84% rename from src/app/app.module.ts rename to frontend/src/app/app.module.ts index 6cd320fc6..2c7ff1144 100644 --- a/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -1,22 +1,26 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BrowserModule } from '@angular/platform-browser'; +import { HttpClientModule } from '@angular/common/http'; import { NgModule } from '@angular/core'; +import { NgxsModule as NgrxModule } from '@ngxs/store'; +import { NgxsFormPluginModule } from '@ngxs/form-plugin'; +import { NgxsStoragePluginModule } from '@ngxs/storage-plugin'; import { AlertModule } from './@core/modules/alert.module'; import { AppComponent } from './app.component'; import { BugReportButtonComponent } from './components/bug-report-button/bug-report-button.component'; +import { ConfigState } from './@core/states/config.state'; import { ConsentComponent } from './components/consent/consent.component'; import { EditSubstanceDataComponent } from './components/edit-substance-data/edit-substance-data.component'; import { ExportButtonsComponent } from './components/export-buttons/export-buttons.component'; -import { GlobalModel } from './@core/models/global.model'; import { HeaderComponent } from './components/header/header.component'; -import { HttpClientModule } from '@angular/common/http'; import { LoadingComponent } from './components/loading/loading.component'; import { ManualComponent } from './components/manual/manual.component'; import { MatModules } from './@core/modules/mat.module'; import { ModifiableStringListComponent } from './components/modifiable-string-list/modifiable-string-list.component'; import { NavbarMenuComponent } from './components/navbar-menu/navbar-menu.component'; +import { ngxsConfig } from './ngxs.config'; import { OnePagerComponent } from './onepager/onepager.component'; import { PreviewComponent } from './components/preview/preview.component'; import { ProgressDialogComponent } from './components/progress-dialog/progress-dialog.component'; @@ -28,7 +32,9 @@ import { SecurityThingsComponent } from './components/security-things/security-t import { SelectedSearchComponent } from './components/search/selected-search/selected-search.component'; import { ServiceModule } from './@core/services/service.module'; import { SettingsComponent } from './components/settings/settings.component'; +import States from './@core/states/@states'; import { SubMolecularFormula } from './@core/pipes/molecularformula.pipe'; +import { TextAreaFieldComponent } from './components/modifiable-string-list/text-area-field/text-area-field.component'; import { TranslocoRootModule } from './transloco-root.module'; import { YesNoDialogComponent } from './components/yes-no-dialog/yes-no-dialog.component'; @@ -38,6 +44,7 @@ import { YesNoDialogComponent } from './components/yes-no-dialog/yes-no-dialog.c HeaderComponent, SearchComponent, ModifiableStringListComponent, + TextAreaFieldComponent, PreviewComponent, SelectedSearchComponent, SearchDialogComponent, @@ -67,8 +74,10 @@ import { YesNoDialogComponent } from './components/yes-no-dialog/yes-no-dialog.c ServiceModule, HttpClientModule, TranslocoRootModule, + NgrxModule.forRoot(States, ngxsConfig), + NgxsFormPluginModule.forRoot(), + NgxsStoragePluginModule.forRoot({ key: ConfigState }), ], - providers: [GlobalModel], bootstrap: [AppComponent], }) export class AppModule {} diff --git a/src/app/components/alertsnackbar/alertsnackbar.component.spec.ts b/frontend/src/app/components/alertsnackbar/alertsnackbar.component.spec.ts similarity index 100% rename from src/app/components/alertsnackbar/alertsnackbar.component.spec.ts rename to frontend/src/app/components/alertsnackbar/alertsnackbar.component.spec.ts diff --git a/src/app/components/alertsnackbar/alertsnackbar.component.ts b/frontend/src/app/components/alertsnackbar/alertsnackbar.component.ts similarity index 83% rename from src/app/components/alertsnackbar/alertsnackbar.component.ts rename to frontend/src/app/components/alertsnackbar/alertsnackbar.component.ts index 1b546197e..5998f5bf0 100644 --- a/src/app/components/alertsnackbar/alertsnackbar.component.ts +++ b/frontend/src/app/components/alertsnackbar/alertsnackbar.component.ts @@ -1,7 +1,7 @@ -import { Alert, AlertType } from '../../@core/services/alertsnackbar/altersnackbar.model'; +import { Alert, AlertType } from '../../@core/services/alertsnackbar/alertsnackbar.model'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatSnackBar, MatSnackBarRef, TextOnlySnackBar } from '@angular/material/snack-bar'; -import { AlertService } from '../../@core/services/alertsnackbar/altersnackbar.service'; +import { AlertService } from '../../@core/services/alertsnackbar/alertsnackbar.service'; import Logger from '../../@core/utils/logger'; import { Subscription } from 'rxjs'; @@ -20,10 +20,10 @@ export class AlertsnackbarComponent implements OnInit, OnDestroy { constructor(private alertService: AlertService, private snackBar: MatSnackBar) {} - ngOnInit() { + ngOnInit(): void { // subscribe to new alert notifications - this.alertSubscription = this.alertService.onAlert().subscribe( - (alert) => { + this.alertSubscription = this.alertService.onAlert().subscribe({ + next: (alert) => { // clear alerts when an empty alert is received if (!alert.message) { throw Error('Empty alert message'); @@ -35,15 +35,15 @@ export class AlertsnackbarComponent implements OnInit, OnDestroy { this.showSnackbar(); } }, - (err) => logger.error('creating snackbar failed:', err), - ); + error: (err) => logger.error('creating snackbar failed:', err), + }); } - ngOnDestroy() { + ngOnDestroy(): void { this.alertSubscription.unsubscribe(); } - cssClass(alert: Alert) { + cssClass(alert: Alert): string { const alertTypeClass = { [AlertType.Success]: 'alert-success', [AlertType.Error]: 'alert-error', @@ -70,12 +70,12 @@ export class AlertsnackbarComponent implements OnInit, OnDestroy { private showSnackbar(): void { this.openSnackBar() ?.afterDismissed() - .subscribe( - () => { + .subscribe({ + next: () => { this.snackBarVisible = false; this.showSnackbar(); }, - (err) => logger.error('snackbar dismissing failed:', err), - ); + error: (err) => logger.error('snackbar dismissing failed:', err), + }); } } diff --git a/src/app/components/bug-report-button/bug-report-button.component.html b/frontend/src/app/components/bug-report-button/bug-report-button.component.html similarity index 100% rename from src/app/components/bug-report-button/bug-report-button.component.html rename to frontend/src/app/components/bug-report-button/bug-report-button.component.html diff --git a/src/app/components/bug-report-button/bug-report-button.component.scss b/frontend/src/app/components/bug-report-button/bug-report-button.component.scss similarity index 88% rename from src/app/components/bug-report-button/bug-report-button.component.scss rename to frontend/src/app/components/bug-report-button/bug-report-button.component.scss index 0c4c71181..42c35f459 100644 --- a/src/app/components/bug-report-button/bug-report-button.component.scss +++ b/frontend/src/app/components/bug-report-button/bug-report-button.component.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; .icon { margin-bottom: 8px; diff --git a/src/app/components/bug-report-button/bug-report-button.component.spec.ts b/frontend/src/app/components/bug-report-button/bug-report-button.component.spec.ts similarity index 100% rename from src/app/components/bug-report-button/bug-report-button.component.spec.ts rename to frontend/src/app/components/bug-report-button/bug-report-button.component.spec.ts diff --git a/src/app/components/bug-report-button/bug-report-button.component.ts b/frontend/src/app/components/bug-report-button/bug-report-button.component.ts similarity index 62% rename from src/app/components/bug-report-button/bug-report-button.component.ts rename to frontend/src/app/components/bug-report-button/bug-report-button.component.ts index e0f13ce3d..b00565c7e 100644 --- a/src/app/components/bug-report-button/bug-report-button.component.ts +++ b/frontend/src/app/components/bug-report-button/bug-report-button.component.ts @@ -1,4 +1,5 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; +import { first } from 'rxjs'; import { MatDialog } from '@angular/material/dialog'; import { IConfigService } from 'src/app/@core/services/config/config.interface'; @@ -9,13 +10,18 @@ import { ReportBugComponent } from '../report-bug/report-bug.component'; templateUrl: './bug-report-button.component.html', styleUrls: ['./bug-report-button.component.scss'], }) -export class BugReportButtonComponent { +export class BugReportButtonComponent implements OnInit { PROGRAM_VERSION!: string; - constructor(private dialog: MatDialog, private config: IConfigService) { - config.getProgramVersion().subscribe((version) => { - this.PROGRAM_VERSION = version; - }); + constructor(private dialog: MatDialog, private config: IConfigService) {} + + ngOnInit(): void { + this.config + .getProgramVersion() + .pipe(first()) + .subscribe((version) => { + this.PROGRAM_VERSION = version; + }); } openMail(): void { diff --git a/src/app/components/consent/consent.component.html b/frontend/src/app/components/consent/consent.component.html similarity index 100% rename from src/app/components/consent/consent.component.html rename to frontend/src/app/components/consent/consent.component.html diff --git a/src/app/components/consent/consent.component.scss b/frontend/src/app/components/consent/consent.component.scss similarity index 100% rename from src/app/components/consent/consent.component.scss rename to frontend/src/app/components/consent/consent.component.scss diff --git a/src/app/components/consent/consent.component.spec.ts b/frontend/src/app/components/consent/consent.component.spec.ts similarity index 100% rename from src/app/components/consent/consent.component.spec.ts rename to frontend/src/app/components/consent/consent.component.spec.ts diff --git a/src/app/components/consent/consent.component.ts b/frontend/src/app/components/consent/consent.component.ts similarity index 100% rename from src/app/components/consent/consent.component.ts rename to frontend/src/app/components/consent/consent.component.ts diff --git a/src/app/components/edit-substance-data/edit-substance-data.component.html b/frontend/src/app/components/edit-substance-data/edit-substance-data.component.html similarity index 97% rename from src/app/components/edit-substance-data/edit-substance-data.component.html rename to frontend/src/app/components/edit-substance-data/edit-substance-data.component.html index 888f57769..3642a879a 100644 --- a/src/app/components/edit-substance-data/edit-substance-data.component.html +++ b/frontend/src/app/components/edit-substance-data/edit-substance-data.component.html @@ -102,7 +102,10 @@ {{ t('substance.unit') }} - + {{ localizeUnit(option) }} @@ -235,10 +238,10 @@
{{ key }}
diff --git a/src/app/components/edit-substance-data/edit-substance-data.component.scss b/frontend/src/app/components/edit-substance-data/edit-substance-data.component.scss similarity index 100% rename from src/app/components/edit-substance-data/edit-substance-data.component.scss rename to frontend/src/app/components/edit-substance-data/edit-substance-data.component.scss diff --git a/src/app/components/edit-substance-data/edit-substance-data.component.spec.ts b/frontend/src/app/components/edit-substance-data/edit-substance-data.component.spec.ts similarity index 100% rename from src/app/components/edit-substance-data/edit-substance-data.component.spec.ts rename to frontend/src/app/components/edit-substance-data/edit-substance-data.component.spec.ts diff --git a/src/app/components/edit-substance-data/edit-substance-data.component.ts b/frontend/src/app/components/edit-substance-data/edit-substance-data.component.ts similarity index 95% rename from src/app/components/edit-substance-data/edit-substance-data.component.ts rename to frontend/src/app/components/edit-substance-data/edit-substance-data.component.ts index 2e00e4ab8..514746298 100644 --- a/src/app/components/edit-substance-data/edit-substance-data.component.ts +++ b/frontend/src/app/components/edit-substance-data/edit-substance-data.component.ts @@ -1,7 +1,8 @@ import { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; -import { Subscription } from 'rxjs'; +import { Observable, Subscription } from 'rxjs'; +import { Select } from '@ngxs/store'; import { translate } from '@ngneat/transloco'; import { @@ -13,8 +14,8 @@ import { unitGroups, UnitType, } from '../../@core/models/substances.model'; +import { GHSSymbolMap, SymbolKeys } from 'src/app/@core/states/ghs-symbols.state'; import { compareArrays } from '../../@core/utils/compare'; -import { GlobalModel } from '../../@core/models/global.model'; import Logger from '../../@core/utils/logger'; import { YesNoDialogComponent } from '../yes-no-dialog/yes-no-dialog.component'; @@ -26,7 +27,11 @@ const logger = new Logger('edit-substance-data'); styleUrls: ['./edit-substance-data.component.scss'], }) export class EditSubstanceDataComponent implements OnInit, OnDestroy { - form: FormGroup; + @Select((state: any) => state.ghs_symbols.symbols) symbols$!: Observable; + + @Select((state: any) => state.ghs_symbols.symbolKeys) symbolKeys$!: Observable; + + form!: FormGroup; addHPhraseHover = false; @@ -42,15 +47,30 @@ export class EditSubstanceDataComponent implements OnInit, OnDestroy { constructor( public dialogRef: MatDialogRef, - public globals: GlobalModel, @Inject(MAT_DIALOG_DATA) public data: SubstanceData, private formBuilder: FormBuilder, private dialog: MatDialog, - ) { - this.form = this.initControls(); + ) {} + + get hPhrases(): FormArray { + return this.form?.get('hPhrases') as FormArray; + } + + get pPhrases(): FormArray { + return this.form?.get('pPhrases') as FormArray; + } + + get symbols(): FormArray { + return this.form?.get('symbols') as FormArray; + } + + get amount(): FormGroup { + return this.form?.get('amount') as FormGroup; } ngOnInit(): void { + this.form = this.initControls(); + this.customSubscription = this.amount.get('unit')?.valueChanges.subscribe((value: UnitType) => { this.customUnitVisible = value === UnitType.CUSTOM; }); @@ -98,22 +118,6 @@ export class EditSubstanceDataComponent implements OnInit, OnDestroy { return group; } - get hPhrases(): FormArray { - return this.form?.get('hPhrases') as FormArray; - } - - get pPhrases(): FormArray { - return this.form?.get('pPhrases') as FormArray; - } - - get symbols(): FormArray { - return this.form?.get('symbols') as FormArray; - } - - get amount(): FormGroup { - return this.form?.get('amount') as FormGroup; - } - initHPhrases(value: [string, string]): FormGroup { return this.formBuilder.group({ hNumber: [value[0], Validators.pattern('^(H\\d{3}\\w?\\+?)+$')], @@ -169,9 +173,10 @@ export class EditSubstanceDataComponent implements OnInit, OnDestroy { localizeUnit(unit: UnitType): string { const name = getViewName({ type: unit }); - const localizedName = translate('units')[name]; + const path = `units.${name}`; + const localizedName: string = translate(path); - if (localizedName) { + if (localizedName !== path) { return localizedName; } else { return name; @@ -188,7 +193,7 @@ export class EditSubstanceDataComponent implements OnInit, OnDestroy { needed: number, current: number, newCallback: () => AbstractControl, - ) => { + ): void => { const diff = needed - current; if (diff > 0) { for (let i = diff; i > 0; i--) { diff --git a/src/app/components/export-buttons/export-buttons.component.html b/frontend/src/app/components/export-buttons/export-buttons.component.html similarity index 100% rename from src/app/components/export-buttons/export-buttons.component.html rename to frontend/src/app/components/export-buttons/export-buttons.component.html diff --git a/src/app/components/export-buttons/export-buttons.component.scss b/frontend/src/app/components/export-buttons/export-buttons.component.scss similarity index 100% rename from src/app/components/export-buttons/export-buttons.component.scss rename to frontend/src/app/components/export-buttons/export-buttons.component.scss diff --git a/src/app/components/export-buttons/export-buttons.component.spec.ts b/frontend/src/app/components/export-buttons/export-buttons.component.spec.ts similarity index 100% rename from src/app/components/export-buttons/export-buttons.component.spec.ts rename to frontend/src/app/components/export-buttons/export-buttons.component.spec.ts diff --git a/src/app/components/export-buttons/export-buttons.component.ts b/frontend/src/app/components/export-buttons/export-buttons.component.ts similarity index 100% rename from src/app/components/export-buttons/export-buttons.component.ts rename to frontend/src/app/components/export-buttons/export-buttons.component.ts diff --git a/src/app/components/header/header.component.html b/frontend/src/app/components/header/header.component.html similarity index 59% rename from src/app/components/header/header.component.html rename to frontend/src/app/components/header/header.component.html index 07745d939..067491744 100644 --- a/src/app/components/header/header.component.html +++ b/frontend/src/app/components/header/header.component.html @@ -1,32 +1,32 @@ - + {{ t('docTitle') }} - + {{ t('organisation') }} - + {{ t('labCourse') }} - + {{ t('name') }} - + {{ t('place') }} - + {{ t('assistant') }} - + {{ t('preparation') }} - + diff --git a/src/app/components/header/header.component.scss b/frontend/src/app/components/header/header.component.scss similarity index 100% rename from src/app/components/header/header.component.scss rename to frontend/src/app/components/header/header.component.scss diff --git a/src/app/components/header/header.component.spec.ts b/frontend/src/app/components/header/header.component.spec.ts similarity index 100% rename from src/app/components/header/header.component.spec.ts rename to frontend/src/app/components/header/header.component.spec.ts diff --git a/frontend/src/app/components/header/header.component.ts b/frontend/src/app/components/header/header.component.ts new file mode 100644 index 000000000..38f5db146 --- /dev/null +++ b/frontend/src/app/components/header/header.component.ts @@ -0,0 +1,24 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup } from '@angular/forms'; + +import { EMPTY_HEADER } from 'src/app/@core/models/header.model'; +import { Header } from '../../@core/interfaces/DocTemplate'; + +const form = EMPTY_HEADER; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.scss'], +}) +export class HeaderComponent implements OnInit { + header!: Header; + + public formGroup!: FormGroup; + + constructor(private formBuilder: FormBuilder) {} + + ngOnInit(): void { + this.formGroup = this.formBuilder.group(form); + } +} diff --git a/src/app/components/loading/loading.component.scss b/frontend/src/app/components/loading/loading.component.scss similarity index 100% rename from src/app/components/loading/loading.component.scss rename to frontend/src/app/components/loading/loading.component.scss diff --git a/src/app/components/loading/loading.component.ts b/frontend/src/app/components/loading/loading.component.ts similarity index 57% rename from src/app/components/loading/loading.component.ts rename to frontend/src/app/components/loading/loading.component.ts index 5640a937d..759eefbd7 100644 --- a/src/app/components/loading/loading.component.ts +++ b/frontend/src/app/components/loading/loading.component.ts @@ -1,15 +1,11 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, Input } from '@angular/core'; @Component({ selector: 'app-loading', template: '
Loading
', styleUrls: ['./loading.component.scss'], }) -export class LoadingComponent implements OnInit { +export class LoadingComponent { @Input() width!: string; - - constructor() {} - - ngOnInit(): void {} } diff --git a/src/app/components/manual/manual.component.html b/frontend/src/app/components/manual/manual.component.html similarity index 100% rename from src/app/components/manual/manual.component.html rename to frontend/src/app/components/manual/manual.component.html diff --git a/src/app/components/manual/manual.component.scss b/frontend/src/app/components/manual/manual.component.scss similarity index 100% rename from src/app/components/manual/manual.component.scss rename to frontend/src/app/components/manual/manual.component.scss diff --git a/src/app/components/manual/manual.component.spec.ts b/frontend/src/app/components/manual/manual.component.spec.ts similarity index 100% rename from src/app/components/manual/manual.component.spec.ts rename to frontend/src/app/components/manual/manual.component.spec.ts diff --git a/src/app/components/manual/manual.component.ts b/frontend/src/app/components/manual/manual.component.ts similarity index 71% rename from src/app/components/manual/manual.component.ts rename to frontend/src/app/components/manual/manual.component.ts index 9e706ee1b..0892d6f92 100644 --- a/src/app/components/manual/manual.component.ts +++ b/frontend/src/app/components/manual/manual.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core'; +import { Component, Inject, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; @Component({ @@ -7,11 +7,9 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; styleUrls: ['./manual.component.scss'], encapsulation: ViewEncapsulation.None, }) -export class ManualComponent implements OnInit { +export class ManualComponent { constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: { content: string }, ) {} - - ngOnInit(): void {} } diff --git a/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.html b/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.html new file mode 100644 index 000000000..5cc87d343 --- /dev/null +++ b/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.html @@ -0,0 +1,30 @@ + + +

{{ title }}

+
+
    +
  • + + + + + +
  • +
+
+ +
+
diff --git a/src/app/components/modifiable-string-list/modifiable-string-list.component.scss b/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.scss similarity index 86% rename from src/app/components/modifiable-string-list/modifiable-string-list.component.scss rename to frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.scss index d6dcd3db1..118ae40e3 100644 --- a/src/app/components/modifiable-string-list/modifiable-string-list.component.scss +++ b/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.scss @@ -1,18 +1,16 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; ul { margin-left: 20px; padding: 0; } -.width-100 { - width: 100%; -} - .cdk-drag-handle { &:hover { cursor: grab; } + + font-size: 1.1em !important; } .cdk-drag-preview { diff --git a/src/app/components/modifiable-string-list/modifiable-string-list.component.spec.ts b/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.spec.ts similarity index 100% rename from src/app/components/modifiable-string-list/modifiable-string-list.component.spec.ts rename to frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.spec.ts diff --git a/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.ts b/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.ts new file mode 100644 index 000000000..f88883703 --- /dev/null +++ b/frontend/src/app/components/modifiable-string-list/modifiable-string-list.component.ts @@ -0,0 +1,109 @@ +import { Actions, ofActionDispatched, Store } from '@ngxs/store'; +import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; +import { FormArray, FormBuilder, FormGroup } from '@angular/forms'; +import { Observable, Subscription } from 'rxjs'; +import { CdkDragDrop } from '@angular/cdk/drag-drop'; + +import { elementsToFormGroup, initForm, stateToElements } from 'src/app/@core/utils/forms.helper'; +import { + FillSentence as FillDisposalSentence, + ResetSentences as ResetDisposalSentence, +} from '../../@core/actions/disposal.actions'; +import { + FillSentence as FillHumanAndEnvironmentDangerSentence, + ResetSentences as ResetHumanAndEnvironmentDangerSentences, +} from '../../@core/actions/human-and-environment-danger.actions'; +import { + FillSentence as FillInCaseOfDangerSentence, + ResetSentences as ResetInCaseOfDangerSentences, +} from '../../@core/actions/in-case-of-danger.actions'; +import { + FillSentence as FillRulesOfConductSentence, + ResetSentences as ResetRulesOfConductSentences, +} from '../../@core/actions/rules-of-conduct-acitons'; + +@Component({ + selector: 'app-modifiable-string-list', + templateUrl: './modifiable-string-list.component.html', + styleUrls: ['./modifiable-string-list.component.scss'], +}) +export class ModifiableStringListComponent implements OnInit, OnDestroy { + @Input() + ngxsIdentifier!: string; + + @Input() + title!: string; + + @Input() + formGroup$!: Observable; + + @Output() + addEmpty = new EventEmitter(); + + @Output() + remove = new EventEmitter(); + + @Output() + rearrange = new EventEmitter>(); + + formGroup!: FormGroup; + + addHover = false; + + private subscriptions: Subscription[] = []; + + constructor(private formBuilder: FormBuilder, private actions$: Actions, private store: Store) {} + + get controlElements(): FormArray { + return this.formGroup.get('elements') as FormArray; + } + + ngOnInit(): void { + this.subscriptions.push( + this.formGroup$.subscribe((formGroup) => (this.formGroup = formGroup)), + this.actions$ + .pipe( + ofActionDispatched( + ResetHumanAndEnvironmentDangerSentences, + ResetRulesOfConductSentences, + ResetInCaseOfDangerSentences, + ResetDisposalSentence, + + FillHumanAndEnvironmentDangerSentence, + FillRulesOfConductSentence, + FillInCaseOfDangerSentence, + FillDisposalSentence, + ), + ) + .subscribe(() => { + this.initFormGroup(this.ngxsIdentifier); + }), + ); + } + + ngOnDestroy(): void { + this.subscriptions.forEach((sub) => sub.unsubscribe()); + } + + addElement(): void { + // this is needed to keep form and state in sync + this.controlElements.push(initForm('', this.formBuilder)); + this.addEmpty.emit(); + } + + removeElement(index: number): void { + // this is needed to keep form and state in sync + this.controlElements.removeAt(index); + this.remove.emit(index); + } + + drop(event: CdkDragDrop): void { + this.rearrange.emit(event); + } + + initFormGroup(identifier: string): void { + stateToElements(this.store, identifier).subscribe((elements) => { + this.formGroup = elementsToFormGroup(this.formBuilder, elements); + }); + } +} diff --git a/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.html b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.html new file mode 100644 index 000000000..f68879fc5 --- /dev/null +++ b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.html @@ -0,0 +1,26 @@ + + + + + + + diff --git a/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.scss b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.scss new file mode 100644 index 000000000..4fc855293 --- /dev/null +++ b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.scss @@ -0,0 +1,3 @@ +.width-100 { + width: 100%; +} diff --git a/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.spec.ts b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.spec.ts new file mode 100644 index 000000000..f5918e4fc --- /dev/null +++ b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.spec.ts @@ -0,0 +1,24 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TextAreaFieldComponent } from './text-area-field.component'; + +describe('TextAreaFieldComponent', () => { + let component: TextAreaFieldComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [TextAreaFieldComponent], + }).compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TextAreaFieldComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.ts b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.ts new file mode 100644 index 000000000..e4ec9a23b --- /dev/null +++ b/frontend/src/app/components/modifiable-string-list/text-area-field/text-area-field.component.ts @@ -0,0 +1,21 @@ +import { AbstractControl, FormControl } from '@angular/forms'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; + +@Component({ + selector: 'app-text-area-field', + templateUrl: './text-area-field.component.html', + styleUrls: ['./text-area-field.component.scss'], +}) +export class TextAreaFieldComponent { + @Input() + abstractControl!: AbstractControl; + + @Output() + removeEmitter = new EventEmitter(); + + hover = false; + + get formControl(): FormControl { + return this.abstractControl.get('value') as FormControl; + } +} diff --git a/src/app/components/navbar-menu/navbar-menu.component.html b/frontend/src/app/components/navbar-menu/navbar-menu.component.html similarity index 100% rename from src/app/components/navbar-menu/navbar-menu.component.html rename to frontend/src/app/components/navbar-menu/navbar-menu.component.html diff --git a/src/app/components/navbar-menu/navbar-menu.component.scss b/frontend/src/app/components/navbar-menu/navbar-menu.component.scss similarity index 89% rename from src/app/components/navbar-menu/navbar-menu.component.scss rename to frontend/src/app/components/navbar-menu/navbar-menu.component.scss index 6c861af44..2d1fc7fe1 100644 --- a/src/app/components/navbar-menu/navbar-menu.component.scss +++ b/frontend/src/app/components/navbar-menu/navbar-menu.component.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; .hamburger { margin-top: 8px; diff --git a/src/app/components/navbar-menu/navbar-menu.component.spec.ts b/frontend/src/app/components/navbar-menu/navbar-menu.component.spec.ts similarity index 100% rename from src/app/components/navbar-menu/navbar-menu.component.spec.ts rename to frontend/src/app/components/navbar-menu/navbar-menu.component.spec.ts diff --git a/src/app/components/navbar-menu/navbar-menu.component.ts b/frontend/src/app/components/navbar-menu/navbar-menu.component.ts similarity index 54% rename from src/app/components/navbar-menu/navbar-menu.component.ts rename to frontend/src/app/components/navbar-menu/navbar-menu.component.ts index 513db44f7..8650ba954 100644 --- a/src/app/components/navbar-menu/navbar-menu.component.ts +++ b/frontend/src/app/components/navbar-menu/navbar-menu.component.ts @@ -1,9 +1,15 @@ -import { Component, EventEmitter, OnInit, Output } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; +import { Store } from '@ngxs/store'; +import { ClearAllSubstanceData } from 'src/app/@core/states/substance-data.state'; import DocumentService from 'src/app/@core/services/document/document.service'; -import { GlobalModel } from 'src/app/@core/models/global.model'; import { INativeService } from 'src/app/@core/services/native/native.interface'; +import { ResetSentences as ResetDisposalSentence } from 'src/app/@core/actions/disposal.actions'; +import { ResetHeader } from 'src/app/@core/states/header.state'; +import { ResetSentences as ResetHumanAndEnvironmentDangerSentences } from 'src/app/@core/actions/human-and-environment-danger.actions'; +import { ResetSentences as ResetInCaseOfDangerSentences } from 'src/app/@core/actions/in-case-of-danger.actions'; +import { ResetSentences as ResetRulesOfConductSentences } from 'src/app/@core/actions/rules-of-conduct-acitons'; import { SettingsComponent } from '../settings/settings.component'; import TEMPLATES from '../../../assets/docsTemplate.json'; @@ -15,14 +21,11 @@ const DOCS_TEMPLATE = TEMPLATES.docsTemplate; styleUrls: ['./navbar-menu.component.scss'], }) export class NavbarMenuComponent implements OnInit { - @Output() - readonly darkModeSwitched = new EventEmitter(); - constructor( - public globals: GlobalModel, private nativeService: INativeService, private documentService: DocumentService, private dialog: MatDialog, + private store: Store, ) {} ngOnInit(): void { @@ -30,7 +33,14 @@ export class NavbarMenuComponent implements OnInit { } newDocument(): void { - this.globals.loadTemplate(DOCS_TEMPLATE); + this.store.dispatch([ + new ResetHeader(), + new ClearAllSubstanceData(), + new ResetHumanAndEnvironmentDangerSentences(), + new ResetRulesOfConductSentences(), + new ResetInCaseOfDangerSentences(), + new ResetDisposalSentence(), + ]); } loadFile(): void { @@ -46,11 +56,7 @@ export class NavbarMenuComponent implements OnInit { } openSettingsDialog(): void { - const dialogRef = this.dialog.open(SettingsComponent); - - dialogRef.componentInstance.darkModeSwitched.subscribe((checked: boolean) => { - this.darkModeSwitched.emit(checked); - }); + this.dialog.open(SettingsComponent); } openManualDialog(): void { diff --git a/src/app/components/preview/preview.component.html b/frontend/src/app/components/preview/preview.component.html similarity index 83% rename from src/app/components/preview/preview.component.html rename to frontend/src/app/components/preview/preview.component.html index 3051b67c2..760df2daa 100644 --- a/src/app/components/preview/preview.component.html +++ b/frontend/src/app/components/preview/preview.component.html @@ -7,33 +7,33 @@

- + - + - + @@ -51,7 +51,7 @@

-

+ @@ -74,12 +76,12 @@

@@ -87,7 +89,7 @@

@@ -102,7 +104,7 @@

{{ header.documentTitle }}{{ (header | async)?.documentTitle }}
{{ header.organisation }}{{ (header | async)?.organisation }}
{{ header.labCourse }}{{ (header | async)?.labCourse }}
{{ t('name') }}
- {{ header.name }} + {{ (header | async)?.name }}
{{ t('place') }}
- {{ header.place }} + {{ (header | async)?.place }}
{{ t('assistant') }}
- {{ header.assistant }} + {{ (header | async)?.assistant }}
{{ t('preparation') }}
- {{ header.preparation }} + {{ (header | async)?.preparation }}
{{ data.name }}
@@ -59,7 +59,9 @@

{{ data.molarMass }} {{ data.boilingPoint }}
{{ data.meltingPoint }}
- {{ key }} +
+ {{ key }} +
{{ data.signalWord }}
{{ getPhraseNumber(data.hPhrases).join(', ') }}
{{ getPhraseNumber(data.pPhrases).join(', ') }}
-
+
{{ phrase }}
-
+
{{ phrase }}
{{ t('sources') }}: - {{ getProviders() }} + {{ sources$ | async }}
{{ t('humanAndEnvironmentDanger') }} -
    +
    • {{ entry }}
    • @@ -112,7 +114,7 @@

{{ t('rulesOfConduct') }} -
    +
    • {{ entry }}
    • @@ -122,7 +124,7 @@

{{ t('inCaseOfDanger') }} -
    +
    • {{ entry }}
    • @@ -132,7 +134,7 @@

{{ t('disposal') }} -
    +
    • {{ entry }}
    • diff --git a/src/app/components/preview/preview.component.scss b/frontend/src/app/components/preview/preview.component.scss similarity index 91% rename from src/app/components/preview/preview.component.scss rename to frontend/src/app/components/preview/preview.component.scss index cd3e6439c..ebf9542a8 100644 --- a/src/app/components/preview/preview.component.scss +++ b/frontend/src/app/components/preview/preview.component.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; @import '../../../styles/color'; .flex { @@ -115,3 +115,10 @@ img { margin-left: 10px; } } + +.symbol-grid { + display: grid; + grid-template-columns: auto auto auto; + gap: 5px; + margin-bottom: 5px; +} diff --git a/src/app/components/preview/preview.component.spec.ts b/frontend/src/app/components/preview/preview.component.spec.ts similarity index 100% rename from src/app/components/preview/preview.component.spec.ts rename to frontend/src/app/components/preview/preview.component.spec.ts diff --git a/frontend/src/app/components/preview/preview.component.ts b/frontend/src/app/components/preview/preview.component.ts new file mode 100644 index 000000000..fdcddf8ad --- /dev/null +++ b/frontend/src/app/components/preview/preview.component.ts @@ -0,0 +1,84 @@ +import { Component, OnInit } from '@angular/core'; +import { map, Observable } from 'rxjs'; +import { Select, Store } from '@ngxs/store'; + +import { getViewValue, ViewSubstanceData } from '../../@core/models/substances.model'; +import { GHSSymbolMap } from 'src/app/@core/states/ghs-symbols.state'; +import { Header } from '../../@core/interfaces/DocTemplate'; +import { StringListStateModel } from 'src/app/@core/interfaces/string-list-state-model.interface'; +import { SubstanceDataState } from 'src/app/@core/states/substance-data.state'; + +@Component({ + selector: 'app-preview', + templateUrl: './preview.component.html', + styleUrls: ['./preview.component.scss'], +}) +export class PreviewComponent implements OnInit { + @Select((state: any) => state.ghs_symbols.symbols) symbols$!: Observable; + + @Select(SubstanceDataState.viewSubstanceData) substanceData$!: Observable; + + humanAndEnvironmentDanger$!: Observable; + + rulesOfConduct$!: Observable; + + inCaseOfDanger$!: Observable; + + disposal$!: Observable; + + header!: Observable
      ; + + sources$!: Observable; + + getViewValue = getViewValue; + + constructor(private store: Store) {} + + ngOnInit(): void { + this.header = this.store.select((state) => state.header.headerForm.model); + + this.sources$ = this.store + .select((state) => state.substance_data.providers) + .pipe(map((providers) => Array.from(providers.values()).join(', '))); + + this.humanAndEnvironmentDanger$ = this.store + .select((state) => state.human_and_environment_danger) + .pipe(map((state) => state.form.model?.elements.map((element) => element.value) ?? [])); + + this.rulesOfConduct$ = this.store + .select((state) => state.rules_of_conduct_state) + .pipe(map((state) => state.form.model?.elements.map((element) => element.value) ?? [])); + + this.inCaseOfDanger$ = this.store + .select((state) => state.in_case_of_danger) + .pipe(map((state) => state.form.model?.elements.map((element) => element.value) ?? [])); + + this.disposal$ = this.store + .select((state) => state.disposal) + .pipe(map((state) => state.form.model?.elements.map((element) => element.value) ?? [])); + } + + getPhraseNumber(phrases: [string, string][]): string[] { + return phrases.map((p) => p[0]); + } + + getHPhrases(): Observable> { + return this.substanceData$.pipe( + map((value) => { + const phraseSet = new Set(); + value?.flatMap((data) => data.hPhrases).forEach((phrase) => phraseSet.add(phrase.join(':\u00A0'))); + return phraseSet; + }), + ); + } + + getPPhrases(): Observable> { + return this.substanceData$.pipe( + map((value) => { + const phraseSet = new Set(); + value?.flatMap((data) => data.pPhrases).forEach((phrase) => phraseSet.add(phrase.join(':\u00A0'))); + return phraseSet; + }), + ); + } +} diff --git a/src/app/components/progress-dialog/progress-dialog.component.html b/frontend/src/app/components/progress-dialog/progress-dialog.component.html similarity index 79% rename from src/app/components/progress-dialog/progress-dialog.component.html rename to frontend/src/app/components/progress-dialog/progress-dialog.component.html index b793dd9ea..8e5fca63e 100644 --- a/src/app/components/progress-dialog/progress-dialog.component.html +++ b/frontend/src/app/components/progress-dialog/progress-dialog.component.html @@ -11,18 +11,16 @@

      {{ t('download') }} - - - - + + + -
      - +

      {{ t('errorMessage') }}

      - -
      +
      + diff --git a/src/app/components/progress-dialog/progress-dialog.component.scss b/frontend/src/app/components/progress-dialog/progress-dialog.component.scss similarity index 100% rename from src/app/components/progress-dialog/progress-dialog.component.scss rename to frontend/src/app/components/progress-dialog/progress-dialog.component.scss diff --git a/src/app/components/progress-dialog/progress-dialog.component.spec.ts b/frontend/src/app/components/progress-dialog/progress-dialog.component.spec.ts similarity index 100% rename from src/app/components/progress-dialog/progress-dialog.component.spec.ts rename to frontend/src/app/components/progress-dialog/progress-dialog.component.spec.ts diff --git a/src/app/components/progress-dialog/progress-dialog.component.ts b/frontend/src/app/components/progress-dialog/progress-dialog.component.ts similarity index 72% rename from src/app/components/progress-dialog/progress-dialog.component.ts rename to frontend/src/app/components/progress-dialog/progress-dialog.component.ts index 5ae20be03..b8ccf34c4 100644 --- a/src/app/components/progress-dialog/progress-dialog.component.ts +++ b/frontend/src/app/components/progress-dialog/progress-dialog.component.ts @@ -1,6 +1,6 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Observable, Subscriber } from 'rxjs'; +import { Observable, Subscriber, Subscription } from 'rxjs'; import { INativeService } from '../../@core/services/native/native.interface'; @@ -18,7 +18,7 @@ export interface ProgressDialogData { templateUrl: './progress-dialog.component.html', styleUrls: ['./progress-dialog.component.scss'], }) -export class ProgressDialogComponent implements OnInit { +export class ProgressDialogComponent implements OnInit, OnDestroy { pdfUrl?: string; finished = false; @@ -27,24 +27,14 @@ export class ProgressDialogComponent implements OnInit { closeEnabled = false; + subscription!: Subscription; + constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: ProgressDialogData, private nativeService: INativeService, - ) { - data.download.subscribe( - (res) => { - this.setPdfUrl(res.downloadUrl); - this.closeEnabled = true; - data.subscriber.next(); - }, - (err) => { - data.subscriber.error(err); - this.dialogRef.close(); - }, - ); - } + ) {} ngOnInit(): void { this.finished = false; @@ -57,15 +47,31 @@ export class ProgressDialogComponent implements OnInit { // set only if pdfUrl wasn't set this.error = !this.pdfUrl; }, 10000); + + this.subscription = this.data.download.subscribe({ + next: (res) => { + this.setPdfUrl(res.downloadUrl); + this.closeEnabled = true; + this.data.subscriber.next(); + }, + error: (err) => { + this.data.subscriber.error(err); + this.dialogRef.close(); + }, + }); + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); } - downloadPdf() { + downloadPdf(): void { // if this function can be called the url has been set // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this.nativeService.openUrl(this.pdfUrl!); } - setPdfUrl(url: string) { + setPdfUrl(url: string): void { this.pdfUrl = url; this.finished = true; this.error = false; diff --git a/src/app/components/report-bug/report-bug.component.html b/frontend/src/app/components/report-bug/report-bug.component.html similarity index 100% rename from src/app/components/report-bug/report-bug.component.html rename to frontend/src/app/components/report-bug/report-bug.component.html diff --git a/src/app/components/report-bug/report-bug.component.scss b/frontend/src/app/components/report-bug/report-bug.component.scss similarity index 81% rename from src/app/components/report-bug/report-bug.component.scss rename to frontend/src/app/components/report-bug/report-bug.component.scss index 05153f54c..0bd933c01 100644 --- a/src/app/components/report-bug/report-bug.component.scss +++ b/frontend/src/app/components/report-bug/report-bug.component.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; @import '../../../styles/color'; a { diff --git a/src/app/components/report-bug/report-bug.component.spec.ts b/frontend/src/app/components/report-bug/report-bug.component.spec.ts similarity index 100% rename from src/app/components/report-bug/report-bug.component.spec.ts rename to frontend/src/app/components/report-bug/report-bug.component.spec.ts diff --git a/src/app/components/report-bug/report-bug.component.ts b/frontend/src/app/components/report-bug/report-bug.component.ts similarity index 79% rename from src/app/components/report-bug/report-bug.component.ts rename to frontend/src/app/components/report-bug/report-bug.component.ts index c2ab326b7..7198ded62 100644 --- a/src/app/components/report-bug/report-bug.component.ts +++ b/frontend/src/app/components/report-bug/report-bug.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit } from '@angular/core'; +import { Component } from '@angular/core'; import { MatDialogRef } from '@angular/material/dialog'; import { INativeService } from '../../@core/services/native/native.interface'; @@ -8,11 +8,9 @@ import { INativeService } from '../../@core/services/native/native.interface'; templateUrl: './report-bug.component.html', styleUrls: ['./report-bug.component.scss'], }) -export class ReportBugComponent implements OnInit { +export class ReportBugComponent { constructor(private nativeService: INativeService, public dialogRef: MatDialogRef) {} - ngOnInit(): void {} - openMail(): void { this.nativeService.openUrl('mailto:cabr2.help@gmail.com'); } diff --git a/src/app/components/scrollbutton/scrollbutton.component.html b/frontend/src/app/components/scrollbutton/scrollbutton.component.html similarity index 100% rename from src/app/components/scrollbutton/scrollbutton.component.html rename to frontend/src/app/components/scrollbutton/scrollbutton.component.html diff --git a/src/app/components/scrollbutton/scrollbutton.component.scss b/frontend/src/app/components/scrollbutton/scrollbutton.component.scss similarity index 85% rename from src/app/components/scrollbutton/scrollbutton.component.scss rename to frontend/src/app/components/scrollbutton/scrollbutton.component.scss index 498c623ba..fce88b282 100644 --- a/src/app/components/scrollbutton/scrollbutton.component.scss +++ b/frontend/src/app/components/scrollbutton/scrollbutton.component.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; .icon { margin-bottom: 8px; diff --git a/src/app/components/scrollbutton/scrollbutton.component.spec.ts b/frontend/src/app/components/scrollbutton/scrollbutton.component.spec.ts similarity index 100% rename from src/app/components/scrollbutton/scrollbutton.component.spec.ts rename to frontend/src/app/components/scrollbutton/scrollbutton.component.spec.ts diff --git a/src/app/components/scrollbutton/scrollbutton.component.ts b/frontend/src/app/components/scrollbutton/scrollbutton.component.ts similarity index 100% rename from src/app/components/scrollbutton/scrollbutton.component.ts rename to frontend/src/app/components/scrollbutton/scrollbutton.component.ts diff --git a/src/app/components/search/search-dialog/search-dialog.component.html b/frontend/src/app/components/search/search-dialog/search-dialog.component.html similarity index 100% rename from src/app/components/search/search-dialog/search-dialog.component.html rename to frontend/src/app/components/search/search-dialog/search-dialog.component.html diff --git a/src/app/components/search/search-dialog/search-dialog.component.scss b/frontend/src/app/components/search/search-dialog/search-dialog.component.scss similarity index 86% rename from src/app/components/search/search-dialog/search-dialog.component.scss rename to frontend/src/app/components/search/search-dialog/search-dialog.component.scss index 2d50bd07f..ba1e9a691 100644 --- a/src/app/components/search/search-dialog/search-dialog.component.scss +++ b/frontend/src/app/components/search/search-dialog/search-dialog.component.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; @import '../../../../styles/color'; .viewport { diff --git a/src/app/components/search/search-dialog/search-dialog.component.spec.ts b/frontend/src/app/components/search/search-dialog/search-dialog.component.spec.ts similarity index 100% rename from src/app/components/search/search-dialog/search-dialog.component.spec.ts rename to frontend/src/app/components/search/search-dialog/search-dialog.component.spec.ts diff --git a/src/app/components/search/search-dialog/search-dialog.component.ts b/frontend/src/app/components/search/search-dialog/search-dialog.component.ts similarity index 76% rename from src/app/components/search/search-dialog/search-dialog.component.ts rename to frontend/src/app/components/search/search-dialog/search-dialog.component.ts index 8e86ae043..7b14e1620 100644 --- a/src/app/components/search/search-dialog/search-dialog.component.ts +++ b/frontend/src/app/components/search/search-dialog/search-dialog.component.ts @@ -1,10 +1,10 @@ -import { Component, Inject, OnInit } from '@angular/core'; +import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; -import { Observable } from 'rxjs'; +import { Observable, Subscription } from 'rxjs'; import { translate } from '@ngneat/transloco'; import { Provider, SearchArgument, SearchResult } from '../../../@core/services/provider/provider.model'; -import { AlertService } from '../../../@core/services/alertsnackbar/altersnackbar.service'; +import { AlertService } from '../../../@core/services/alertsnackbar/alertsnackbar.service'; import { IProviderService } from '../../../@core/services/provider/provider.interface'; import Logger from '../../../@core/utils/logger'; @@ -20,14 +20,21 @@ interface Data { templateUrl: './search-dialog.component.html', styleUrls: ['./search-dialog.component.scss'], }) -export class SearchDialogComponent implements OnInit { +export class SearchDialogComponent implements OnInit, OnDestroy { + searchResults$?: Observable; + searchResults: SearchResult[] = []; + searchFinished = false; + searchFailed = false; + exactSearch = false; - subscription?: Observable; + selected?: SearchResult; + subscription!: Subscription; + constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: Data, @@ -37,7 +44,7 @@ export class SearchDialogComponent implements OnInit { ) {} ngOnInit(): void { - this.subscription = this.providerService.search(this.data.provider.identifier, { + this.searchResults$ = this.providerService.search(this.data.provider.identifier, { arguments: this.data.arguments, exact: this.exactSearch, }); @@ -45,18 +52,22 @@ export class SearchDialogComponent implements OnInit { this.searchResults = []; this.searchFinished = false; this.searchFailed = false; - this.subscription.subscribe( - (response) => { + this.subscription = this.searchResults$.subscribe({ + next: (response) => { this.searchResults = response; this.searchFinished = true; }, - (err) => { + error: (err) => { this.searchFinished = true; this.searchFailed = true; logger.error('loading search results failed:', err); this.alertService.error(translate('loadSearchResults')); }, - ); + }); + } + + ngOnDestroy(): void { + this.subscription.unsubscribe(); } setSelected(selected: SearchResult): void { diff --git a/src/app/components/search/search.component.html b/frontend/src/app/components/search/search.component.html similarity index 100% rename from src/app/components/search/search.component.html rename to frontend/src/app/components/search/search.component.html diff --git a/src/app/components/search/search.component.scss b/frontend/src/app/components/search/search.component.scss similarity index 96% rename from src/app/components/search/search.component.scss rename to frontend/src/app/components/search/search.component.scss index 3f741765c..4fcaa2ab8 100644 --- a/src/app/components/search/search.component.scss +++ b/frontend/src/app/components/search/search.component.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; @import '../../../styles/color'; .flex { diff --git a/src/app/components/search/search.component.spec.ts b/frontend/src/app/components/search/search.component.spec.ts similarity index 100% rename from src/app/components/search/search.component.spec.ts rename to frontend/src/app/components/search/search.component.spec.ts diff --git a/src/app/components/search/search.component.ts b/frontend/src/app/components/search/search.component.ts similarity index 56% rename from src/app/components/search/search.component.ts rename to frontend/src/app/components/search/search.component.ts index e60e2d37e..4c51bf326 100644 --- a/src/app/components/search/search.component.ts +++ b/frontend/src/app/components/search/search.component.ts @@ -1,14 +1,20 @@ -import { Component, OnInit, QueryList, ViewChildren } from '@angular/core'; -import { first } from 'rxjs/operators'; +import { Component, OnDestroy, OnInit, QueryList, ViewChildren } from '@angular/core'; +import { Observable, Subscription } from 'rxjs'; +import { Select, Store } from '@ngxs/store'; +import { CdkDragDrop } from '@angular/cdk/drag-drop'; import { MatDialog } from '@angular/material/dialog'; import { MatTableDataSource } from '@angular/material/table'; import { translate } from '@ngneat/transloco'; -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; -import { Data, Source, SubstanceData } from '../../@core/models/substances.model'; -import { Provider, ProviderMapping, SearchArgument } from '../../@core/services/provider/provider.model'; -import { AlertService } from '../../@core/services/alertsnackbar/altersnackbar.service'; -import { GlobalModel } from '../../@core/models/global.model'; +import { + AddSubstanceData, + ModifySubstanceData, + RearrangeSubstanceData, + RemoveSubstanceData, +} from '../../@core/states/substance-data.state'; +import { Provider, ProviderMapping } from '../../@core/services/provider/provider.model'; +import { Source, SubstanceData } from '../../@core/models/substances.model'; +import { AlertService } from '../../@core/services/alertsnackbar/alertsnackbar.service'; import { INativeService } from '../../@core/services/native/native.interface'; import { IProviderService } from '../../@core/services/provider/provider.interface'; import Logger from '../../@core/utils/logger'; @@ -26,11 +32,13 @@ const GESTIS_URL_RE = new RegExp('https:\\/\\/gestis-api\\.dguv\\.de\\/api\\/art templateUrl: './search.component.html', styleUrls: ['./search.component.scss'], }) -export class SearchComponent implements OnInit { +export class SearchComponent implements OnInit, OnDestroy { @ViewChildren(SelectedSearchComponent) selectedSearchComponents!: QueryList; - res: SearchArgument[] = []; + @Select((state: any) => state.substance_data.substanceData) substanceData$!: Observable; + + subscriptions: Subscription[] = []; addButtonHover = false; @@ -40,30 +48,34 @@ export class SearchComponent implements OnInit { index = 0; - substanceData: SubstanceData[] = []; - displayedColumns = ['edited', 'name', 'cas', 'source', 'actions']; - dataSource!: MatTableDataSource; + dataSource = new MatTableDataSource([]); constructor( private providerService: IProviderService, private nativeService: INativeService, private alertService: AlertService, private dialog: MatDialog, - public globals: GlobalModel, + private store: Store, ) {} ngOnInit(): void { - this.globals.substanceDataObservable.subscribe((data) => { - this.dataSource = new MatTableDataSource(data); - }); + this.subscriptions.push( + this.substanceData$.subscribe((data) => { + this.dataSource.connect().next(data); + }), + + this.providerService.providerMappingsObservable.subscribe((providerMap) => { + logger.debug(providerMap); + this.providerMapping = providerMap; + this.providers = Array.from(providerMap.values()).filter((provider) => provider.identifier !== 'custom'); + }), + ); + } - this.providerService.providerMappingsObservable.subscribe((providerMap) => { - logger.debug(providerMap); - this.providerMapping = providerMap; - this.providers = Array.from(providerMap.values()).filter((provider) => provider.identifier !== 'custom'); - }); + ngOnDestroy(): void { + this.subscriptions.forEach((sub) => sub.unsubscribe()); } openDialog(index: number): void { @@ -81,27 +93,16 @@ export class SearchComponent implements OnInit { dialogRef.afterClosed().subscribe((result) => { if (result) { - this.providerService.substanceData(provider.identifier, result.zvgNumber).subscribe( - (value) => { + this.providerService.substanceData(provider.identifier, result.zvgNumber).subscribe({ + next: (value) => { logger.debug(value); - const cas = this.modifiedOrOriginal(value.cas); - if ( - cas && - this.globals.substanceDataSubject.getValue().some((s) => cas === this.modifiedOrOriginal(s.cas)) - ) { - logger.warning('substance with same cas number already present:', cas); - this.alertService.error(translate('error.substanceWithCASExist')); - return; - } - const data = [...this.globals.substanceDataSubject.getValue(), value]; - this.dataSource.connect().next(data); - this.globals.substanceDataSubject.next(data); + this.store.dispatch(new AddSubstanceData(value)); }, - (err) => { + error: (err) => { logger.error('could not get substance information:', err); this.alertService.error(translate('error.substanceLoadData')); }, - ); + }); currentSearchComponent?.clear(); } @@ -109,7 +110,6 @@ export class SearchComponent implements OnInit { } openEditDialog(origData: SubstanceData): void { - origData.checked = true; this.dialog .open(EditSubstanceDataComponent, { data: origData, @@ -120,33 +120,25 @@ export class SearchComponent implements OnInit { autoFocus: false, }) .afterClosed() - .subscribe( - (substanceData?: SubstanceData) => { + .subscribe({ + next: (substanceData?: SubstanceData) => { // substanceData is only filled if editing was successful if (substanceData) { - const newData = this.globals.substanceDataSubject.getValue(); - const index = newData.indexOf(origData); - newData[index] = substanceData; - this.globals.substanceDataSubject.next(newData); + this.store.dispatch(new ModifySubstanceData(origData, substanceData)); } }, - (err) => { + error: (err) => { logger.error('editing substance failed:', err); this.alertService.error(translate('error.editSubstance')); }, - ); + }); } removeSubstance(event: MouseEvent, data: SubstanceData): void { event.preventDefault(); event.stopPropagation(); - this.globals.substanceDataObservable.pipe(first()).subscribe((value) => { - const index = value.indexOf(data); - value.splice(index, 1); - this.globals.substanceDataSubject.next(value); - this.dataSource.connect().next(value); - }); + this.store.dispatch(new RemoveSubstanceData(data)); } sourceButtonDisabled(source: Source): boolean { @@ -164,13 +156,7 @@ export class SearchComponent implements OnInit { } addCustomSubstanceData(): void { - const data = [ - ...this.globals.substanceDataSubject.getValue(), - // create new custom SubstanceData - new SubstanceData({ checked: true }), - ]; - this.dataSource.connect().next(data); - this.globals.substanceDataSubject.next(data); + this.store.dispatch(new AddSubstanceData(new SubstanceData({ checked: true }))); } getProviderName(source: Source): string { @@ -182,15 +168,7 @@ export class SearchComponent implements OnInit { } } - drop(event: CdkDragDrop | any) { - moveItemInArray(this.dataSource.data, event.previousIndex, event.currentIndex); - const data = this.dataSource.data.slice(); - this.dataSource.connect().next(data); - this.globals.substanceDataSubject.next(data); - } - - // TODO move to SubstanceData class - private modifiedOrOriginal(obj: Data): T { - return obj.modifiedData ?? obj.originalData; + drop(event: CdkDragDrop | any): void { + this.store.dispatch(new RearrangeSubstanceData(event)); } } diff --git a/src/app/components/search/selected-search/selected-search.component.html b/frontend/src/app/components/search/selected-search/selected-search.component.html similarity index 97% rename from src/app/components/search/selected-search/selected-search.component.html rename to frontend/src/app/components/search/selected-search/selected-search.component.html index d12ba2bd0..08561d462 100644 --- a/src/app/components/search/selected-search/selected-search.component.html +++ b/frontend/src/app/components/search/selected-search/selected-search.component.html @@ -12,9 +12,9 @@ + search {{ t('searchButton') }} - search { + .subscribe({ + next: (response) => { this.suggestionResults.set(selectionGroup.get('searchOption')?.value, response); }, - (err) => { + error: (err) => { logger.error('loading search suggestions failed:', err); this.alertService.error(translate('loadSearchSuggestions')); }, - ); + }); }); } diff --git a/frontend/src/app/components/security-things/security-things.component.html b/frontend/src/app/components/security-things/security-things.component.html new file mode 100644 index 000000000..86a10d171 --- /dev/null +++ b/frontend/src/app/components/security-things/security-things.component.html @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/src/app/components/security-things/security-things.component.scss b/frontend/src/app/components/security-things/security-things.component.scss similarity index 100% rename from src/app/components/security-things/security-things.component.scss rename to frontend/src/app/components/security-things/security-things.component.scss diff --git a/src/app/components/security-things/security-things.component.spec.ts b/frontend/src/app/components/security-things/security-things.component.spec.ts similarity index 100% rename from src/app/components/security-things/security-things.component.spec.ts rename to frontend/src/app/components/security-things/security-things.component.spec.ts diff --git a/frontend/src/app/components/security-things/security-things.component.ts b/frontend/src/app/components/security-things/security-things.component.ts new file mode 100644 index 000000000..b298b8ac3 --- /dev/null +++ b/frontend/src/app/components/security-things/security-things.component.ts @@ -0,0 +1,47 @@ +import { Actions, Store } from '@ngxs/store'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { map, Observable } from 'rxjs'; +import { CdkDragDrop } from '@angular/cdk/drag-drop'; +import { Component } from '@angular/core'; + +import * as Disposal from '../../@core/actions/disposal.actions'; +import * as HumanAndEnvironmentDanger from '../../@core/actions/human-and-environment-danger.actions'; +import * as InCaseOfDanger from '../../@core/actions/in-case-of-danger.actions'; +import * as RulesOfConduct from '../../@core/actions/rules-of-conduct-acitons'; +import { elementsToFormGroup, stateToElements } from 'src/app/@core/utils/forms.helper'; +import { ActionNewable } from 'src/app/@core/utils/action-newable'; + +@Component({ + selector: 'app-security-things', + templateUrl: './security-things.component.html', + styleUrls: ['./security-things.component.scss'], +}) +export class SecurityThingsComponent { + HumanAndEnvironmentDanger = HumanAndEnvironmentDanger; + + RulesOfConduct = RulesOfConduct; + + InCaseOfDanger = InCaseOfDanger; + + Disposal = Disposal; + + constructor(private store: Store, private formBuilder: FormBuilder, private actions$: Actions) {} + + add(action: ActionNewable): void { + this.store.dispatch(new action()); + } + + remove(action: ActionNewable, index: number): void { + this.store.dispatch(new action(index)); + } + + rearrange(action: ActionNewable>, event: CdkDragDrop): void { + this.store.dispatch(new action(event)); + } + + initFormGroup(identifier: string): Observable { + return stateToElements(this.store, identifier).pipe( + map((elements) => elementsToFormGroup(this.formBuilder, elements)), + ); + } +} diff --git a/src/app/components/settings/settings.component.html b/frontend/src/app/components/settings/settings.component.html similarity index 100% rename from src/app/components/settings/settings.component.html rename to frontend/src/app/components/settings/settings.component.html diff --git a/src/app/components/settings/settings.component.scss b/frontend/src/app/components/settings/settings.component.scss similarity index 100% rename from src/app/components/settings/settings.component.scss rename to frontend/src/app/components/settings/settings.component.scss diff --git a/src/app/components/settings/settings.component.spec.ts b/frontend/src/app/components/settings/settings.component.spec.ts similarity index 100% rename from src/app/components/settings/settings.component.spec.ts rename to frontend/src/app/components/settings/settings.component.spec.ts diff --git a/src/app/components/settings/settings.component.ts b/frontend/src/app/components/settings/settings.component.ts similarity index 61% rename from src/app/components/settings/settings.component.ts rename to frontend/src/app/components/settings/settings.component.ts index 4d0769d63..48c33ab55 100644 --- a/src/app/components/settings/settings.component.ts +++ b/frontend/src/app/components/settings/settings.component.ts @@ -1,10 +1,10 @@ import { AbstractControl, FormBuilder, FormGroup } from '@angular/forms'; -import { Component, EventEmitter, OnDestroy, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatDialogRef } from '@angular/material/dialog'; -import { MatSlideToggleChange } from '@angular/material/slide-toggle'; +import { Store } from '@ngxs/store'; import { Subscription } from 'rxjs'; -import { ConfigModel, configObservable } from '../../@core/models/config.model'; +import { ChangeLanguage, ToggleDarkTheme } from 'src/app/@core/states/config.state'; import { AvailableLanguage } from '../../@core/services/i18n/i18n.interface'; import { TranslocoService } from '@ngneat/transloco'; @@ -14,49 +14,48 @@ import { TranslocoService } from '@ngneat/transloco'; styleUrls: ['./settings.component.scss'], }) export class SettingsComponent implements OnInit, OnDestroy { - readonly darkModeSwitched = new EventEmitter(); - langs!: AvailableLanguage[]; - form: FormGroup; - subscriptions: Subscription[] = []; - private config!: ConfigModel; + form!: FormGroup; + + subscriptions: Subscription[] = []; constructor( public dialogRef: MatDialogRef, private translocoService: TranslocoService, private formBuilder: FormBuilder, - ) { - this.form = this.formBuilder.group({ - language: '', - theme: '', - }); - } + private store: Store, + ) {} get f(): { [p: string]: AbstractControl } { return this.form.controls; } ngOnInit(): void { + this.form = this.formBuilder.group({ + language: '', + theme: '', + }); + this.langs = this.translocoService.getAvailableLangs() as AvailableLanguage[]; - this.subscriptions.push( - configObservable.subscribe((config) => { + this.store + .selectOnce((state: any) => state.config) + .subscribe((config) => { this.form.patchValue( { - language: config.globalSection.language, - theme: config.globalSection.darkTheme, + language: config.language, + theme: config.darkTheme, }, { emitEvent: false }, ); - this.config = config; - }), + }); - this.f.theme.valueChanges.subscribe((change) => this.darkModeSwitched.emit(change)), + this.subscriptions.push( + this.f.theme.valueChanges.subscribe((change) => this.store.dispatch(new ToggleDarkTheme(change))), this.f.language.valueChanges.subscribe((change) => { - this.config.setLanguage(change); - this.translocoService.setActiveLang(change); + this.store.dispatch(new ChangeLanguage(change)); }), ); } @@ -64,8 +63,4 @@ export class SettingsComponent implements OnInit, OnDestroy { ngOnDestroy(): void { this.subscriptions.forEach((subscription) => subscription.unsubscribe()); } - - onDarkModeSwitched({ checked }: MatSlideToggleChange): void { - this.darkModeSwitched.emit(checked); - } } diff --git a/src/app/components/yes-no-dialog/yes-no-dialog.component.html b/frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.html similarity index 100% rename from src/app/components/yes-no-dialog/yes-no-dialog.component.html rename to frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.html diff --git a/src/app/components/yes-no-dialog/yes-no-dialog.component.scss b/frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.scss similarity index 100% rename from src/app/components/yes-no-dialog/yes-no-dialog.component.scss rename to frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.scss diff --git a/src/app/components/yes-no-dialog/yes-no-dialog.component.spec.ts b/frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.spec.ts similarity index 100% rename from src/app/components/yes-no-dialog/yes-no-dialog.component.spec.ts rename to frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.spec.ts diff --git a/src/app/components/yes-no-dialog/yes-no-dialog.component.ts b/frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.ts similarity index 100% rename from src/app/components/yes-no-dialog/yes-no-dialog.component.ts rename to frontend/src/app/components/yes-no-dialog/yes-no-dialog.component.ts diff --git a/src/app/global-styles.scss b/frontend/src/app/global-styles.scss similarity index 100% rename from src/app/global-styles.scss rename to frontend/src/app/global-styles.scss diff --git a/frontend/src/app/ngxs.config.ts b/frontend/src/app/ngxs.config.ts new file mode 100644 index 000000000..be03bb8ee --- /dev/null +++ b/frontend/src/app/ngxs.config.ts @@ -0,0 +1,7 @@ +import { environment } from '../environments/environment'; +import { NgxsModuleOptions } from '@ngxs/store'; + +export const ngxsConfig: NgxsModuleOptions = { + developmentMode: !environment.production, + selectorOptions: { suppressErrors: false, injectContainerState: false }, +}; diff --git a/src/app/onepager/onepager.component.html b/frontend/src/app/onepager/onepager.component.html similarity index 93% rename from src/app/onepager/onepager.component.html rename to frontend/src/app/onepager/onepager.component.html index 3a1899faf..17eeaf44b 100644 --- a/src/app/onepager/onepager.component.html +++ b/frontend/src/app/onepager/onepager.component.html @@ -1,6 +1,6 @@ - + (); - // TODO find a better way in the future DOCS_TEMPLATE = TEMPLATES.docsTemplate; } diff --git a/src/app/transloco-root.module.ts b/frontend/src/app/transloco-root.module.ts similarity index 100% rename from src/app/transloco-root.module.ts rename to frontend/src/app/transloco-root.module.ts diff --git a/src/assets/bp/bp b/frontend/src/assets/bp/bp similarity index 100% rename from src/assets/bp/bp rename to frontend/src/assets/bp/bp diff --git a/src/assets/bp/config.json b/frontend/src/assets/bp/config.json similarity index 100% rename from src/assets/bp/config.json rename to frontend/src/assets/bp/config.json diff --git a/src/assets/bp/p/applejack/aj-gallop-left.gif b/frontend/src/assets/bp/p/applejack/aj-gallop-left.gif similarity index 100% rename from src/assets/bp/p/applejack/aj-gallop-left.gif rename to frontend/src/assets/bp/p/applejack/aj-gallop-left.gif diff --git a/src/assets/bp/p/applejack/aj-gallop-right.gif b/frontend/src/assets/bp/p/applejack/aj-gallop-right.gif similarity index 100% rename from src/assets/bp/p/applejack/aj-gallop-right.gif rename to frontend/src/assets/bp/p/applejack/aj-gallop-right.gif diff --git a/src/assets/bp/p/applejack/aj-rear-left.gif b/frontend/src/assets/bp/p/applejack/aj-rear-left.gif similarity index 100% rename from src/assets/bp/p/applejack/aj-rear-left.gif rename to frontend/src/assets/bp/p/applejack/aj-rear-left.gif diff --git a/src/assets/bp/p/applejack/aj-rear-right.gif b/frontend/src/assets/bp/p/applejack/aj-rear-right.gif similarity index 100% rename from src/assets/bp/p/applejack/aj-rear-right.gif rename to frontend/src/assets/bp/p/applejack/aj-rear-right.gif diff --git a/src/assets/bp/p/applejack/aj_galla_left.gif b/frontend/src/assets/bp/p/applejack/aj_galla_left.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_galla_left.gif rename to frontend/src/assets/bp/p/applejack/aj_galla_left.gif diff --git a/src/assets/bp/p/applejack/aj_galla_right.gif b/frontend/src/assets/bp/p/applejack/aj_galla_right.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_galla_right.gif rename to frontend/src/assets/bp/p/applejack/aj_galla_right.gif diff --git a/src/assets/bp/p/applejack/aj_idle_left.gif b/frontend/src/assets/bp/p/applejack/aj_idle_left.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_idle_left.gif rename to frontend/src/assets/bp/p/applejack/aj_idle_left.gif diff --git a/src/assets/bp/p/applejack/aj_idle_right.gif b/frontend/src/assets/bp/p/applejack/aj_idle_right.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_idle_right.gif rename to frontend/src/assets/bp/p/applejack/aj_idle_right.gif diff --git a/src/assets/bp/p/applejack/aj_lasso_left.gif b/frontend/src/assets/bp/p/applejack/aj_lasso_left.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_lasso_left.gif rename to frontend/src/assets/bp/p/applejack/aj_lasso_left.gif diff --git a/src/assets/bp/p/applejack/aj_lasso_right.gif b/frontend/src/assets/bp/p/applejack/aj_lasso_right.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_lasso_right.gif rename to frontend/src/assets/bp/p/applejack/aj_lasso_right.gif diff --git a/src/assets/bp/p/applejack/aj_pose_left.gif b/frontend/src/assets/bp/p/applejack/aj_pose_left.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_pose_left.gif rename to frontend/src/assets/bp/p/applejack/aj_pose_left.gif diff --git a/src/assets/bp/p/applejack/aj_pose_right.gif b/frontend/src/assets/bp/p/applejack/aj_pose_right.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_pose_right.gif rename to frontend/src/assets/bp/p/applejack/aj_pose_right.gif diff --git a/src/assets/bp/p/applejack/aj_trot_left.gif b/frontend/src/assets/bp/p/applejack/aj_trot_left.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_trot_left.gif rename to frontend/src/assets/bp/p/applejack/aj_trot_left.gif diff --git a/src/assets/bp/p/applejack/aj_trot_right.gif b/frontend/src/assets/bp/p/applejack/aj_trot_right.gif similarity index 100% rename from src/assets/bp/p/applejack/aj_trot_right.gif rename to frontend/src/assets/bp/p/applejack/aj_trot_right.gif diff --git a/src/assets/bp/p/applejack/apple_drop.gif b/frontend/src/assets/bp/p/applejack/apple_drop.gif similarity index 100% rename from src/assets/bp/p/applejack/apple_drop.gif rename to frontend/src/assets/bp/p/applejack/apple_drop.gif diff --git a/src/assets/bp/p/applejack/buck.gif b/frontend/src/assets/bp/p/applejack/buck.gif similarity index 100% rename from src/assets/bp/p/applejack/buck.gif rename to frontend/src/assets/bp/p/applejack/buck.gif diff --git a/src/assets/bp/p/applejack/congaapplejack_left.gif b/frontend/src/assets/bp/p/applejack/congaapplejack_left.gif similarity index 100% rename from src/assets/bp/p/applejack/congaapplejack_left.gif rename to frontend/src/assets/bp/p/applejack/congaapplejack_left.gif diff --git a/src/assets/bp/p/applejack/congaapplejack_right.gif b/frontend/src/assets/bp/p/applejack/congaapplejack_right.gif similarity index 100% rename from src/assets/bp/p/applejack/congaapplejack_right.gif rename to frontend/src/assets/bp/p/applejack/congaapplejack_right.gif diff --git a/src/assets/bp/p/applejack/crystal-applejack-left.art b/frontend/src/assets/bp/p/applejack/crystal-applejack-left.art similarity index 100% rename from src/assets/bp/p/applejack/crystal-applejack-left.art rename to frontend/src/assets/bp/p/applejack/crystal-applejack-left.art diff --git a/src/assets/bp/p/applejack/crystal-applejack-left.gif b/frontend/src/assets/bp/p/applejack/crystal-applejack-left.gif similarity index 100% rename from src/assets/bp/p/applejack/crystal-applejack-left.gif rename to frontend/src/assets/bp/p/applejack/crystal-applejack-left.gif diff --git a/src/assets/bp/p/applejack/crystal-applejack-right.art b/frontend/src/assets/bp/p/applejack/crystal-applejack-right.art similarity index 100% rename from src/assets/bp/p/applejack/crystal-applejack-right.art rename to frontend/src/assets/bp/p/applejack/crystal-applejack-right.art diff --git a/src/assets/bp/p/applejack/crystal-applejack-right.gif b/frontend/src/assets/bp/p/applejack/crystal-applejack-right.gif similarity index 100% rename from src/assets/bp/p/applejack/crystal-applejack-right.gif rename to frontend/src/assets/bp/p/applejack/crystal-applejack-right.gif diff --git a/src/assets/bp/p/applejack/gallop_jump_left.gif b/frontend/src/assets/bp/p/applejack/gallop_jump_left.gif similarity index 100% rename from src/assets/bp/p/applejack/gallop_jump_left.gif rename to frontend/src/assets/bp/p/applejack/gallop_jump_left.gif diff --git a/src/assets/bp/p/applejack/gallop_jump_right.gif b/frontend/src/assets/bp/p/applejack/gallop_jump_right.gif similarity index 100% rename from src/assets/bp/p/applejack/gallop_jump_right.gif rename to frontend/src/assets/bp/p/applejack/gallop_jump_right.gif diff --git a/src/assets/bp/p/applejack/gallop_left.gif b/frontend/src/assets/bp/p/applejack/gallop_left.gif similarity index 100% rename from src/assets/bp/p/applejack/gallop_left.gif rename to frontend/src/assets/bp/p/applejack/gallop_left.gif diff --git a/src/assets/bp/p/applejack/gallop_right.gif b/frontend/src/assets/bp/p/applejack/gallop_right.gif similarity index 100% rename from src/assets/bp/p/applejack/gallop_right.gif rename to frontend/src/assets/bp/p/applejack/gallop_right.gif diff --git a/src/assets/bp/p/applejack/hurdle_left.gif b/frontend/src/assets/bp/p/applejack/hurdle_left.gif similarity index 100% rename from src/assets/bp/p/applejack/hurdle_left.gif rename to frontend/src/assets/bp/p/applejack/hurdle_left.gif diff --git a/src/assets/bp/p/applejack/hurdle_right.gif b/frontend/src/assets/bp/p/applejack/hurdle_right.gif similarity index 100% rename from src/assets/bp/p/applejack/hurdle_right.gif rename to frontend/src/assets/bp/p/applejack/hurdle_right.gif diff --git a/src/assets/bp/p/applejack/lasso2_left.gif b/frontend/src/assets/bp/p/applejack/lasso2_left.gif similarity index 100% rename from src/assets/bp/p/applejack/lasso2_left.gif rename to frontend/src/assets/bp/p/applejack/lasso2_left.gif diff --git a/src/assets/bp/p/applejack/lasso2_right.gif b/frontend/src/assets/bp/p/applejack/lasso2_right.gif similarity index 100% rename from src/assets/bp/p/applejack/lasso2_right.gif rename to frontend/src/assets/bp/p/applejack/lasso2_right.gif diff --git a/src/assets/bp/p/applejack/pony.ini b/frontend/src/assets/bp/p/applejack/pony.ini similarity index 100% rename from src/assets/bp/p/applejack/pony.ini rename to frontend/src/assets/bp/p/applejack/pony.ini diff --git a/src/assets/bp/p/applejack/rear_left.gif b/frontend/src/assets/bp/p/applejack/rear_left.gif similarity index 100% rename from src/assets/bp/p/applejack/rear_left.gif rename to frontend/src/assets/bp/p/applejack/rear_left.gif diff --git a/src/assets/bp/p/applejack/rear_right.gif b/frontend/src/assets/bp/p/applejack/rear_right.gif similarity index 100% rename from src/assets/bp/p/applejack/rear_right.gif rename to frontend/src/assets/bp/p/applejack/rear_right.gif diff --git a/src/assets/bp/p/applejack/sleep_left.gif b/frontend/src/assets/bp/p/applejack/sleep_left.gif similarity index 100% rename from src/assets/bp/p/applejack/sleep_left.gif rename to frontend/src/assets/bp/p/applejack/sleep_left.gif diff --git a/src/assets/bp/p/applejack/sleep_right.gif b/frontend/src/assets/bp/p/applejack/sleep_right.gif similarity index 100% rename from src/assets/bp/p/applejack/sleep_right.gif rename to frontend/src/assets/bp/p/applejack/sleep_right.gif diff --git a/src/assets/bp/p/applejack/sparkle.art b/frontend/src/assets/bp/p/applejack/sparkle.art similarity index 100% rename from src/assets/bp/p/applejack/sparkle.art rename to frontend/src/assets/bp/p/applejack/sparkle.art diff --git a/src/assets/bp/p/applejack/sparkle.gif b/frontend/src/assets/bp/p/applejack/sparkle.gif similarity index 100% rename from src/assets/bp/p/applejack/sparkle.gif rename to frontend/src/assets/bp/p/applejack/sparkle.gif diff --git a/src/assets/bp/p/applejack/stand_aj_left.gif b/frontend/src/assets/bp/p/applejack/stand_aj_left.gif similarity index 100% rename from src/assets/bp/p/applejack/stand_aj_left.gif rename to frontend/src/assets/bp/p/applejack/stand_aj_left.gif diff --git a/src/assets/bp/p/applejack/stand_aj_right.gif b/frontend/src/assets/bp/p/applejack/stand_aj_right.gif similarity index 100% rename from src/assets/bp/p/applejack/stand_aj_right.gif rename to frontend/src/assets/bp/p/applejack/stand_aj_right.gif diff --git a/src/assets/bp/p/applejack/tree.gif b/frontend/src/assets/bp/p/applejack/tree.gif similarity index 100% rename from src/assets/bp/p/applejack/tree.gif rename to frontend/src/assets/bp/p/applejack/tree.gif diff --git a/src/assets/bp/p/applejack/trotcycle_aj_left.gif b/frontend/src/assets/bp/p/applejack/trotcycle_aj_left.gif similarity index 100% rename from src/assets/bp/p/applejack/trotcycle_aj_left.gif rename to frontend/src/assets/bp/p/applejack/trotcycle_aj_left.gif diff --git a/src/assets/bp/p/applejack/trotcycle_aj_right.gif b/frontend/src/assets/bp/p/applejack/trotcycle_aj_right.gif similarity index 100% rename from src/assets/bp/p/applejack/trotcycle_aj_right.gif rename to frontend/src/assets/bp/p/applejack/trotcycle_aj_right.gif diff --git a/src/assets/bp/p/applejack/truck_drive_left.gif b/frontend/src/assets/bp/p/applejack/truck_drive_left.gif similarity index 100% rename from src/assets/bp/p/applejack/truck_drive_left.gif rename to frontend/src/assets/bp/p/applejack/truck_drive_left.gif diff --git a/src/assets/bp/p/applejack/truck_drive_right.gif b/frontend/src/assets/bp/p/applejack/truck_drive_right.gif similarity index 100% rename from src/assets/bp/p/applejack/truck_drive_right.gif rename to frontend/src/assets/bp/p/applejack/truck_drive_right.gif diff --git a/src/assets/bp/p/fluttershy/congafluttershy_left.gif b/frontend/src/assets/bp/p/fluttershy/congafluttershy_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/congafluttershy_left.gif rename to frontend/src/assets/bp/p/fluttershy/congafluttershy_left.gif diff --git a/src/assets/bp/p/fluttershy/congafluttershy_right.gif b/frontend/src/assets/bp/p/fluttershy/congafluttershy_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/congafluttershy_right.gif rename to frontend/src/assets/bp/p/fluttershy/congafluttershy_right.gif diff --git a/src/assets/bp/p/fluttershy/critter_catch_left.gif b/frontend/src/assets/bp/p/fluttershy/critter_catch_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/critter_catch_left.gif rename to frontend/src/assets/bp/p/fluttershy/critter_catch_left.gif diff --git a/src/assets/bp/p/fluttershy/critter_catch_right.gif b/frontend/src/assets/bp/p/fluttershy/critter_catch_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/critter_catch_right.gif rename to frontend/src/assets/bp/p/fluttershy/critter_catch_right.gif diff --git a/src/assets/bp/p/fluttershy/critter_left.png b/frontend/src/assets/bp/p/fluttershy/critter_left.png similarity index 100% rename from src/assets/bp/p/fluttershy/critter_left.png rename to frontend/src/assets/bp/p/fluttershy/critter_left.png diff --git a/src/assets/bp/p/fluttershy/critter_right.png b/frontend/src/assets/bp/p/fluttershy/critter_right.png similarity index 100% rename from src/assets/bp/p/fluttershy/critter_right.png rename to frontend/src/assets/bp/p/fluttershy/critter_right.png diff --git a/src/assets/bp/p/fluttershy/crystal-fluttershy-left.art b/frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-left.art similarity index 100% rename from src/assets/bp/p/fluttershy/crystal-fluttershy-left.art rename to frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-left.art diff --git a/src/assets/bp/p/fluttershy/crystal-fluttershy-left.gif b/frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/crystal-fluttershy-left.gif rename to frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-left.gif diff --git a/src/assets/bp/p/fluttershy/crystal-fluttershy-right.art b/frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-right.art similarity index 100% rename from src/assets/bp/p/fluttershy/crystal-fluttershy-right.art rename to frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-right.art diff --git a/src/assets/bp/p/fluttershy/crystal-fluttershy-right.gif b/frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/crystal-fluttershy-right.gif rename to frontend/src/assets/bp/p/fluttershy/crystal-fluttershy-right.gif diff --git a/src/assets/bp/p/fluttershy/cuddles.gif b/frontend/src/assets/bp/p/fluttershy/cuddles.gif similarity index 100% rename from src/assets/bp/p/fluttershy/cuddles.gif rename to frontend/src/assets/bp/p/fluttershy/cuddles.gif diff --git a/src/assets/bp/p/fluttershy/flutter_mouseover_left.gif b/frontend/src/assets/bp/p/fluttershy/flutter_mouseover_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/flutter_mouseover_left.gif rename to frontend/src/assets/bp/p/fluttershy/flutter_mouseover_left.gif diff --git a/src/assets/bp/p/fluttershy/flutter_mouseover_right.gif b/frontend/src/assets/bp/p/fluttershy/flutter_mouseover_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/flutter_mouseover_right.gif rename to frontend/src/assets/bp/p/fluttershy/flutter_mouseover_right.gif diff --git a/src/assets/bp/p/fluttershy/flutters_gallop_left.gif b/frontend/src/assets/bp/p/fluttershy/flutters_gallop_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/flutters_gallop_left.gif rename to frontend/src/assets/bp/p/fluttershy/flutters_gallop_left.gif diff --git a/src/assets/bp/p/fluttershy/flutters_gallop_right.gif b/frontend/src/assets/bp/p/fluttershy/flutters_gallop_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/flutters_gallop_right.gif rename to frontend/src/assets/bp/p/fluttershy/flutters_gallop_right.gif diff --git a/src/assets/bp/p/fluttershy/fluttershy_drag_left.gif b/frontend/src/assets/bp/p/fluttershy/fluttershy_drag_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fluttershy_drag_left.gif rename to frontend/src/assets/bp/p/fluttershy/fluttershy_drag_left.gif diff --git a/src/assets/bp/p/fluttershy/fluttershy_drag_right.gif b/frontend/src/assets/bp/p/fluttershy/fluttershy_drag_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fluttershy_drag_right.gif rename to frontend/src/assets/bp/p/fluttershy/fluttershy_drag_right.gif diff --git a/src/assets/bp/p/fluttershy/fluttershy_stare_left.gif b/frontend/src/assets/bp/p/fluttershy/fluttershy_stare_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fluttershy_stare_left.gif rename to frontend/src/assets/bp/p/fluttershy/fluttershy_stare_left.gif diff --git a/src/assets/bp/p/fluttershy/fluttershy_stare_right.gif b/frontend/src/assets/bp/p/fluttershy/fluttershy_stare_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fluttershy_stare_right.gif rename to frontend/src/assets/bp/p/fluttershy/fluttershy_stare_right.gif diff --git a/src/assets/bp/p/fluttershy/fly_fluttershy_left.gif b/frontend/src/assets/bp/p/fluttershy/fly_fluttershy_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fly_fluttershy_left.gif rename to frontend/src/assets/bp/p/fluttershy/fly_fluttershy_left.gif diff --git a/src/assets/bp/p/fluttershy/fly_fluttershy_right.gif b/frontend/src/assets/bp/p/fluttershy/fly_fluttershy_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fly_fluttershy_right.gif rename to frontend/src/assets/bp/p/fluttershy/fly_fluttershy_right.gif diff --git a/src/assets/bp/p/fluttershy/fly_fluttershy_updown_left.gif b/frontend/src/assets/bp/p/fluttershy/fly_fluttershy_updown_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fly_fluttershy_updown_left.gif rename to frontend/src/assets/bp/p/fluttershy/fly_fluttershy_updown_left.gif diff --git a/src/assets/bp/p/fluttershy/fly_fluttershy_updown_right.gif b/frontend/src/assets/bp/p/fluttershy/fly_fluttershy_updown_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/fly_fluttershy_updown_right.gif rename to frontend/src/assets/bp/p/fluttershy/fly_fluttershy_updown_right.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_stand_left.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_stand_left.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_left.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_stand_left_wings.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_left_wings.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_stand_left_wings.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_left_wings.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_stand_right.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_stand_right.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_right.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_stand_right_wings.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_right_wings.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_stand_right_wings.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_stand_right_wings.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_trot_left.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_trot_left.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_left.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_trot_left_wings.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_left_wings.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_trot_left_wings.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_left_wings.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_trot_right.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_trot_right.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_right.gif diff --git a/src/assets/bp/p/fluttershy/gala_fluttershy_trot_right_wings.gif b/frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_right_wings.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fluttershy_trot_right_wings.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fluttershy_trot_right_wings.gif diff --git a/src/assets/bp/p/fluttershy/gala_fly_left.gif b/frontend/src/assets/bp/p/fluttershy/gala_fly_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fly_left.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fly_left.gif diff --git a/src/assets/bp/p/fluttershy/gala_fly_right.gif b/frontend/src/assets/bp/p/fluttershy/gala_fly_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/gala_fly_right.gif rename to frontend/src/assets/bp/p/fluttershy/gala_fly_right.gif diff --git a/src/assets/bp/p/fluttershy/pony.ini b/frontend/src/assets/bp/p/fluttershy/pony.ini similarity index 100% rename from src/assets/bp/p/fluttershy/pony.ini rename to frontend/src/assets/bp/p/fluttershy/pony.ini diff --git a/src/assets/bp/p/fluttershy/sleeping_fluttershy_left.gif b/frontend/src/assets/bp/p/fluttershy/sleeping_fluttershy_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/sleeping_fluttershy_left.gif rename to frontend/src/assets/bp/p/fluttershy/sleeping_fluttershy_left.gif diff --git a/src/assets/bp/p/fluttershy/sleeping_fluttershy_right.gif b/frontend/src/assets/bp/p/fluttershy/sleeping_fluttershy_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/sleeping_fluttershy_right.gif rename to frontend/src/assets/bp/p/fluttershy/sleeping_fluttershy_right.gif diff --git a/src/assets/bp/p/fluttershy/sparkle.art b/frontend/src/assets/bp/p/fluttershy/sparkle.art similarity index 100% rename from src/assets/bp/p/fluttershy/sparkle.art rename to frontend/src/assets/bp/p/fluttershy/sparkle.art diff --git a/src/assets/bp/p/fluttershy/sparkle.gif b/frontend/src/assets/bp/p/fluttershy/sparkle.gif similarity index 100% rename from src/assets/bp/p/fluttershy/sparkle.gif rename to frontend/src/assets/bp/p/fluttershy/sparkle.gif diff --git a/src/assets/bp/p/fluttershy/stand_fluttershy_left.gif b/frontend/src/assets/bp/p/fluttershy/stand_fluttershy_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/stand_fluttershy_left.gif rename to frontend/src/assets/bp/p/fluttershy/stand_fluttershy_left.gif diff --git a/src/assets/bp/p/fluttershy/stand_fluttershy_right.gif b/frontend/src/assets/bp/p/fluttershy/stand_fluttershy_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/stand_fluttershy_right.gif rename to frontend/src/assets/bp/p/fluttershy/stand_fluttershy_right.gif diff --git a/src/assets/bp/p/fluttershy/trotcycle_fluttershy_left.gif b/frontend/src/assets/bp/p/fluttershy/trotcycle_fluttershy_left.gif similarity index 100% rename from src/assets/bp/p/fluttershy/trotcycle_fluttershy_left.gif rename to frontend/src/assets/bp/p/fluttershy/trotcycle_fluttershy_left.gif diff --git a/src/assets/bp/p/fluttershy/trotcycle_fluttershy_right.gif b/frontend/src/assets/bp/p/fluttershy/trotcycle_fluttershy_right.gif similarity index 100% rename from src/assets/bp/p/fluttershy/trotcycle_fluttershy_right.gif rename to frontend/src/assets/bp/p/fluttershy/trotcycle_fluttershy_right.gif diff --git a/src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/backtrack_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/bite_pinkie_gummy_left.gif b/frontend/src/assets/bp/p/pinkie pie/bite_pinkie_gummy_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bite_pinkie_gummy_left.gif rename to frontend/src/assets/bp/p/pinkie pie/bite_pinkie_gummy_left.gif diff --git a/src/assets/bp/p/pinkie pie/bite_pinkie_gummy_right.gif b/frontend/src/assets/bp/p/pinkie pie/bite_pinkie_gummy_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bite_pinkie_gummy_right.gif rename to frontend/src/assets/bp/p/pinkie pie/bite_pinkie_gummy_right.gif diff --git a/src/assets/bp/p/pinkie pie/bounce_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounce_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/bounce_pinkiepie_left_n_n.gif b/frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_left_n_n.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounce_pinkiepie_left_n_n.gif rename to frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_left_n_n.gif diff --git a/src/assets/bp/p/pinkie pie/bounce_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounce_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/bounce_pinkiepie_right_n_n.gif b/frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_right_n_n.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounce_pinkiepie_right_n_n.gif rename to frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_right_n_n.gif diff --git a/src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_left.gif b/frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_left.gif rename to frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_left.gif diff --git a/src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_right.gif b/frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_right.gif rename to frontend/src/assets/bp/p/pinkie pie/bounce_pinkiepie_up_down_right.gif diff --git a/src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/bounceturn_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/cannoncake2_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/cannoncake_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/cannonfull_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/cannonshoot_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/cannonstart_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/cartwheel_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/chicken2_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/chicken_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/chicken_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/chicken_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/chicken_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/chicken_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/chicken_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/chicken_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/chicken_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/choppa_start_left.gif b/frontend/src/assets/bp/p/pinkie pie/choppa_start_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/choppa_start_left.gif rename to frontend/src/assets/bp/p/pinkie pie/choppa_start_left.gif diff --git a/src/assets/bp/p/pinkie pie/choppa_start_right.gif b/frontend/src/assets/bp/p/pinkie pie/choppa_start_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/choppa_start_right.gif rename to frontend/src/assets/bp/p/pinkie pie/choppa_start_right.gif diff --git a/src/assets/bp/p/pinkie pie/choppa_stop_left.gif b/frontend/src/assets/bp/p/pinkie pie/choppa_stop_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/choppa_stop_left.gif rename to frontend/src/assets/bp/p/pinkie pie/choppa_stop_left.gif diff --git a/src/assets/bp/p/pinkie pie/choppa_stop_right.gif b/frontend/src/assets/bp/p/pinkie pie/choppa_stop_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/choppa_stop_right.gif rename to frontend/src/assets/bp/p/pinkie pie/choppa_stop_right.gif diff --git a/src/assets/bp/p/pinkie pie/choppa_unfold_left.gif b/frontend/src/assets/bp/p/pinkie pie/choppa_unfold_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/choppa_unfold_left.gif rename to frontend/src/assets/bp/p/pinkie pie/choppa_unfold_left.gif diff --git a/src/assets/bp/p/pinkie pie/choppa_unfold_right.gif b/frontend/src/assets/bp/p/pinkie pie/choppa_unfold_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/choppa_unfold_right.gif rename to frontend/src/assets/bp/p/pinkie pie/choppa_unfold_right.gif diff --git a/src/assets/bp/p/pinkie pie/congapinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/congapinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/congapinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/congapinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/congapinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/congapinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/congapinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/congapinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/crystal-pinkie-left.art b/frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-left.art similarity index 100% rename from src/assets/bp/p/pinkie pie/crystal-pinkie-left.art rename to frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-left.art diff --git a/src/assets/bp/p/pinkie pie/crystal-pinkie-left.gif b/frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/crystal-pinkie-left.gif rename to frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-left.gif diff --git a/src/assets/bp/p/pinkie pie/crystal-pinkie-right.art b/frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-right.art similarity index 100% rename from src/assets/bp/p/pinkie pie/crystal-pinkie-right.art rename to frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-right.art diff --git a/src/assets/bp/p/pinkie pie/crystal-pinkie-right.gif b/frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/crystal-pinkie-right.gif rename to frontend/src/assets/bp/p/pinkie pie/crystal-pinkie-right.gif diff --git a/src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/cupcake_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/drag_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/drag_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/drag_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/drag_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/drag_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/drag_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/drag_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/drag_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/epic_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/epic_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/epic_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/epic_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/epic_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/epic_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/epic_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/epic_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/flower1_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/flower1_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower1_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/flower1_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/flower1_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/flower1_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower1_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/flower1_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/flower2_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/flower2_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower2_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/flower2_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/flower2_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/flower2_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower2_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/flower2_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/flower3_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/flower3_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower3_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/flower3_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/flower3_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/flower3_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower3_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/flower3_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/flower4mix_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/flower5mix_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/flower6_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/flower6_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower6_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/flower6_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/flower6_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/flower6_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower6_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/flower6_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/flower7_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/flower7_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower7_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/flower7_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/flower7_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/flower7_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/flower7_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/flower7_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/fluttercuddles_links.gif b/frontend/src/assets/bp/p/pinkie pie/fluttercuddles_links.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/fluttercuddles_links.gif rename to frontend/src/assets/bp/p/pinkie pie/fluttercuddles_links.gif diff --git a/src/assets/bp/p/pinkie pie/fluttercuddles_right.gif b/frontend/src/assets/bp/p/pinkie pie/fluttercuddles_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/fluttercuddles_right.gif rename to frontend/src/assets/bp/p/pinkie pie/fluttercuddles_right.gif diff --git a/src/assets/bp/p/pinkie pie/fly_left.gif b/frontend/src/assets/bp/p/pinkie pie/fly_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/fly_left.gif rename to frontend/src/assets/bp/p/pinkie pie/fly_left.gif diff --git a/src/assets/bp/p/pinkie pie/fly_right.gif b/frontend/src/assets/bp/p/pinkie pie/fly_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/fly_right.gif rename to frontend/src/assets/bp/p/pinkie pie/fly_right.gif diff --git a/src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_end_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_salto_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/front_flip_full_twist_start_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left_n_n.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left_n_n.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left_n_n.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_left_n_n.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right_n_n.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right_n_n.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right_n_n.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_bounce_right_n_n.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_idle_left.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_idle_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_idle_left.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_idle_left.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_idle_right.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_idle_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_idle_right.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_idle_right.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_trot_left.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_trot_left.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_left.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_trot_left_n_n_.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_left_n_n_.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_trot_left_n_n_.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_left_n_n_.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_trot_right.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_trot_right.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_right.gif diff --git a/src/assets/bp/p/pinkie pie/gala_pinkie_trot_right_n_n.gif b/frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_right_n_n.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/gala_pinkie_trot_right_n_n.gif rename to frontend/src/assets/bp/p/pinkie pie/gala_pinkie_trot_right_n_n.gif diff --git a/src/assets/bp/p/pinkie pie/giggle_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/giggle_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/giggle_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/giggle_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/giggle_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/giggle_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/giggle_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/giggle_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/goovy_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/goovy_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/goovy_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/goovy_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/goovy_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/goovy_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/goovy_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/goovy_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/haters_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/haters_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/haters_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/haters_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/haters_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/haters_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/haters_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/haters_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/hatersstart_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/hatersstop_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/hickup2_start_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/hickup_start_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/hickup_stop_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/jumpy_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/jumpy_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/jumpy_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/jumpy_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/jumpy_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/jumpy_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/jumpy_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/jumpy_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/mouse_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/mouse_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/mouse_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/mouse_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/mouse_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/mouse_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/mouse_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/mouse_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/oink_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/oink_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oink_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/oink_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/oink_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/oink_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oink_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/oink_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/oinkend_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/oinkoinkoinktail_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/oinkstart_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/parasoloff_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/parasolon_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/paraspritestart_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/paraspritestop_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/partycannon_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/pinkacopter_left.gif b/frontend/src/assets/bp/p/pinkie pie/pinkacopter_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/pinkacopter_left.gif rename to frontend/src/assets/bp/p/pinkie pie/pinkacopter_left.gif diff --git a/src/assets/bp/p/pinkie pie/pinkacopter_right.gif b/frontend/src/assets/bp/p/pinkie pie/pinkacopter_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/pinkacopter_right.gif rename to frontend/src/assets/bp/p/pinkie pie/pinkacopter_right.gif diff --git a/src/assets/bp/p/pinkie pie/pinkie_galopp_left.gif b/frontend/src/assets/bp/p/pinkie pie/pinkie_galopp_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/pinkie_galopp_left.gif rename to frontend/src/assets/bp/p/pinkie pie/pinkie_galopp_left.gif diff --git a/src/assets/bp/p/pinkie pie/pinkie_galopp_right.gif b/frontend/src/assets/bp/p/pinkie pie/pinkie_galopp_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/pinkie_galopp_right.gif rename to frontend/src/assets/bp/p/pinkie pie/pinkie_galopp_right.gif diff --git a/src/assets/bp/p/pinkie pie/pony.ini b/frontend/src/assets/bp/p/pinkie pie/pony.ini similarity index 100% rename from src/assets/bp/p/pinkie pie/pony.ini rename to frontend/src/assets/bp/p/pinkie pie/pony.ini diff --git a/src/assets/bp/p/pinkie pie/pose_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/pose_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/pose_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/pose_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/pose_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/pose_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/pose_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/pose_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/princess_pinkie_left.gif b/frontend/src/assets/bp/p/pinkie pie/princess_pinkie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/princess_pinkie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/princess_pinkie_left.gif diff --git a/src/assets/bp/p/pinkie pie/princess_pinkie_right.gif b/frontend/src/assets/bp/p/pinkie pie/princess_pinkie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/princess_pinkie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/princess_pinkie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl2_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl_hickup2mix_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl_hickup3_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rofl_hickup_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rofls2_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rofls2start_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rofls2stop_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/roflsit_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rollend_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rollend_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollend_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rollend_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rollend_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rollend_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollend_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rollend_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rollfinish_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rolljump_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rolljump_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rolljump_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rolljump_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rolljump_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rolljump_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rolljump_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rolljump_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rollsequence_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rollstart_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rollstart_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollstart_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rollstart_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rollstart_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rollstart_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rollstart_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rollstart_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/rolltransition_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/run_twitchy_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/salto_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/salto_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/salto_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/salto_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/salto_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/salto_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/salto_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/salto_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/saltoend_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/saltostart_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sit_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sit_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sit_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sit_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sit_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sit_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sit_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sit_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sittinggiggle_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sleep1_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sleep2_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezecute_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezefly_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezestart_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sneezestop_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/sonic_pinksneeze2_left.gif b/frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze2_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sonic_pinksneeze2_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze2_left.gif diff --git a/src/assets/bp/p/pinkie pie/sonic_pinksneeze2_right.gif b/frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze2_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sonic_pinksneeze2_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze2_right.gif diff --git a/src/assets/bp/p/pinkie pie/sonic_pinksneeze_left.gif b/frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sonic_pinksneeze_left.gif rename to frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze_left.gif diff --git a/src/assets/bp/p/pinkie pie/sonic_pinksneeze_right.gif b/frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sonic_pinksneeze_right.gif rename to frontend/src/assets/bp/p/pinkie pie/sonic_pinksneeze_right.gif diff --git a/src/assets/bp/p/pinkie pie/sparkle.art b/frontend/src/assets/bp/p/pinkie pie/sparkle.art similarity index 100% rename from src/assets/bp/p/pinkie pie/sparkle.art rename to frontend/src/assets/bp/p/pinkie pie/sparkle.art diff --git a/src/assets/bp/p/pinkie pie/sparkle.gif b/frontend/src/assets/bp/p/pinkie pie/sparkle.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/sparkle.gif rename to frontend/src/assets/bp/p/pinkie pie/sparkle.gif diff --git a/src/assets/bp/p/pinkie pie/stand_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/stand_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/stand_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/stand_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/stand_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/stand_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/stand_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/stand_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/teleporreapear_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/teleportmove_pinkie_pie.gif b/frontend/src/assets/bp/p/pinkie pie/teleportmove_pinkie_pie.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/teleportmove_pinkie_pie.gif rename to frontend/src/assets/bp/p/pinkie pie/teleportmove_pinkie_pie.gif diff --git a/src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/teleportstart_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/tom.gif b/frontend/src/assets/bp/p/pinkie pie/tom.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/tom.gif rename to frontend/src/assets/bp/p/pinkie pie/tom.gif diff --git a/src/assets/bp/p/pinkie pie/tongue_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/tongue_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/tongue_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/tongue_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/tongue_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/tongue_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/tongue_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/tongue_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/tonguedance_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/trotcycle_parade_left.gif b/frontend/src/assets/bp/p/pinkie pie/trotcycle_parade_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/trotcycle_parade_left.gif rename to frontend/src/assets/bp/p/pinkie pie/trotcycle_parade_left.gif diff --git a/src/assets/bp/p/pinkie pie/trotcycle_parade_right.gif b/frontend/src/assets/bp/p/pinkie pie/trotcycle_parade_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/trotcycle_parade_right.gif rename to frontend/src/assets/bp/p/pinkie pie/trotcycle_parade_right.gif diff --git a/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left.gif b/frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left.gif diff --git a/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left_n_n.gif b/frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left_n_n.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left_n_n.gif rename to frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_left_n_n.gif diff --git a/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right.gif b/frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right.gif diff --git a/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right_n_n.gif b/frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right_n_n.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right_n_n.gif rename to frontend/src/assets/bp/p/pinkie pie/trotcycle_pinkiepie_right_n_n.gif diff --git a/src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/twitchytail_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/walk_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/walk_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/walk_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/walk_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/walk_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/walk_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/walk_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/walk_pinkie_pie_right.gif diff --git a/src/assets/bp/p/pinkie pie/wink_pinkie_pie_left.gif b/frontend/src/assets/bp/p/pinkie pie/wink_pinkie_pie_left.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/wink_pinkie_pie_left.gif rename to frontend/src/assets/bp/p/pinkie pie/wink_pinkie_pie_left.gif diff --git a/src/assets/bp/p/pinkie pie/wink_pinkie_pie_right.gif b/frontend/src/assets/bp/p/pinkie pie/wink_pinkie_pie_right.gif similarity index 100% rename from src/assets/bp/p/pinkie pie/wink_pinkie_pie_right.gif rename to frontend/src/assets/bp/p/pinkie pie/wink_pinkie_pie_right.gif diff --git a/src/assets/bp/p/rainbow dash/beep_left.gif b/frontend/src/assets/bp/p/rainbow dash/beep_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/beep_left.gif rename to frontend/src/assets/bp/p/rainbow dash/beep_left.gif diff --git a/src/assets/bp/p/rainbow dash/beep_right.gif b/frontend/src/assets/bp/p/rainbow dash/beep_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/beep_right.gif rename to frontend/src/assets/bp/p/rainbow dash/beep_right.gif diff --git a/src/assets/bp/p/rainbow dash/cloud_jump_left.gif b/frontend/src/assets/bp/p/rainbow dash/cloud_jump_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/cloud_jump_left.gif rename to frontend/src/assets/bp/p/rainbow dash/cloud_jump_left.gif diff --git a/src/assets/bp/p/rainbow dash/cloud_jump_right.gif b/frontend/src/assets/bp/p/rainbow dash/cloud_jump_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/cloud_jump_right.gif rename to frontend/src/assets/bp/p/rainbow dash/cloud_jump_right.gif diff --git a/src/assets/bp/p/rainbow dash/cloud_sleep_left.gif b/frontend/src/assets/bp/p/rainbow dash/cloud_sleep_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/cloud_sleep_left.gif rename to frontend/src/assets/bp/p/rainbow dash/cloud_sleep_left.gif diff --git a/src/assets/bp/p/rainbow dash/cloud_sleep_right.gif b/frontend/src/assets/bp/p/rainbow dash/cloud_sleep_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/cloud_sleep_right.gif rename to frontend/src/assets/bp/p/rainbow dash/cloud_sleep_right.gif diff --git a/src/assets/bp/p/rainbow dash/congarainbowdash_left.gif b/frontend/src/assets/bp/p/rainbow dash/congarainbowdash_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/congarainbowdash_left.gif rename to frontend/src/assets/bp/p/rainbow dash/congarainbowdash_left.gif diff --git a/src/assets/bp/p/rainbow dash/congarainbowdash_right.gif b/frontend/src/assets/bp/p/rainbow dash/congarainbowdash_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/congarainbowdash_right.gif rename to frontend/src/assets/bp/p/rainbow dash/congarainbowdash_right.gif diff --git a/src/assets/bp/p/rainbow dash/crystallizedrainbow_left.png b/frontend/src/assets/bp/p/rainbow dash/crystallizedrainbow_left.png similarity index 100% rename from src/assets/bp/p/rainbow dash/crystallizedrainbow_left.png rename to frontend/src/assets/bp/p/rainbow dash/crystallizedrainbow_left.png diff --git a/src/assets/bp/p/rainbow dash/crystallizedrainbow_right.png b/frontend/src/assets/bp/p/rainbow dash/crystallizedrainbow_right.png similarity index 100% rename from src/assets/bp/p/rainbow dash/crystallizedrainbow_right.png rename to frontend/src/assets/bp/p/rainbow dash/crystallizedrainbow_right.png diff --git a/src/assets/bp/p/rainbow dash/dashing_left.gif b/frontend/src/assets/bp/p/rainbow dash/dashing_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/dashing_left.gif rename to frontend/src/assets/bp/p/rainbow dash/dashing_left.gif diff --git a/src/assets/bp/p/rainbow dash/dashing_right.gif b/frontend/src/assets/bp/p/rainbow dash/dashing_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/dashing_right.gif rename to frontend/src/assets/bp/p/rainbow dash/dashing_right.gif diff --git a/src/assets/bp/p/rainbow dash/dinodash3_left.gif b/frontend/src/assets/bp/p/rainbow dash/dinodash3_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/dinodash3_left.gif rename to frontend/src/assets/bp/p/rainbow dash/dinodash3_left.gif diff --git a/src/assets/bp/p/rainbow dash/dinodash3_right.gif b/frontend/src/assets/bp/p/rainbow dash/dinodash3_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/dinodash3_right.gif rename to frontend/src/assets/bp/p/rainbow dash/dinodash3_right.gif diff --git a/src/assets/bp/p/rainbow dash/fly_dizzy.gif b/frontend/src/assets/bp/p/rainbow dash/fly_dizzy.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/fly_dizzy.gif rename to frontend/src/assets/bp/p/rainbow dash/fly_dizzy.gif diff --git a/src/assets/bp/p/rainbow dash/fly_dizzy_right.gif b/frontend/src/assets/bp/p/rainbow dash/fly_dizzy_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/fly_dizzy_right.gif rename to frontend/src/assets/bp/p/rainbow dash/fly_dizzy_right.gif diff --git a/src/assets/bp/p/rainbow dash/fly_rainbow_left.gif b/frontend/src/assets/bp/p/rainbow dash/fly_rainbow_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/fly_rainbow_left.gif rename to frontend/src/assets/bp/p/rainbow dash/fly_rainbow_left.gif diff --git a/src/assets/bp/p/rainbow dash/fly_rainbow_right.gif b/frontend/src/assets/bp/p/rainbow dash/fly_rainbow_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/fly_rainbow_right.gif rename to frontend/src/assets/bp/p/rainbow dash/fly_rainbow_right.gif diff --git a/src/assets/bp/p/rainbow dash/flyzoom_rainbow_left.gif b/frontend/src/assets/bp/p/rainbow dash/flyzoom_rainbow_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/flyzoom_rainbow_left.gif rename to frontend/src/assets/bp/p/rainbow dash/flyzoom_rainbow_left.gif diff --git a/src/assets/bp/p/rainbow dash/flyzoom_rainbow_right.gif b/frontend/src/assets/bp/p/rainbow dash/flyzoom_rainbow_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/flyzoom_rainbow_right.gif rename to frontend/src/assets/bp/p/rainbow dash/flyzoom_rainbow_right.gif diff --git a/src/assets/bp/p/rainbow dash/hoverupdown_rainbow_left.gif b/frontend/src/assets/bp/p/rainbow dash/hoverupdown_rainbow_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/hoverupdown_rainbow_left.gif rename to frontend/src/assets/bp/p/rainbow dash/hoverupdown_rainbow_left.gif diff --git a/src/assets/bp/p/rainbow dash/hoverupdown_rainbow_right.gif b/frontend/src/assets/bp/p/rainbow dash/hoverupdown_rainbow_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/hoverupdown_rainbow_right.gif rename to frontend/src/assets/bp/p/rainbow dash/hoverupdown_rainbow_right.gif diff --git a/src/assets/bp/p/rainbow dash/pony.ini b/frontend/src/assets/bp/p/rainbow dash/pony.ini similarity index 100% rename from src/assets/bp/p/rainbow dash/pony.ini rename to frontend/src/assets/bp/p/rainbow dash/pony.ini diff --git a/src/assets/bp/p/rainbow dash/rainboomtest.gif b/frontend/src/assets/bp/p/rainbow dash/rainboomtest.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rainboomtest.gif rename to frontend/src/assets/bp/p/rainbow dash/rainboomtest.gif diff --git a/src/assets/bp/p/rainbow dash/rainboomtest_trail_left.gif b/frontend/src/assets/bp/p/rainbow dash/rainboomtest_trail_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rainboomtest_trail_left.gif rename to frontend/src/assets/bp/p/rainbow dash/rainboomtest_trail_left.gif diff --git a/src/assets/bp/p/rainbow dash/rainboomtest_trail_right.gif b/frontend/src/assets/bp/p/rainbow dash/rainboomtest_trail_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rainboomtest_trail_right.gif rename to frontend/src/assets/bp/p/rainbow dash/rainboomtest_trail_right.gif diff --git a/src/assets/bp/p/rainbow dash/rainbow_dash_motivate_left.gif b/frontend/src/assets/bp/p/rainbow dash/rainbow_dash_motivate_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rainbow_dash_motivate_left.gif rename to frontend/src/assets/bp/p/rainbow dash/rainbow_dash_motivate_left.gif diff --git a/src/assets/bp/p/rainbow dash/rainbow_dash_motivate_right.gif b/frontend/src/assets/bp/p/rainbow dash/rainbow_dash_motivate_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rainbow_dash_motivate_right.gif rename to frontend/src/assets/bp/p/rainbow dash/rainbow_dash_motivate_right.gif diff --git a/src/assets/bp/p/rainbow dash/rainbow_dash_salute.gif b/frontend/src/assets/bp/p/rainbow dash/rainbow_dash_salute.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rainbow_dash_salute.gif rename to frontend/src/assets/bp/p/rainbow dash/rainbow_dash_salute.gif diff --git a/src/assets/bp/p/rainbow dash/rd_dragged_left1.gif b/frontend/src/assets/bp/p/rainbow dash/rd_dragged_left1.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rd_dragged_left1.gif rename to frontend/src/assets/bp/p/rainbow dash/rd_dragged_left1.gif diff --git a/src/assets/bp/p/rainbow dash/rd_dragged_right1.gif b/frontend/src/assets/bp/p/rainbow dash/rd_dragged_right1.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/rd_dragged_right1.gif rename to frontend/src/assets/bp/p/rainbow dash/rd_dragged_right1.gif diff --git a/src/assets/bp/p/rainbow dash/rd_galla_left.png b/frontend/src/assets/bp/p/rainbow dash/rd_galla_left.png similarity index 100% rename from src/assets/bp/p/rainbow dash/rd_galla_left.png rename to frontend/src/assets/bp/p/rainbow dash/rd_galla_left.png diff --git a/src/assets/bp/p/rainbow dash/rd_galla_right.png b/frontend/src/assets/bp/p/rainbow dash/rd_galla_right.png similarity index 100% rename from src/assets/bp/p/rainbow dash/rd_galla_right.png rename to frontend/src/assets/bp/p/rainbow dash/rd_galla_right.png diff --git a/src/assets/bp/p/rainbow dash/sparkle.art b/frontend/src/assets/bp/p/rainbow dash/sparkle.art similarity index 100% rename from src/assets/bp/p/rainbow dash/sparkle.art rename to frontend/src/assets/bp/p/rainbow dash/sparkle.art diff --git a/src/assets/bp/p/rainbow dash/sparkle.gif b/frontend/src/assets/bp/p/rainbow dash/sparkle.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/sparkle.gif rename to frontend/src/assets/bp/p/rainbow dash/sparkle.gif diff --git a/src/assets/bp/p/rainbow dash/stand_rainbow_left.gif b/frontend/src/assets/bp/p/rainbow dash/stand_rainbow_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/stand_rainbow_left.gif rename to frontend/src/assets/bp/p/rainbow dash/stand_rainbow_left.gif diff --git a/src/assets/bp/p/rainbow dash/stand_rainbow_right.gif b/frontend/src/assets/bp/p/rainbow dash/stand_rainbow_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/stand_rainbow_right.gif rename to frontend/src/assets/bp/p/rainbow dash/stand_rainbow_right.gif diff --git a/src/assets/bp/p/rainbow dash/trotcycle_rainbow_left.gif b/frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/trotcycle_rainbow_left.gif rename to frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_left.gif diff --git a/src/assets/bp/p/rainbow dash/trotcycle_rainbow_right.gif b/frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/trotcycle_rainbow_right.gif rename to frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_right.gif diff --git a/src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_left.gif b/frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_left.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_left.gif rename to frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_left.gif diff --git a/src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_right.gif b/frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_right.gif similarity index 100% rename from src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_right.gif rename to frontend/src/assets/bp/p/rainbow dash/trotcycle_rainbow_wing_right.gif diff --git a/src/assets/bp/p/rarity/congararity_left.gif b/frontend/src/assets/bp/p/rarity/congararity_left.gif similarity index 100% rename from src/assets/bp/p/rarity/congararity_left.gif rename to frontend/src/assets/bp/p/rarity/congararity_left.gif diff --git a/src/assets/bp/p/rarity/congararity_right.gif b/frontend/src/assets/bp/p/rarity/congararity_right.gif similarity index 100% rename from src/assets/bp/p/rarity/congararity_right.gif rename to frontend/src/assets/bp/p/rarity/congararity_right.gif diff --git a/src/assets/bp/p/rarity/crystal-rarity-left.art b/frontend/src/assets/bp/p/rarity/crystal-rarity-left.art similarity index 100% rename from src/assets/bp/p/rarity/crystal-rarity-left.art rename to frontend/src/assets/bp/p/rarity/crystal-rarity-left.art diff --git a/src/assets/bp/p/rarity/crystal-rarity-left.gif b/frontend/src/assets/bp/p/rarity/crystal-rarity-left.gif similarity index 100% rename from src/assets/bp/p/rarity/crystal-rarity-left.gif rename to frontend/src/assets/bp/p/rarity/crystal-rarity-left.gif diff --git a/src/assets/bp/p/rarity/crystal-rarity-right.art b/frontend/src/assets/bp/p/rarity/crystal-rarity-right.art similarity index 100% rename from src/assets/bp/p/rarity/crystal-rarity-right.art rename to frontend/src/assets/bp/p/rarity/crystal-rarity-right.art diff --git a/src/assets/bp/p/rarity/crystal-rarity-right.gif b/frontend/src/assets/bp/p/rarity/crystal-rarity-right.gif similarity index 100% rename from src/assets/bp/p/rarity/crystal-rarity-right.gif rename to frontend/src/assets/bp/p/rarity/crystal-rarity-right.gif diff --git a/src/assets/bp/p/rarity/fashion_show_left.gif b/frontend/src/assets/bp/p/rarity/fashion_show_left.gif similarity index 100% rename from src/assets/bp/p/rarity/fashion_show_left.gif rename to frontend/src/assets/bp/p/rarity/fashion_show_left.gif diff --git a/src/assets/bp/p/rarity/fashion_show_right.gif b/frontend/src/assets/bp/p/rarity/fashion_show_right.gif similarity index 100% rename from src/assets/bp/p/rarity/fashion_show_right.gif rename to frontend/src/assets/bp/p/rarity/fashion_show_right.gif diff --git a/src/assets/bp/p/rarity/fly1-left.art b/frontend/src/assets/bp/p/rarity/fly1-left.art similarity index 100% rename from src/assets/bp/p/rarity/fly1-left.art rename to frontend/src/assets/bp/p/rarity/fly1-left.art diff --git a/src/assets/bp/p/rarity/fly1-left.gif b/frontend/src/assets/bp/p/rarity/fly1-left.gif similarity index 100% rename from src/assets/bp/p/rarity/fly1-left.gif rename to frontend/src/assets/bp/p/rarity/fly1-left.gif diff --git a/src/assets/bp/p/rarity/fly1-right.art b/frontend/src/assets/bp/p/rarity/fly1-right.art similarity index 100% rename from src/assets/bp/p/rarity/fly1-right.art rename to frontend/src/assets/bp/p/rarity/fly1-right.art diff --git a/src/assets/bp/p/rarity/fly1-right.gif b/frontend/src/assets/bp/p/rarity/fly1-right.gif similarity index 100% rename from src/assets/bp/p/rarity/fly1-right.gif rename to frontend/src/assets/bp/p/rarity/fly1-right.gif diff --git a/src/assets/bp/p/rarity/fly2-left.art b/frontend/src/assets/bp/p/rarity/fly2-left.art similarity index 100% rename from src/assets/bp/p/rarity/fly2-left.art rename to frontend/src/assets/bp/p/rarity/fly2-left.art diff --git a/src/assets/bp/p/rarity/fly2-left.gif b/frontend/src/assets/bp/p/rarity/fly2-left.gif similarity index 100% rename from src/assets/bp/p/rarity/fly2-left.gif rename to frontend/src/assets/bp/p/rarity/fly2-left.gif diff --git a/src/assets/bp/p/rarity/fly2-right.art b/frontend/src/assets/bp/p/rarity/fly2-right.art similarity index 100% rename from src/assets/bp/p/rarity/fly2-right.art rename to frontend/src/assets/bp/p/rarity/fly2-right.art diff --git a/src/assets/bp/p/rarity/fly2-right.gif b/frontend/src/assets/bp/p/rarity/fly2-right.gif similarity index 100% rename from src/assets/bp/p/rarity/fly2-right.gif rename to frontend/src/assets/bp/p/rarity/fly2-right.gif diff --git a/src/assets/bp/p/rarity/fly_left.gif b/frontend/src/assets/bp/p/rarity/fly_left.gif similarity index 100% rename from src/assets/bp/p/rarity/fly_left.gif rename to frontend/src/assets/bp/p/rarity/fly_left.gif diff --git a/src/assets/bp/p/rarity/fly_right.gif b/frontend/src/assets/bp/p/rarity/fly_right.gif similarity index 100% rename from src/assets/bp/p/rarity/fly_right.gif rename to frontend/src/assets/bp/p/rarity/fly_right.gif diff --git a/src/assets/bp/p/rarity/horn_left.gif b/frontend/src/assets/bp/p/rarity/horn_left.gif similarity index 100% rename from src/assets/bp/p/rarity/horn_left.gif rename to frontend/src/assets/bp/p/rarity/horn_left.gif diff --git a/src/assets/bp/p/rarity/horn_right.gif b/frontend/src/assets/bp/p/rarity/horn_right.gif similarity index 100% rename from src/assets/bp/p/rarity/horn_right.gif rename to frontend/src/assets/bp/p/rarity/horn_right.gif diff --git a/src/assets/bp/p/rarity/ponder_left.gif b/frontend/src/assets/bp/p/rarity/ponder_left.gif similarity index 100% rename from src/assets/bp/p/rarity/ponder_left.gif rename to frontend/src/assets/bp/p/rarity/ponder_left.gif diff --git a/src/assets/bp/p/rarity/ponder_right.gif b/frontend/src/assets/bp/p/rarity/ponder_right.gif similarity index 100% rename from src/assets/bp/p/rarity/ponder_right.gif rename to frontend/src/assets/bp/p/rarity/ponder_right.gif diff --git a/src/assets/bp/p/rarity/pony.ini b/frontend/src/assets/bp/p/rarity/pony.ini similarity index 100% rename from src/assets/bp/p/rarity/pony.ini rename to frontend/src/assets/bp/p/rarity/pony.ini diff --git a/src/assets/bp/p/rarity/rarity-c-drag-left.gif b/frontend/src/assets/bp/p/rarity/rarity-c-drag-left.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-drag-left.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-drag-left.gif diff --git a/src/assets/bp/p/rarity/rarity-c-drag-right.gif b/frontend/src/assets/bp/p/rarity/rarity-c-drag-right.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-drag-right.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-drag-right.gif diff --git a/src/assets/bp/p/rarity/rarity-c-idle-left.gif b/frontend/src/assets/bp/p/rarity/rarity-c-idle-left.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-idle-left.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-idle-left.gif diff --git a/src/assets/bp/p/rarity/rarity-c-idle-right.gif b/frontend/src/assets/bp/p/rarity/rarity-c-idle-right.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-idle-right.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-idle-right.gif diff --git a/src/assets/bp/p/rarity/rarity-c-scratch-left.gif b/frontend/src/assets/bp/p/rarity/rarity-c-scratch-left.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-scratch-left.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-scratch-left.gif diff --git a/src/assets/bp/p/rarity/rarity-c-scratch-right.gif b/frontend/src/assets/bp/p/rarity/rarity-c-scratch-right.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-scratch-right.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-scratch-right.gif diff --git a/src/assets/bp/p/rarity/rarity-c-trot-left.gif b/frontend/src/assets/bp/p/rarity/rarity-c-trot-left.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-trot-left.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-trot-left.gif diff --git a/src/assets/bp/p/rarity/rarity-c-trot-right.gif b/frontend/src/assets/bp/p/rarity/rarity-c-trot-right.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity-c-trot-right.gif rename to frontend/src/assets/bp/p/rarity/rarity-c-trot-right.gif diff --git a/src/assets/bp/p/rarity/rarity_drag-left.gif b/frontend/src/assets/bp/p/rarity/rarity_drag-left.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_drag-left.gif rename to frontend/src/assets/bp/p/rarity/rarity_drag-left.gif diff --git a/src/assets/bp/p/rarity/rarity_drag-right.gif b/frontend/src/assets/bp/p/rarity/rarity_drag-right.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_drag-right.gif rename to frontend/src/assets/bp/p/rarity/rarity_drag-right.gif diff --git a/src/assets/bp/p/rarity/rarity_dramacouch_left1.gif b/frontend/src/assets/bp/p/rarity/rarity_dramacouch_left1.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_dramacouch_left1.gif rename to frontend/src/assets/bp/p/rarity/rarity_dramacouch_left1.gif diff --git a/src/assets/bp/p/rarity/rarity_dramacouch_right1.gif b/frontend/src/assets/bp/p/rarity/rarity_dramacouch_right1.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_dramacouch_right1.gif rename to frontend/src/assets/bp/p/rarity/rarity_dramacouch_right1.gif diff --git a/src/assets/bp/p/rarity/rarity_galla_left.gif b/frontend/src/assets/bp/p/rarity/rarity_galla_left.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_galla_left.gif rename to frontend/src/assets/bp/p/rarity/rarity_galla_left.gif diff --git a/src/assets/bp/p/rarity/rarity_galla_right.gif b/frontend/src/assets/bp/p/rarity/rarity_galla_right.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_galla_right.gif rename to frontend/src/assets/bp/p/rarity/rarity_galla_right.gif diff --git a/src/assets/bp/p/rarity/rarity_tantrum_left.gif b/frontend/src/assets/bp/p/rarity/rarity_tantrum_left.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_tantrum_left.gif rename to frontend/src/assets/bp/p/rarity/rarity_tantrum_left.gif diff --git a/src/assets/bp/p/rarity/rarity_tantrum_right.gif b/frontend/src/assets/bp/p/rarity/rarity_tantrum_right.gif similarity index 100% rename from src/assets/bp/p/rarity/rarity_tantrum_right.gif rename to frontend/src/assets/bp/p/rarity/rarity_tantrum_right.gif diff --git a/src/assets/bp/p/rarity/sleep_left.gif b/frontend/src/assets/bp/p/rarity/sleep_left.gif similarity index 100% rename from src/assets/bp/p/rarity/sleep_left.gif rename to frontend/src/assets/bp/p/rarity/sleep_left.gif diff --git a/src/assets/bp/p/rarity/sleep_left_cover.gif b/frontend/src/assets/bp/p/rarity/sleep_left_cover.gif similarity index 100% rename from src/assets/bp/p/rarity/sleep_left_cover.gif rename to frontend/src/assets/bp/p/rarity/sleep_left_cover.gif diff --git a/src/assets/bp/p/rarity/sleep_right.gif b/frontend/src/assets/bp/p/rarity/sleep_right.gif similarity index 100% rename from src/assets/bp/p/rarity/sleep_right.gif rename to frontend/src/assets/bp/p/rarity/sleep_right.gif diff --git a/src/assets/bp/p/rarity/sleep_right_cover.gif b/frontend/src/assets/bp/p/rarity/sleep_right_cover.gif similarity index 100% rename from src/assets/bp/p/rarity/sleep_right_cover.gif rename to frontend/src/assets/bp/p/rarity/sleep_right_cover.gif diff --git a/src/assets/bp/p/rarity/sparkle.art b/frontend/src/assets/bp/p/rarity/sparkle.art similarity index 100% rename from src/assets/bp/p/rarity/sparkle.art rename to frontend/src/assets/bp/p/rarity/sparkle.art diff --git a/src/assets/bp/p/rarity/sparkle.gif b/frontend/src/assets/bp/p/rarity/sparkle.gif similarity index 100% rename from src/assets/bp/p/rarity/sparkle.gif rename to frontend/src/assets/bp/p/rarity/sparkle.gif diff --git a/src/assets/bp/p/rarity/stand_rarity_left.gif b/frontend/src/assets/bp/p/rarity/stand_rarity_left.gif similarity index 100% rename from src/assets/bp/p/rarity/stand_rarity_left.gif rename to frontend/src/assets/bp/p/rarity/stand_rarity_left.gif diff --git a/src/assets/bp/p/rarity/stand_rarity_right.gif b/frontend/src/assets/bp/p/rarity/stand_rarity_right.gif similarity index 100% rename from src/assets/bp/p/rarity/stand_rarity_right.gif rename to frontend/src/assets/bp/p/rarity/stand_rarity_right.gif diff --git a/src/assets/bp/p/rarity/trotcycle_rarity_left.gif b/frontend/src/assets/bp/p/rarity/trotcycle_rarity_left.gif similarity index 100% rename from src/assets/bp/p/rarity/trotcycle_rarity_left.gif rename to frontend/src/assets/bp/p/rarity/trotcycle_rarity_left.gif diff --git a/src/assets/bp/p/rarity/trotcycle_rarity_right.gif b/frontend/src/assets/bp/p/rarity/trotcycle_rarity_right.gif similarity index 100% rename from src/assets/bp/p/rarity/trotcycle_rarity_right.gif rename to frontend/src/assets/bp/p/rarity/trotcycle_rarity_right.gif diff --git a/src/assets/bp/p/twilight sparkle/arrive_left.gif b/frontend/src/assets/bp/p/twilight sparkle/arrive_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/arrive_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/arrive_left.gif diff --git a/src/assets/bp/p/twilight sparkle/arrive_right.gif b/frontend/src/assets/bp/p/twilight sparkle/arrive_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/arrive_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/arrive_right.gif diff --git a/src/assets/bp/p/twilight sparkle/breakdown_left.gif b/frontend/src/assets/bp/p/twilight sparkle/breakdown_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/breakdown_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/breakdown_left.gif diff --git a/src/assets/bp/p/twilight sparkle/breakdown_right.gif b/frontend/src/assets/bp/p/twilight sparkle/breakdown_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/breakdown_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/breakdown_right.gif diff --git a/src/assets/bp/p/twilight sparkle/congatwilight_left.gif b/frontend/src/assets/bp/p/twilight sparkle/congatwilight_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/congatwilight_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/congatwilight_left.gif diff --git a/src/assets/bp/p/twilight sparkle/congatwilight_right.gif b/frontend/src/assets/bp/p/twilight sparkle/congatwilight_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/congatwilight_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/congatwilight_right.gif diff --git a/src/assets/bp/p/twilight sparkle/crystallizedtwilight_left.png b/frontend/src/assets/bp/p/twilight sparkle/crystallizedtwilight_left.png similarity index 100% rename from src/assets/bp/p/twilight sparkle/crystallizedtwilight_left.png rename to frontend/src/assets/bp/p/twilight sparkle/crystallizedtwilight_left.png diff --git a/src/assets/bp/p/twilight sparkle/crystallizedtwilight_right.png b/frontend/src/assets/bp/p/twilight sparkle/crystallizedtwilight_right.png similarity index 100% rename from src/assets/bp/p/twilight sparkle/crystallizedtwilight_right.png rename to frontend/src/assets/bp/p/twilight sparkle/crystallizedtwilight_right.png diff --git a/src/assets/bp/p/twilight sparkle/discorded_left.gif b/frontend/src/assets/bp/p/twilight sparkle/discorded_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/discorded_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/discorded_left.gif diff --git a/src/assets/bp/p/twilight sparkle/discorded_right.gif b/frontend/src/assets/bp/p/twilight sparkle/discorded_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/discorded_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/discorded_right.gif diff --git a/src/assets/bp/p/twilight sparkle/magic_twilight_left.gif b/frontend/src/assets/bp/p/twilight sparkle/magic_twilight_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/magic_twilight_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/magic_twilight_left.gif diff --git a/src/assets/bp/p/twilight sparkle/magic_twilight_right.gif b/frontend/src/assets/bp/p/twilight sparkle/magic_twilight_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/magic_twilight_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/magic_twilight_right.gif diff --git a/src/assets/bp/p/twilight sparkle/pony.ini b/frontend/src/assets/bp/p/twilight sparkle/pony.ini similarity index 100% rename from src/assets/bp/p/twilight sparkle/pony.ini rename to frontend/src/assets/bp/p/twilight sparkle/pony.ini diff --git a/src/assets/bp/p/twilight sparkle/read.gif b/frontend/src/assets/bp/p/twilight sparkle/read.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/read.gif rename to frontend/src/assets/bp/p/twilight sparkle/read.gif diff --git a/src/assets/bp/p/twilight sparkle/sparkle.art b/frontend/src/assets/bp/p/twilight sparkle/sparkle.art similarity index 100% rename from src/assets/bp/p/twilight sparkle/sparkle.art rename to frontend/src/assets/bp/p/twilight sparkle/sparkle.art diff --git a/src/assets/bp/p/twilight sparkle/sparkle.gif b/frontend/src/assets/bp/p/twilight sparkle/sparkle.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/sparkle.gif rename to frontend/src/assets/bp/p/twilight sparkle/sparkle.gif diff --git a/src/assets/bp/p/twilight sparkle/stand_twilight_left.gif b/frontend/src/assets/bp/p/twilight sparkle/stand_twilight_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/stand_twilight_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/stand_twilight_left.gif diff --git a/src/assets/bp/p/twilight sparkle/stand_twilight_right.gif b/frontend/src/assets/bp/p/twilight sparkle/stand_twilight_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/stand_twilight_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/stand_twilight_right.gif diff --git a/src/assets/bp/p/twilight sparkle/teleport_left.gif b/frontend/src/assets/bp/p/twilight sparkle/teleport_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/teleport_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/teleport_left.gif diff --git a/src/assets/bp/p/twilight sparkle/teleport_right.gif b/frontend/src/assets/bp/p/twilight sparkle/teleport_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/teleport_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/teleport_right.gif diff --git a/src/assets/bp/p/twilight sparkle/transit.gif b/frontend/src/assets/bp/p/twilight sparkle/transit.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/transit.gif rename to frontend/src/assets/bp/p/twilight sparkle/transit.gif diff --git a/src/assets/bp/p/twilight sparkle/trotcycle_twilight_right.gif b/frontend/src/assets/bp/p/twilight sparkle/trotcycle_twilight_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/trotcycle_twilight_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/trotcycle_twilight_right.gif diff --git a/src/assets/bp/p/twilight sparkle/twi-balloon-left.art b/frontend/src/assets/bp/p/twilight sparkle/twi-balloon-left.art similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-balloon-left.art rename to frontend/src/assets/bp/p/twilight sparkle/twi-balloon-left.art diff --git a/src/assets/bp/p/twilight sparkle/twi-balloon-left.gif b/frontend/src/assets/bp/p/twilight sparkle/twi-balloon-left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-balloon-left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi-balloon-left.gif diff --git a/src/assets/bp/p/twilight sparkle/twi-balloon-right.art b/frontend/src/assets/bp/p/twilight sparkle/twi-balloon-right.art similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-balloon-right.art rename to frontend/src/assets/bp/p/twilight sparkle/twi-balloon-right.art diff --git a/src/assets/bp/p/twilight sparkle/twi-balloon-right.gif b/frontend/src/assets/bp/p/twilight sparkle/twi-balloon-right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-balloon-right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi-balloon-right.gif diff --git a/src/assets/bp/p/twilight sparkle/twi-owl-left.gif b/frontend/src/assets/bp/p/twilight sparkle/twi-owl-left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-owl-left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi-owl-left.gif diff --git a/src/assets/bp/p/twilight sparkle/twi-owl-right.gif b/frontend/src/assets/bp/p/twilight sparkle/twi-owl-right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-owl-right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi-owl-right.gif diff --git a/src/assets/bp/p/twilight sparkle/twi-starswirl-left.gif b/frontend/src/assets/bp/p/twilight sparkle/twi-starswirl-left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-starswirl-left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi-starswirl-left.gif diff --git a/src/assets/bp/p/twilight sparkle/twi-starswirl-right.gif b/frontend/src/assets/bp/p/twilight sparkle/twi-starswirl-right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi-starswirl-right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi-starswirl-right.gif diff --git a/src/assets/bp/p/twilight sparkle/twi_rage_left.gif b/frontend/src/assets/bp/p/twilight sparkle/twi_rage_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi_rage_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi_rage_left.gif diff --git a/src/assets/bp/p/twilight sparkle/twi_rage_right.gif b/frontend/src/assets/bp/p/twilight sparkle/twi_rage_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twi_rage_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twi_rage_right.gif diff --git a/src/assets/bp/p/twilight sparkle/twilight_galla_left.gif b/frontend/src/assets/bp/p/twilight sparkle/twilight_galla_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilight_galla_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilight_galla_left.gif diff --git a/src/assets/bp/p/twilight sparkle/twilight_galla_right.gif b/frontend/src/assets/bp/p/twilight sparkle/twilight_galla_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilight_galla_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilight_galla_right.gif diff --git a/src/assets/bp/p/twilight sparkle/twilight_gallop_left.gif b/frontend/src/assets/bp/p/twilight sparkle/twilight_gallop_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilight_gallop_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilight_gallop_left.gif diff --git a/src/assets/bp/p/twilight sparkle/twilight_gallop_right.gif b/frontend/src/assets/bp/p/twilight sparkle/twilight_gallop_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilight_gallop_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilight_gallop_right.gif diff --git a/src/assets/bp/p/twilight sparkle/twilight_partyhard_left.gif b/frontend/src/assets/bp/p/twilight sparkle/twilight_partyhard_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilight_partyhard_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilight_partyhard_left.gif diff --git a/src/assets/bp/p/twilight sparkle/twilight_partyhard_right.gif b/frontend/src/assets/bp/p/twilight sparkle/twilight_partyhard_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilight_partyhard_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilight_partyhard_right.gif diff --git a/src/assets/bp/p/twilight sparkle/twilight_trot_left.gif b/frontend/src/assets/bp/p/twilight sparkle/twilight_trot_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilight_trot_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilight_trot_left.gif diff --git a/src/assets/bp/p/twilight sparkle/twilightdrag_left.gif b/frontend/src/assets/bp/p/twilight sparkle/twilightdrag_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilightdrag_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilightdrag_left.gif diff --git a/src/assets/bp/p/twilight sparkle/twilightdrag_right.gif b/frontend/src/assets/bp/p/twilight sparkle/twilightdrag_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/twilightdrag_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/twilightdrag_right.gif diff --git a/src/assets/bp/p/twilight sparkle/windblown_left.gif b/frontend/src/assets/bp/p/twilight sparkle/windblown_left.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/windblown_left.gif rename to frontend/src/assets/bp/p/twilight sparkle/windblown_left.gif diff --git a/src/assets/bp/p/twilight sparkle/windblown_right.gif b/frontend/src/assets/bp/p/twilight sparkle/windblown_right.gif similarity index 100% rename from src/assets/bp/p/twilight sparkle/windblown_right.gif rename to frontend/src/assets/bp/p/twilight sparkle/windblown_right.gif diff --git a/src/assets/docsTemplate.json b/frontend/src/assets/docsTemplate.json similarity index 100% rename from src/assets/docsTemplate.json rename to frontend/src/assets/docsTemplate.json diff --git a/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf b/frontend/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf similarity index 100% rename from src/assets/fonts/material-icons/MaterialIcons-Regular.ttf rename to frontend/src/assets/fonts/material-icons/MaterialIcons-Regular.ttf diff --git a/src/assets/fonts/material-icons/MaterialIcons-Regular.woff b/frontend/src/assets/fonts/material-icons/MaterialIcons-Regular.woff similarity index 100% rename from src/assets/fonts/material-icons/MaterialIcons-Regular.woff rename to frontend/src/assets/fonts/material-icons/MaterialIcons-Regular.woff diff --git a/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 b/frontend/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 similarity index 100% rename from src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 rename to frontend/src/assets/fonts/material-icons/MaterialIcons-Regular.woff2 diff --git a/src/assets/fonts/material-icons/font.css b/frontend/src/assets/fonts/material-icons/font.css similarity index 100% rename from src/assets/fonts/material-icons/font.css rename to frontend/src/assets/fonts/material-icons/font.css diff --git a/src/assets/fonts/roboto/Roboto-Black.svg b/frontend/src/assets/fonts/roboto/Roboto-Black.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-Black.svg rename to frontend/src/assets/fonts/roboto/Roboto-Black.svg diff --git a/src/assets/fonts/roboto/Roboto-Black.ttf b/frontend/src/assets/fonts/roboto/Roboto-Black.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-Black.ttf rename to frontend/src/assets/fonts/roboto/Roboto-Black.ttf diff --git a/src/assets/fonts/roboto/Roboto-Black.woff b/frontend/src/assets/fonts/roboto/Roboto-Black.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-Black.woff rename to frontend/src/assets/fonts/roboto/Roboto-Black.woff diff --git a/src/assets/fonts/roboto/Roboto-Black.woff2 b/frontend/src/assets/fonts/roboto/Roboto-Black.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-Black.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-Black.woff2 diff --git a/src/assets/fonts/roboto/Roboto-BlackItalic.svg b/frontend/src/assets/fonts/roboto/Roboto-BlackItalic.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-BlackItalic.svg rename to frontend/src/assets/fonts/roboto/Roboto-BlackItalic.svg diff --git a/src/assets/fonts/roboto/Roboto-BlackItalic.ttf b/frontend/src/assets/fonts/roboto/Roboto-BlackItalic.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-BlackItalic.ttf rename to frontend/src/assets/fonts/roboto/Roboto-BlackItalic.ttf diff --git a/src/assets/fonts/roboto/Roboto-BlackItalic.woff b/frontend/src/assets/fonts/roboto/Roboto-BlackItalic.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-BlackItalic.woff rename to frontend/src/assets/fonts/roboto/Roboto-BlackItalic.woff diff --git a/src/assets/fonts/roboto/Roboto-BlackItalic.woff2 b/frontend/src/assets/fonts/roboto/Roboto-BlackItalic.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-BlackItalic.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-BlackItalic.woff2 diff --git a/src/assets/fonts/roboto/Roboto-Bold.svg b/frontend/src/assets/fonts/roboto/Roboto-Bold.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-Bold.svg rename to frontend/src/assets/fonts/roboto/Roboto-Bold.svg diff --git a/src/assets/fonts/roboto/Roboto-Bold.ttf b/frontend/src/assets/fonts/roboto/Roboto-Bold.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-Bold.ttf rename to frontend/src/assets/fonts/roboto/Roboto-Bold.ttf diff --git a/src/assets/fonts/roboto/Roboto-Bold.woff b/frontend/src/assets/fonts/roboto/Roboto-Bold.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-Bold.woff rename to frontend/src/assets/fonts/roboto/Roboto-Bold.woff diff --git a/src/assets/fonts/roboto/Roboto-Bold.woff2 b/frontend/src/assets/fonts/roboto/Roboto-Bold.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-Bold.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-Bold.woff2 diff --git a/src/assets/fonts/roboto/Roboto-BoldItalic.svg b/frontend/src/assets/fonts/roboto/Roboto-BoldItalic.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-BoldItalic.svg rename to frontend/src/assets/fonts/roboto/Roboto-BoldItalic.svg diff --git a/src/assets/fonts/roboto/Roboto-BoldItalic.ttf b/frontend/src/assets/fonts/roboto/Roboto-BoldItalic.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-BoldItalic.ttf rename to frontend/src/assets/fonts/roboto/Roboto-BoldItalic.ttf diff --git a/src/assets/fonts/roboto/Roboto-BoldItalic.woff b/frontend/src/assets/fonts/roboto/Roboto-BoldItalic.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-BoldItalic.woff rename to frontend/src/assets/fonts/roboto/Roboto-BoldItalic.woff diff --git a/src/assets/fonts/roboto/Roboto-BoldItalic.woff2 b/frontend/src/assets/fonts/roboto/Roboto-BoldItalic.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-BoldItalic.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-BoldItalic.woff2 diff --git a/src/assets/fonts/roboto/Roboto-Italic.svg b/frontend/src/assets/fonts/roboto/Roboto-Italic.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-Italic.svg rename to frontend/src/assets/fonts/roboto/Roboto-Italic.svg diff --git a/src/assets/fonts/roboto/Roboto-Italic.ttf b/frontend/src/assets/fonts/roboto/Roboto-Italic.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-Italic.ttf rename to frontend/src/assets/fonts/roboto/Roboto-Italic.ttf diff --git a/src/assets/fonts/roboto/Roboto-Italic.woff b/frontend/src/assets/fonts/roboto/Roboto-Italic.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-Italic.woff rename to frontend/src/assets/fonts/roboto/Roboto-Italic.woff diff --git a/src/assets/fonts/roboto/Roboto-Italic.woff2 b/frontend/src/assets/fonts/roboto/Roboto-Italic.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-Italic.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-Italic.woff2 diff --git a/src/assets/fonts/roboto/Roboto-Light.svg b/frontend/src/assets/fonts/roboto/Roboto-Light.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-Light.svg rename to frontend/src/assets/fonts/roboto/Roboto-Light.svg diff --git a/src/assets/fonts/roboto/Roboto-Light.ttf b/frontend/src/assets/fonts/roboto/Roboto-Light.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-Light.ttf rename to frontend/src/assets/fonts/roboto/Roboto-Light.ttf diff --git a/src/assets/fonts/roboto/Roboto-Light.woff b/frontend/src/assets/fonts/roboto/Roboto-Light.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-Light.woff rename to frontend/src/assets/fonts/roboto/Roboto-Light.woff diff --git a/src/assets/fonts/roboto/Roboto-Light.woff2 b/frontend/src/assets/fonts/roboto/Roboto-Light.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-Light.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-Light.woff2 diff --git a/src/assets/fonts/roboto/Roboto-LightItalic.svg b/frontend/src/assets/fonts/roboto/Roboto-LightItalic.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-LightItalic.svg rename to frontend/src/assets/fonts/roboto/Roboto-LightItalic.svg diff --git a/src/assets/fonts/roboto/Roboto-LightItalic.ttf b/frontend/src/assets/fonts/roboto/Roboto-LightItalic.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-LightItalic.ttf rename to frontend/src/assets/fonts/roboto/Roboto-LightItalic.ttf diff --git a/src/assets/fonts/roboto/Roboto-LightItalic.woff b/frontend/src/assets/fonts/roboto/Roboto-LightItalic.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-LightItalic.woff rename to frontend/src/assets/fonts/roboto/Roboto-LightItalic.woff diff --git a/src/assets/fonts/roboto/Roboto-LightItalic.woff2 b/frontend/src/assets/fonts/roboto/Roboto-LightItalic.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-LightItalic.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-LightItalic.woff2 diff --git a/src/assets/fonts/roboto/Roboto-Medium.svg b/frontend/src/assets/fonts/roboto/Roboto-Medium.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-Medium.svg rename to frontend/src/assets/fonts/roboto/Roboto-Medium.svg diff --git a/src/assets/fonts/roboto/Roboto-Medium.ttf b/frontend/src/assets/fonts/roboto/Roboto-Medium.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-Medium.ttf rename to frontend/src/assets/fonts/roboto/Roboto-Medium.ttf diff --git a/src/assets/fonts/roboto/Roboto-Medium.woff b/frontend/src/assets/fonts/roboto/Roboto-Medium.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-Medium.woff rename to frontend/src/assets/fonts/roboto/Roboto-Medium.woff diff --git a/src/assets/fonts/roboto/Roboto-Medium.woff2 b/frontend/src/assets/fonts/roboto/Roboto-Medium.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-Medium.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-Medium.woff2 diff --git a/src/assets/fonts/roboto/Roboto-MediumItalic.svg b/frontend/src/assets/fonts/roboto/Roboto-MediumItalic.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-MediumItalic.svg rename to frontend/src/assets/fonts/roboto/Roboto-MediumItalic.svg diff --git a/src/assets/fonts/roboto/Roboto-MediumItalic.ttf b/frontend/src/assets/fonts/roboto/Roboto-MediumItalic.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-MediumItalic.ttf rename to frontend/src/assets/fonts/roboto/Roboto-MediumItalic.ttf diff --git a/src/assets/fonts/roboto/Roboto-MediumItalic.woff b/frontend/src/assets/fonts/roboto/Roboto-MediumItalic.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-MediumItalic.woff rename to frontend/src/assets/fonts/roboto/Roboto-MediumItalic.woff diff --git a/src/assets/fonts/roboto/Roboto-MediumItalic.woff2 b/frontend/src/assets/fonts/roboto/Roboto-MediumItalic.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-MediumItalic.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-MediumItalic.woff2 diff --git a/src/assets/fonts/roboto/Roboto-Regular.svg b/frontend/src/assets/fonts/roboto/Roboto-Regular.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-Regular.svg rename to frontend/src/assets/fonts/roboto/Roboto-Regular.svg diff --git a/src/assets/fonts/roboto/Roboto-Regular.ttf b/frontend/src/assets/fonts/roboto/Roboto-Regular.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-Regular.ttf rename to frontend/src/assets/fonts/roboto/Roboto-Regular.ttf diff --git a/src/assets/fonts/roboto/Roboto-Regular.woff b/frontend/src/assets/fonts/roboto/Roboto-Regular.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-Regular.woff rename to frontend/src/assets/fonts/roboto/Roboto-Regular.woff diff --git a/src/assets/fonts/roboto/Roboto-Regular.woff2 b/frontend/src/assets/fonts/roboto/Roboto-Regular.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-Regular.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-Regular.woff2 diff --git a/src/assets/fonts/roboto/Roboto-Thin.svg b/frontend/src/assets/fonts/roboto/Roboto-Thin.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-Thin.svg rename to frontend/src/assets/fonts/roboto/Roboto-Thin.svg diff --git a/src/assets/fonts/roboto/Roboto-Thin.ttf b/frontend/src/assets/fonts/roboto/Roboto-Thin.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-Thin.ttf rename to frontend/src/assets/fonts/roboto/Roboto-Thin.ttf diff --git a/src/assets/fonts/roboto/Roboto-Thin.woff b/frontend/src/assets/fonts/roboto/Roboto-Thin.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-Thin.woff rename to frontend/src/assets/fonts/roboto/Roboto-Thin.woff diff --git a/src/assets/fonts/roboto/Roboto-Thin.woff2 b/frontend/src/assets/fonts/roboto/Roboto-Thin.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-Thin.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-Thin.woff2 diff --git a/src/assets/fonts/roboto/Roboto-ThinItalic.svg b/frontend/src/assets/fonts/roboto/Roboto-ThinItalic.svg similarity index 100% rename from src/assets/fonts/roboto/Roboto-ThinItalic.svg rename to frontend/src/assets/fonts/roboto/Roboto-ThinItalic.svg diff --git a/src/assets/fonts/roboto/Roboto-ThinItalic.ttf b/frontend/src/assets/fonts/roboto/Roboto-ThinItalic.ttf similarity index 100% rename from src/assets/fonts/roboto/Roboto-ThinItalic.ttf rename to frontend/src/assets/fonts/roboto/Roboto-ThinItalic.ttf diff --git a/src/assets/fonts/roboto/Roboto-ThinItalic.woff b/frontend/src/assets/fonts/roboto/Roboto-ThinItalic.woff similarity index 100% rename from src/assets/fonts/roboto/Roboto-ThinItalic.woff rename to frontend/src/assets/fonts/roboto/Roboto-ThinItalic.woff diff --git a/src/assets/fonts/roboto/Roboto-ThinItalic.woff2 b/frontend/src/assets/fonts/roboto/Roboto-ThinItalic.woff2 similarity index 100% rename from src/assets/fonts/roboto/Roboto-ThinItalic.woff2 rename to frontend/src/assets/fonts/roboto/Roboto-ThinItalic.woff2 diff --git a/src/assets/fonts/roboto/font.css b/frontend/src/assets/fonts/roboto/font.css similarity index 100% rename from src/assets/fonts/roboto/font.css rename to frontend/src/assets/fonts/roboto/font.css diff --git a/src/assets/icons/arrow.svg b/frontend/src/assets/icons/arrow.svg similarity index 100% rename from src/assets/icons/arrow.svg rename to frontend/src/assets/icons/arrow.svg diff --git a/src/assets/icons/bug.svg b/frontend/src/assets/icons/bug.svg similarity index 100% rename from src/assets/icons/bug.svg rename to frontend/src/assets/icons/bug.svg diff --git a/src/assets/icons/flask.svg b/frontend/src/assets/icons/flask.svg similarity index 100% rename from src/assets/icons/flask.svg rename to frontend/src/assets/icons/flask.svg diff --git a/src/assets/icons/magnifier.svg b/frontend/src/assets/icons/magnifier.svg similarity index 100% rename from src/assets/icons/magnifier.svg rename to frontend/src/assets/icons/magnifier.svg diff --git a/src/assets/icons/menu.svg b/frontend/src/assets/icons/menu.svg similarity index 100% rename from src/assets/icons/menu.svg rename to frontend/src/assets/icons/menu.svg diff --git a/src/assets/icons/puzzle.svg b/frontend/src/assets/icons/puzzle.svg similarity index 100% rename from src/assets/icons/puzzle.svg rename to frontend/src/assets/icons/puzzle.svg diff --git a/src/assets/loading.gif b/frontend/src/assets/loading.gif similarity index 100% rename from src/assets/loading.gif rename to frontend/src/assets/loading.gif diff --git a/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts similarity index 100% rename from src/environments/environment.prod.ts rename to frontend/src/environments/environment.prod.ts diff --git a/src/environments/environment.ts b/frontend/src/environments/environment.ts similarity index 100% rename from src/environments/environment.ts rename to frontend/src/environments/environment.ts diff --git a/src/environments/environment.web.prod.ts b/frontend/src/environments/environment.web.prod.ts similarity index 100% rename from src/environments/environment.web.prod.ts rename to frontend/src/environments/environment.web.prod.ts diff --git a/src/environments/environment.web.ts b/frontend/src/environments/environment.web.ts similarity index 100% rename from src/environments/environment.web.ts rename to frontend/src/environments/environment.web.ts diff --git a/src/favicon.ico b/frontend/src/favicon.ico similarity index 100% rename from src/favicon.ico rename to frontend/src/favicon.ico diff --git a/src/index.html b/frontend/src/index.html similarity index 100% rename from src/index.html rename to frontend/src/index.html diff --git a/src/main.ts b/frontend/src/main.ts similarity index 100% rename from src/main.ts rename to frontend/src/main.ts diff --git a/src/polyfills.ts b/frontend/src/polyfills.ts similarity index 83% rename from src/polyfills.ts rename to frontend/src/polyfills.ts index 4e2d31486..4efb94c71 100644 --- a/src/polyfills.ts +++ b/frontend/src/polyfills.ts @@ -18,16 +18,6 @@ * BROWSER POLYFILLS */ -/** IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - /** * By default, zone.js will patch all possible macroTask and DomEvents * user can disable parts of macroTask/DomEvents patch by setting following flags diff --git a/src/styles.scss b/frontend/src/styles.scss similarity index 98% rename from src/styles.scss rename to frontend/src/styles.scss index 14daf76e8..8170f958c 100644 --- a/src/styles.scss +++ b/frontend/src/styles.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; // Custom Theming for Angular Material // For more information: https://material.angular.io/guide/theming // Plus imports for other components in your app. diff --git a/src/styles/color.scss b/frontend/src/styles/color.scss similarity index 85% rename from src/styles/color.scss rename to frontend/src/styles/color.scss index 8de398746..84946d576 100644 --- a/src/styles/color.scss +++ b/frontend/src/styles/color.scss @@ -1,4 +1,4 @@ -@use '~@angular/material' as mat; +@use '@angular/material' as mat; $ang-CaBr2-primary: mat.define-palette(mat.$orange-palette); $ang-CaBr2-accent: mat.define-palette(mat.$indigo-palette, A200, A100, A400); diff --git a/src/test.ts b/frontend/src/test.ts similarity index 77% rename from src/test.ts rename to frontend/src/test.ts index 5932aa18b..f7dba66ac 100644 --- a/src/test.ts +++ b/frontend/src/test.ts @@ -16,7 +16,11 @@ declare const require: { }; // First, initialize the Angular testing environment. -getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); +getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { + // with angular v13 teardown is enabled by default + // since there are no tests for this app we could enable this for new tests + teardown: { destroyAfterEach: false }, +}); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); // And load the modules. diff --git a/transloco.config.js b/frontend/transloco.config.js similarity index 100% rename from transloco.config.js rename to frontend/transloco.config.js diff --git a/tsconfig.app.json b/frontend/tsconfig.app.json similarity index 100% rename from tsconfig.app.json rename to frontend/tsconfig.app.json diff --git a/tsconfig.json b/frontend/tsconfig.json similarity index 100% rename from tsconfig.json rename to frontend/tsconfig.json diff --git a/tsconfig.spec.json b/frontend/tsconfig.spec.json similarity index 100% rename from tsconfig.spec.json rename to frontend/tsconfig.spec.json diff --git a/yarn.lock b/frontend/yarn.lock similarity index 65% rename from yarn.lock rename to frontend/yarn.lock index 0fbfd6c12..ef0954517 100644 --- a/yarn.lock +++ b/frontend/yarn.lock @@ -2,154 +2,122 @@ # yarn lockfile v1 -"@ampproject/remapping@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-1.0.1.tgz#1398e73e567c2a7992df6554c15bb94a89b68ba2" - integrity sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA== +"@ampproject/remapping@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-1.1.1.tgz#e220d0a5288b07afd6392a584d15921839e9da32" + integrity sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw== dependencies: - "@jridgewell/resolve-uri" "1.0.0" + "@jridgewell/resolve-uri" "^3.0.3" sourcemap-codec "1.4.8" -"@angular-devkit/architect@0.1202.12": - version "0.1202.12" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1202.12.tgz#23f525ac81387428c1aae11dbbfb6f4bd01d3b68" - integrity sha512-md7F1chg8zwrmX2C2E2GoOaHhXp03+DmGph5CBTB6t8q3yB734I9A2bE5i0TyxCBLZzh8GOTH9nOGSGX6JlYrw== - dependencies: - "@angular-devkit/core" "12.2.12" - rxjs "6.6.7" - -"@angular-devkit/architect@0.1202.15": - version "0.1202.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1202.15.tgz#9dde1d03778838be3a87a23a1955c4dcdbd5a3f2" - integrity sha512-9dxUF0lX4H/50h5/5P1WAlDO1fPIukv9fX4xZ1pTLWFnwQJRsbdc4I1kk0HSGdok8xD7VUei6dfn3KV4Glznqw== +"@angular-devkit/architect@0.1302.1": + version "0.1302.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1302.1.tgz#0388a9b9b2bbb63ea57085cece8c5e362fbc7f27" + integrity sha512-h5LA1VTmWKLLzYvnLPqwdyLI9l43FVIUflvmDf6s2ScTrVf3Bb7B4KkCBDdNa8FxnBitfFqKJBf6RGcKjjeDcw== dependencies: - "@angular-devkit/core" "12.2.15" + "@angular-devkit/core" "13.2.1" rxjs "6.6.7" -"@angular-devkit/build-angular@~12.2.12": - version "12.2.12" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-12.2.12.tgz#87f53514f293e1788a80fadcd9fa96bd57127e69" - integrity sha512-e2Q77KQk7KjIA9Rvih89acug7Hc98BoD8/RGKPuj4NcdlzoBfjF05ThwRTKFQPs/grWvyuIujVEsQL/PuG3oBg== - dependencies: - "@ampproject/remapping" "1.0.1" - "@angular-devkit/architect" "0.1202.12" - "@angular-devkit/build-optimizer" "0.1202.12" - "@angular-devkit/build-webpack" "0.1202.12" - "@angular-devkit/core" "12.2.12" - "@babel/core" "7.14.8" - "@babel/generator" "7.14.8" - "@babel/helper-annotate-as-pure" "7.14.5" - "@babel/plugin-proposal-async-generator-functions" "7.14.7" - "@babel/plugin-transform-async-to-generator" "7.14.5" - "@babel/plugin-transform-runtime" "7.14.5" - "@babel/preset-env" "7.14.8" - "@babel/runtime" "7.14.8" - "@babel/template" "7.14.5" - "@discoveryjs/json-ext" "0.5.3" - "@jsdevtools/coverage-istanbul-loader" "3.0.5" - "@ngtools/webpack" "12.2.12" +"@angular-devkit/build-angular@~13.2.1": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-13.2.1.tgz#cee8a49b88754054948e5ddfde6b901407bc771a" + integrity sha512-bK1fXqtE/By9cybmVp7oFbCKoI6y9AlZO3k/k7AsyMgLtKL1YYLPN93Tq6L99W+zFI9+8V7x5bjuXWiexA63DA== + dependencies: + "@ampproject/remapping" "1.1.1" + "@angular-devkit/architect" "0.1302.1" + "@angular-devkit/build-webpack" "0.1302.1" + "@angular-devkit/core" "13.2.1" + "@babel/core" "7.16.12" + "@babel/generator" "7.16.8" + "@babel/helper-annotate-as-pure" "7.16.7" + "@babel/plugin-proposal-async-generator-functions" "7.16.8" + "@babel/plugin-transform-async-to-generator" "7.16.8" + "@babel/plugin-transform-runtime" "7.16.10" + "@babel/preset-env" "7.16.11" + "@babel/runtime" "7.16.7" + "@babel/template" "7.16.7" + "@discoveryjs/json-ext" "0.5.6" + "@ngtools/webpack" "13.2.1" ansi-colors "4.1.1" - babel-loader "8.2.2" + babel-loader "8.2.3" + babel-plugin-istanbul "6.1.1" browserslist "^4.9.1" - cacache "15.2.0" - caniuse-lite "^1.0.30001032" + cacache "15.3.0" circular-dependency-plugin "5.2.2" - copy-webpack-plugin "9.0.1" - core-js "3.16.0" - critters "0.0.12" - css-loader "6.2.0" - css-minimizer-webpack-plugin "3.0.2" - esbuild-wasm "0.13.8" - find-cache-dir "3.3.1" - glob "7.1.7" + copy-webpack-plugin "10.2.1" + core-js "3.20.3" + critters "0.0.16" + css-loader "6.5.1" + esbuild-wasm "0.14.14" + glob "7.2.0" https-proxy-agent "5.0.0" - inquirer "8.1.2" + inquirer "8.2.0" + jsonc-parser "3.0.0" karma-source-map-support "1.4.0" - less "4.1.1" - less-loader "10.0.1" - license-webpack-plugin "2.3.20" - loader-utils "2.0.0" - mini-css-extract-plugin "2.4.2" + less "4.1.2" + less-loader "10.2.0" + license-webpack-plugin "4.0.0" + loader-utils "3.2.0" + mini-css-extract-plugin "2.5.3" minimatch "3.0.4" - open "8.2.1" + open "8.4.0" ora "5.4.1" parse5-html-rewriting-stream "6.0.1" - piscina "3.1.0" - postcss "8.3.6" + piscina "3.2.0" + postcss "8.4.5" postcss-import "14.0.2" - postcss-loader "6.1.1" - postcss-preset-env "6.7.0" + postcss-loader "6.2.1" + postcss-preset-env "7.2.3" regenerator-runtime "0.13.9" - resolve-url-loader "4.0.0" + resolve-url-loader "5.0.0" rxjs "6.6.7" - sass "1.36.0" - sass-loader "12.1.0" + sass "1.49.0" + sass-loader "12.4.0" semver "7.3.5" - source-map-loader "3.0.0" - source-map-support "0.5.19" - style-loader "3.2.1" - stylus "0.54.8" - stylus-loader "6.1.0" - terser "5.7.1" - terser-webpack-plugin "5.1.4" + source-map-loader "3.0.1" + source-map-support "0.5.21" + stylus "0.56.0" + stylus-loader "6.2.0" + terser "5.10.0" text-table "0.2.0" tree-kill "1.2.2" - tslib "2.3.0" - webpack "5.50.0" - webpack-dev-middleware "5.0.0" - webpack-dev-server "3.11.2" + tslib "2.3.1" + webpack "5.67.0" + webpack-dev-middleware "5.3.0" + webpack-dev-server "4.7.3" webpack-merge "5.8.0" - webpack-subresource-integrity "1.5.2" + webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.13.8" + esbuild "0.14.14" -"@angular-devkit/build-optimizer@0.1202.12": - version "0.1202.12" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.1202.12.tgz#1afee251e411a9243c084a79d0674adf941fe57c" - integrity sha512-EUTY8PmST6Br3QiVqsU4W2b35nd/7iM9EygaFsreffd51P+eSIAFmxe1L/bWZuKpcptiExtYY4N118M254w88g== +"@angular-devkit/build-webpack@0.1302.1": + version "0.1302.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1302.1.tgz#93f2c814c364805bf86ef75bb4eb761398d7558c" + integrity sha512-MYWGqXK42ksnhArLjycPfwxGh7fsR87LRL4yV3e2EfGl07s7mAnohnRhyAs8o8lxRHQU4+yBs9JnMWRcqqqp2A== dependencies: - source-map "0.7.3" - tslib "2.3.0" - typescript "4.3.5" - -"@angular-devkit/build-webpack@0.1202.12": - version "0.1202.12" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1202.12.tgz#dd9fe94c02512aa10a710f457affe1ae4ec9d54e" - integrity sha512-WZu03G7/la49q5SnzjmlfenQJD7Ssk8WSvSdMbooS44Rc0PZGWJIgYJ+4L2kYcC1aimrm9NZvWTyVb/OK0dIpA== - dependencies: - "@angular-devkit/architect" "0.1202.12" + "@angular-devkit/architect" "0.1302.1" rxjs "6.6.7" -"@angular-devkit/core@12.2.12": - version "12.2.12" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.2.12.tgz#a185d79fb5e84fcf2ced69f49ac2ed3c5d9e52f1" - integrity sha512-ZFThmQecQmlniQl65rWn4oOMuWKy313O6Hk8sen7WdsjDircqtbHmtJCA1w/EU4xIilIJHo0Kez4Ihi00cGyYw== +"@angular-devkit/core@13.2.1": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-13.2.1.tgz#5815de99fa8b8b2a2188b6f7f2472d6bb96f0797" + integrity sha512-yR+FJq/RfthPmK0LtPIjj6mZLzLGMQ137yyOljsRgHoFhLxtluz9FdjyAk+61rP0LxH3FCt4qRWa9jd7+oBJxw== dependencies: - ajv "8.6.2" - ajv-formats "2.1.0" + ajv "8.9.0" + ajv-formats "2.1.1" fast-json-stable-stringify "2.1.0" magic-string "0.25.7" rxjs "6.6.7" source-map "0.7.3" -"@angular-devkit/core@12.2.15": - version "12.2.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-12.2.15.tgz#63d6e37062adc0bc0b150116da5a59e0be6cf69c" - integrity sha512-q4J5bZBlXmFrQXdwIVUr4uC/KvhXsOJRVEZXx9/CPjCSjXdMtXNC1f8WPzE9rbZ+GBPMs90JOMrQdKMAKD51lg== +"@angular-devkit/schematics@13.2.1": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-13.2.1.tgz#85090c9dc071f2a6eef9497bc91e77a1051c0d30" + integrity sha512-vEQnQfO1IrsWd8VneqGBSbunClP0nQwDAnPKUH2n1yeqPnj8SZmxsw2s8A6WV7Xifk6RUOGK0JGS8rbAwqGvZA== dependencies: - ajv "8.6.2" - ajv-formats "2.1.0" - fast-json-stable-stringify "2.1.0" + "@angular-devkit/core" "13.2.1" + jsonc-parser "3.0.0" magic-string "0.25.7" - rxjs "6.6.7" - source-map "0.7.3" - -"@angular-devkit/schematics@12.2.15": - version "12.2.15" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-12.2.15.tgz#c5391f0dcdfb438c8d61c8d82fe9983f25e47149" - integrity sha512-/q+FvHCemafRqLwNwpqzcsy5Lm06cgRC263/FfddcaeqSekwgSdUJByYDEr29WAUUt+KJX3dJ6jBTfx8a6XQ5g== - dependencies: - "@angular-devkit/core" "12.2.15" ora "5.4.1" rxjs "6.6.7" @@ -160,26 +128,11 @@ dependencies: "@nrwl/devkit" "13.1.3" -"@angular-eslint/bundled-angular-compiler@12.7.0": - version "12.7.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-12.7.0.tgz#e32ad1f98bf5c16dde22941e10fd014df7a1d5f2" - integrity sha512-n7nUSIK+bl2DQXIPRyts/xVTw94Mk0rRNd2WBCL9ni27XKOhKtTdP7tLpD+nAiuY4BTTJr7/yTzPWCCRDQgWZg== - "@angular-eslint/bundled-angular-compiler@13.0.1": version "13.0.1" resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-13.0.1.tgz#fc0a568f915948fc4eb701abb331dc2f0e3ebc71" integrity sha512-Eih9Kh0hxHO4+3in9mgjksQecym0p+3p+287y3LLihIc7gCkAO4xZeHGVGiC8qUX72PNUXkDlyskI9oHjK9Axw== -"@angular-eslint/eslint-plugin-template@12.7.0": - version "12.7.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.7.0.tgz#8b2b504e3e909f90fcd067b332b45105c4475806" - integrity sha512-G/UIifRNZuk0Vc3Q2bjAvRa2MMMCSuSzW3E9QAvSr0n4QkhIJwDJvyR/KV1ubswgHB0RRkYcfGQ8d6VKA5Vqjw== - dependencies: - "@angular-eslint/bundled-angular-compiler" "12.7.0" - "@typescript-eslint/experimental-utils" "4.28.2" - aria-query "^4.2.2" - axobject-query "^2.2.0" - "@angular-eslint/eslint-plugin-template@13.0.1": version "13.0.1" resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-13.0.1.tgz#96d5e319278f629afcd034ff57f02de19e510e2b" @@ -190,14 +143,6 @@ aria-query "^4.2.2" axobject-query "^2.2.0" -"@angular-eslint/eslint-plugin@12.7.0": - version "12.7.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-12.7.0.tgz#fefc40d2ba8f562e04fa038e0583d128cbf6f12e" - integrity sha512-TTTimCddON6TdGw3NDglgWqnrP2VLFiAA+FJAg/iiCKKVI+XOddtpDXmeHmas8cHIJXJH1WNxrae394DpThiOA== - dependencies: - "@angular-eslint/utils" "12.7.0" - "@typescript-eslint/experimental-utils" "4.28.2" - "@angular-eslint/eslint-plugin@13.0.1": version "13.0.1" resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-13.0.1.tgz#fd737c8a97a5e65ab92e71b5fab1ffd45ed295f6" @@ -206,13 +151,13 @@ "@angular-eslint/utils" "13.0.1" "@typescript-eslint/experimental-utils" "5.3.0" -"@angular-eslint/schematics@12.7.0": - version "12.7.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/schematics/-/schematics-12.7.0.tgz#0ee020eeb7d633a808b4f869b378db15c1cb49ed" - integrity sha512-qt5OiCk5kTr+l8XG+WJxLhwvZMT5MWPBCK/rknCpIEd4z2HkOK24Cttuj3jdOYJ3abQ0ha4SiIne5LkrEZBoLw== +"@angular-eslint/schematics@13.0.1": + version "13.0.1" + resolved "https://registry.yarnpkg.com/@angular-eslint/schematics/-/schematics-13.0.1.tgz#c668b9b5f81695da5f1aa6dd2c45d33ad0835c73" + integrity sha512-LiPUVff6fexQNa6Ttgb+yhIoQc9oXc1qb34kmntvQDw59xBeEyrUojG2P2I5VS+1ZoVUWNY86cqEaxkFJVkY7w== dependencies: - "@angular-eslint/eslint-plugin" "12.7.0" - "@angular-eslint/eslint-plugin-template" "12.7.0" + "@angular-eslint/eslint-plugin" "13.0.1" + "@angular-eslint/eslint-plugin-template" "13.0.1" ignore "5.1.9" strip-json-comments "3.1.1" tmp "0.2.1" @@ -225,14 +170,6 @@ "@angular-eslint/bundled-angular-compiler" "13.0.1" eslint-scope "^5.1.0" -"@angular-eslint/utils@12.7.0": - version "12.7.0" - resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-12.7.0.tgz#84c80857af1b29ccd71e325e107471a1fadf4e7b" - integrity sha512-1yyRxtxXg6VoyU8wUDcaZEdN7oDE0pRRCUZsQBGungPSv5PQt4nlv+9ZnjJ93rVMEoGztHD2CBWeoRtNlqvg4A== - dependencies: - "@angular-eslint/bundled-angular-compiler" "12.7.0" - "@typescript-eslint/experimental-utils" "4.28.2" - "@angular-eslint/utils@13.0.1": version "13.0.1" resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-13.0.1.tgz#e45085987b86a18ff567b4104b11fd03aa886c0a" @@ -241,135 +178,125 @@ "@angular-eslint/bundled-angular-compiler" "13.0.1" "@typescript-eslint/experimental-utils" "5.3.0" -"@angular/animations@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-12.0.5.tgz#216930a7a2868734ad34f835b4bf2df40243bc30" - integrity sha512-BPdTCtgDJ9zNzHpuA6X3NmtzDiIt5SHZk840j0q3HCq6rP6C/oo2UnPT6w8YDOGMejDpWdHvTgXH4jVKDN1wCQ== +"@angular/animations@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-13.1.2.tgz#fdf0776eaf053b14a4118c682a62f24e4192609a" + integrity sha512-k1eQ8YZq3eelLhJDQjkRCt/4MXxwK2TFeGdtcYJF0G7vFOppE8hlI4PT7Bvmk08lTqvgiqtTI3ZaYmIINLfUMg== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" -"@angular/cdk@^12.0.0": - version "12.2.9" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-12.2.9.tgz#f39e4d7cdb3568ad8e1d412e3500772e2d4c605c" - integrity sha512-9Wgj69iGAZ4teQqW/zPbVg2RGna+m9i3v0zkWGx/+Uo95rikJCUZBQM4bfeOe+bSJrS77jV5EisBWG7ayNUSzQ== +"@angular/cdk@^13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-13.1.2.tgz#aaa1b577d1b8101d3d59f4da9a1ea51b7f7a5191" + integrity sha512-xORyqvfM0MueJpxHxVi3CR/X/f1RPKr45vt7NV6/x91OTnh2ukwxg++dAGuA6M5gUAHcVAcaBrfju4GQlU9hmg== dependencies: - tslib "^2.2.0" + tslib "^2.3.0" optionalDependencies: parse5 "^5.0.0" -"@angular/cli@~12.2.15": - version "12.2.15" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-12.2.15.tgz#30cd77f96907228b9825f2d67516d675754805da" - integrity sha512-x+MuE40IiSFWo7eJ653HskKMUvpq3t9RNf2rj1cw/6SBS0KN2RLJ/O9/IVSFRBzNdWpZyPXa7ojDXT4OzVJNpw== +"@angular/cli@~13.2.1": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-13.2.1.tgz#f39dad9703dafe944cf5d61ded6c934e0e35c7f5" + integrity sha512-LsnpesZhQerALlshnOZPffi94PIzG6JbT0JGol+qBwxYZ8SfEN+l4G9y/WyLT5FEo/3EtACTbdiObqVKiNnpzg== dependencies: - "@angular-devkit/architect" "0.1202.15" - "@angular-devkit/core" "12.2.15" - "@angular-devkit/schematics" "12.2.15" - "@schematics/angular" "12.2.15" + "@angular-devkit/architect" "0.1302.1" + "@angular-devkit/core" "13.2.1" + "@angular-devkit/schematics" "13.2.1" + "@schematics/angular" "13.2.1" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.1" - debug "4.3.2" + debug "4.3.3" ini "2.0.0" - inquirer "8.1.2" + inquirer "8.2.0" jsonc-parser "3.0.0" npm-package-arg "8.1.5" npm-pick-manifest "6.1.1" - open "8.2.1" + open "8.4.0" ora "5.4.1" - pacote "12.0.2" - resolve "1.20.0" + pacote "12.0.3" + resolve "1.22.0" semver "7.3.5" symbol-observable "4.0.0" uuid "8.3.2" -"@angular/common@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-12.0.5.tgz#05cd8fc14a0378dedcd84a6fc3024c4d0a897c0d" - integrity sha512-jKiPjWVL3jXVKgXwINlsF5O0r9gX/mAoa5UVy57O8jcg+ENbH9LLSOikgiF/0HPxk2uvRV5OYmbBgOY1xT41kQ== +"@angular/common@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-13.1.2.tgz#6a4abe30b1cc42702452bfd2214e482675f5d889" + integrity sha512-/8RWYQkZ1KPNvu2FANJM44wXlOMjMyxZVOEIn3llMRgxV2iiYtmluAOJNafTAbKedAuD6wiSpbi++QbioqCyyA== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" -"@angular/compiler-cli@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-12.0.5.tgz#c890d815da95b9b84ad8cb8be7b89baeab67f971" - integrity sha512-XBZWU2S7N2kvQJK0H5KyLHiLVhYJrjh3NtbVBv67sCY9Ft8fv2jjbozTgXqeoYZ1xAxcZ2ZAB0n5SkhmY75Mow== +"@angular/compiler-cli@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-13.1.2.tgz#f9adde80bd9d0c3d90d8758c9803537373259053" + integrity sha512-yqM6RLcYtfwIuqBQ7eS7WdksBYY7Dh9sP4rElgLiEhDGIPQf6YE5zeuRThGq5pQ2fvHbNflw8QmTHu/18Y1u/g== dependencies: "@babel/core" "^7.8.6" - "@babel/types" "^7.8.6" canonical-path "1.0.0" chokidar "^3.0.0" convert-source-map "^1.5.1" dependency-graph "^0.11.0" magic-string "^0.25.0" - minimist "^1.2.0" reflect-metadata "^0.1.2" semver "^7.0.0" - source-map "^0.6.1" sourcemap-codec "^1.4.8" - tslib "^2.1.0" - yargs "^16.2.0" + tslib "^2.3.0" + yargs "^17.2.1" -"@angular/compiler@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-12.0.5.tgz#b69a1927253b18dcaf4bac2c1107b8552ee6649e" - integrity sha512-G255aP4hhQ04hSQ1/JgiKNeTzRCuLgK220lJXkHubpu+f67os5LArhFNxZaUC/EVa/sloOT7Fo5tn8C5gy7iLA== +"@angular/compiler@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-13.1.2.tgz#86afbe282d0ff407fd8aeb66a79a804f40e7efa4" + integrity sha512-xbM3eClhUIHEFR0Et1bVC18Q7+kJx+hNNWWQl63RNYYBxTZnZpXA3mYi6IcEasy7BHkobVW+5teqlibFQY4gfQ== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" -"@angular/core@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-12.0.5.tgz#a91751a13f575fd893abbdee257f60d0747038e7" - integrity sha512-uVYsZa1VqVw8vNcjUYgfjXBc1M3WaxLXoLnCsDvutJiln4csa8Yw8p7RqQSrZ6AgQ8o2LHD2JJ5kus3EDMwfcA== +"@angular/core@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-13.1.2.tgz#793b97d0b7339d5b405f39dd5d021b4b78fcf256" + integrity sha512-dsb90lUf8BELzdg7MgSMfPc36xzZKsDggOimfXhIvmctgc+H71Zo07KYTy5JVqsscLdT+A/KBvtU1bKk4P+Rfg== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" -"@angular/forms@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-12.0.5.tgz#17e888667d644b03f4d67928f47bbf227fc6b4ee" - integrity sha512-Ew/fGPTsywoYnm6DFPA/DyLl4Sb+1/uzpledrbxUHzaSKIrnXFrjQiUTmsbbq+8qono3JzbUIblqH1DrNThYiA== +"@angular/forms@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-13.1.2.tgz#f72d7f84b78844a1606cd4226c2a3a1eb1de56b5" + integrity sha512-r5I5cPngk2Erxe/OEL9Hl1j1VcNSAAyVzh7KmtOP8z7RZYCd0MeRISKrmA5CGn5Dh7A5POFLoOpBatmvnc4Z/A== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" -"@angular/material@^12.0.0": - version "12.2.9" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-12.2.9.tgz#b4a1e138c7fd2341bd27aa6012b4738f61b5ad2d" - integrity sha512-+eM67RF038S56m3wsj37h0PyyRD18cQ8V2zmKG1UezH0nnosbmCAwzH9BfcNiIB+/V+k5QMJ/JVu5MjDQqX37w== +"@angular/material@^13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-13.1.2.tgz#497e9b34f4672ce207bb1198a823cda1f1d416ef" + integrity sha512-M7eDgTMCZ/naoiS6Z5nj3N/sNUFc+CGPHX4yb563RuknqN7huDCvdyxA6KnhYLZsVlNCPh5ZrEr6H8ZiYJWcpg== dependencies: - tslib "^2.2.0" + tslib "^2.3.0" -"@angular/platform-browser-dynamic@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.0.5.tgz#b55f6c739c15270902ae7b7f8a6ff56b8ae16b01" - integrity sha512-sYkOJxXj4vEZICT2oODkQF9wNaKoScSkiw2ooBYN0UX02mFKlWKa9vkzp6JmN1EF8YOWF0JnRqBPAi1WbOnAMw== +"@angular/platform-browser-dynamic@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.1.2.tgz#2d381503862be7a9d5fd74a27c1f8cf10d9b086e" + integrity sha512-gABOn8DxGai56WmIt5o+eXtduabiq4Mlprg+6+dv+2PvWV871pLvswV9EGUSgwKXvbhBlDZDuNFU5LgvNDuGFg== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" -"@angular/platform-browser@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-12.0.5.tgz#133c831acd00384651b2544a1c3df4d091c2218e" - integrity sha512-MLioK9gcdZOKINE8OmIHZICRnFySaWyCBeVbHS4Z4Vxgr+E2S2eO1IxBmGyQpJq1wDPBP9A/9LVLMUNbHu4Cdw== +"@angular/platform-browser@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-13.1.2.tgz#6b24c26cc01733f933a3c15288989259f83e8f46" + integrity sha512-yBUWtYJHr/1LuK3/YRRav2O82i6RHVPtRoAlZHoeTlh2CYA4u1m3JHq9XBrxIxSXexBX69pMrZENW1xskwKRTQ== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" -"@angular/router@~12.0.0": - version "12.0.5" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-12.0.5.tgz#c75dbbb1542e95d2922434f21097285927056f54" - integrity sha512-2jiaT+OxCmJbeJ0MTPmIHBsTFLysenvPZteozYsjcmUo9mOzJHAjqHLJvTC+Ri+E9xvnplh+8BPETRleV1pAFw== +"@angular/router@~13.1.2": + version "13.1.2" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-13.1.2.tgz#69146055473b9f5b8f9ba9b4de3a0740778ea174" + integrity sha512-5S0De6SdlbERoX9FwOBiTWxINchW7nTPUIH/tdanOqq12cqp6/7NigOr3BZDSvUNIh/6Is+pSQTKGAbhxejN2w== dependencies: - tslib "^2.1.0" + tslib "^2.3.0" "@assemblyscript/loader@^0.10.1": version "0.10.1" resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" @@ -377,25 +304,37 @@ dependencies: "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7": +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08" integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw== -"@babel/core@7.14.8", "@babel/core@^7.7.5", "@babel/core@^7.8.6": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.8.tgz#20cdf7c84b5d86d83fac8710a8bc605a7ba3f010" - integrity sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.8" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.8" - "@babel/helpers" "^7.14.8" - "@babel/parser" "^7.14.8" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.8" - "@babel/types" "^7.14.8" +"@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@7.16.12", "@babel/core@^7.12.3", "@babel/core@^7.7.5", "@babel/core@^7.8.6": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.12.tgz#5edc53c1b71e54881315923ae2aedea2522bb784" + integrity sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helpers" "^7.16.7" + "@babel/parser" "^7.16.12" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.10" + "@babel/types" "^7.16.8" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -403,40 +342,31 @@ semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.8.tgz#bf86fd6af96cf3b74395a8ca409515f89423e070" - integrity sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg== +"@babel/generator@7.16.8", "@babel/generator@^7.14.5", "@babel/generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: - "@babel/types" "^7.14.8" + "@babel/types" "^7.16.8" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.14.5", "@babel/generator@^7.14.8", "@babel/generator@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0" - integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw== +"@babel/helper-annotate-as-pure@7.16.7", "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" + integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== dependencies: - "@babel/types" "^7.15.4" - jsesc "^2.5.1" - source-map "^0.5.0" + "@babel/types" "^7.16.7" -"@babel/helper-annotate-as-pure@7.14.5", "@babel/helper-annotate-as-pure@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61" - integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b" + integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA== dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191" - integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/helper-explode-assignable-expression" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5": +"@babel/helper-compilation-targets@^7.13.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== @@ -446,17 +376,41 @@ browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542" - integrity sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg== +"@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" + +"@babel/helper-create-class-features-plugin@^7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz#8a6959b9cc818a88815ba3c5474619e9c0f2c21c" + integrity sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + +"@babel/helper-create-class-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba" + integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" "@babel/helper-create-regexp-features-plugin@^7.14.5": version "7.14.5" @@ -466,10 +420,18 @@ "@babel/helper-annotate-as-pure" "^7.14.5" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== +"@babel/helper-create-regexp-features-plugin@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48" + integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.7" + regexpu-core "^4.7.1" + +"@babel/helper-define-polyfill-provider@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665" + integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -480,12 +442,19 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645" - integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ== +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.16.7" + +"@babel/helper-explode-assignable-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a" + integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ== + dependencies: + "@babel/types" "^7.16.7" "@babel/helper-function-name@^7.14.5": version "7.14.5" @@ -496,14 +465,14 @@ "@babel/template" "^7.14.5" "@babel/types" "^7.14.5" -"@babel/helper-function-name@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" - integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== +"@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== dependencies: - "@babel/helper-get-function-arity" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" "@babel/helper-get-function-arity@^7.14.5": version "7.14.5" @@ -512,12 +481,12 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-get-function-arity@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" - integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.7" "@babel/helper-hoist-variables@^7.14.5": version "7.14.5" @@ -526,137 +495,98 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-hoist-variables@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" - integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.7" -"@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970" - integrity sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA== +"@babel/helper-member-expression-to-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0" + integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q== dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== - dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": +"@babel/helper-module-imports@^7.12.13": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== dependencies: "@babel/types" "^7.14.5" -"@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== - dependencies: - "@babel/types" "^7.15.4" - -"@babel/helper-module-transforms@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" - integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.14.8": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c" - integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw== - dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== +"@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== dependencies: - "@babel/types" "^7.14.5" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== +"@babel/helper-optimise-call-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2" + integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.7" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-remap-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6" - integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-wrap-function" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-replace-supers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" - integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" +"@babel/helper-plugin-utils@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== -"@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== +"@babel/helper-remap-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3" + integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-wrap-function" "^7.16.8" + "@babel/types" "^7.16.8" -"@babel/helper-simple-access@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" - integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== +"@babel/helper-replace-supers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1" + integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw== dependencies: - "@babel/types" "^7.14.5" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-member-expression-to-functions" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.7" -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4" - integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ== +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: - "@babel/types" "^7.14.5" + "@babel/types" "^7.16.0" "@babel/helper-split-export-declaration@^7.14.5": version "7.14.5" @@ -665,48 +595,53 @@ dependencies: "@babel/types" "^7.14.5" -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.7" "@babel/helper-validator-identifier@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== -"@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/helper-validator-option@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helper-wrap-function@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff" - integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ== +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helper-wrap-function@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200" + integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw== dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/helper-function-name" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.8" + "@babel/types" "^7.16.8" -"@babel/helpers@^7.14.8": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== +"@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": +"@babel/highlight@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== @@ -715,146 +650,175 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.14.5", "@babel/parser@^7.14.7": +"@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.7": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595" integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA== -"@babel/parser@^7.14.8", "@babel/parser@^7.15.4": - version "7.15.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.5.tgz#d33a58ca69facc05b26adfe4abebfed56c1c2dac" - integrity sha512-2hQstc6I7T6tQsWzlboMh3SgMRPaS4H6H7cPQsJkdzTzEGqQrpLDsE2BGASU5sBPoEQyHzeqU6C8uKbFeEk6sg== +"@babel/parser@^7.16.10", "@babel/parser@^7.16.12": + version "7.16.12" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" + integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e" - integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ== +"@babel/parser@^7.16.7", "@babel/parser@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.8.tgz#61c243a3875f7d0b0962b0543a33ece6ff2f1f17" + integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" + integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-async-generator-functions@7.14.7", "@babel/plugin-proposal-async-generator-functions@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace" - integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9" + integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + +"@babel/plugin-proposal-async-generator-functions@7.16.8", "@babel/plugin-proposal-async-generator-functions@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8" + integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== +"@babel/plugin-proposal-class-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0" + integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681" - integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg== +"@babel/plugin-proposal-class-static-block@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz#712357570b612106ef5426d13dc433ce0f200c2a" + integrity sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== +"@babel/plugin-proposal-dynamic-import@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2" + integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== +"@babel/plugin-proposal-export-namespace-from@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163" + integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== +"@babel/plugin-proposal-json-strings@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8" + integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== +"@babel/plugin-proposal-logical-assignment-operators@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea" + integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99" + integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== +"@babel/plugin-proposal-numeric-separator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9" + integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363" - integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g== +"@babel/plugin-proposal-object-rest-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz#94593ef1ddf37021a25bdcb5754c4a8d534b01d8" + integrity sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA== dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.16.7" -"@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== +"@babel/plugin-proposal-optional-catch-binding@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf" + integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== +"@babel/plugin-proposal-optional-chaining@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a" + integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== +"@babel/plugin-proposal-private-methods@^7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50" + integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.10" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636" - integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q== +"@babel/plugin-proposal-private-property-in-object@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce" + integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-create-class-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": +"@babel/plugin-proposal-unicode-property-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2" + integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== @@ -960,64 +924,73 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== +"@babel/plugin-transform-arrow-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" + integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-async-to-generator@7.14.5", "@babel/plugin-transform-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== +"@babel/plugin-transform-async-to-generator@7.16.8", "@babel/plugin-transform-async-to-generator@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808" + integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-remap-async-to-generator" "^7.16.8" -"@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== +"@babel/plugin-transform-block-scoped-functions@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620" + integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-block-scoping@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" - integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== +"@babel/plugin-transform-block-scoping@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87" + integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-classes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf" - integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA== +"@babel/plugin-transform-classes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00" + integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.16.7" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-optimise-call-expression" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== +"@babel/plugin-transform-computed-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470" + integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" - integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== +"@babel/plugin-transform-destructuring@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz#ca9588ae2d63978a4c29d3f33282d8603f618e23" + integrity sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4": +"@babel/plugin-transform-dotall-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241" + integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-dotall-regex@^7.4.4": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== @@ -1025,226 +998,228 @@ "@babel/helper-create-regexp-features-plugin" "^7.14.5" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== +"@babel/plugin-transform-duplicate-keys@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9" + integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== +"@babel/plugin-transform-exponentiation-operator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b" + integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-for-of@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb" - integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA== +"@babel/plugin-transform-for-of@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c" + integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== +"@babel/plugin-transform-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf" + integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA== dependencies: - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== +"@babel/plugin-transform-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1" + integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== +"@babel/plugin-transform-member-expression-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384" + integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== +"@babel/plugin-transform-modules-amd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186" + integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g== dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97" - integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A== +"@babel/plugin-transform-modules-commonjs@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe" + integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA== dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-simple-access" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29" - integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA== +"@babel/plugin-transform-modules-systemjs@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7" + integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw== dependencies: - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== +"@babel/plugin-transform-modules-umd@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618" + integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ== dependencies: - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e" - integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252" + integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.7" -"@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== +"@babel/plugin-transform-new-target@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" + integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== +"@babel/plugin-transform-object-super@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94" + integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-replace-supers" "^7.16.7" -"@babel/plugin-transform-parameters@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3" - integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA== +"@babel/plugin-transform-parameters@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f" + integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== +"@babel/plugin-transform-property-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55" + integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== +"@babel/plugin-transform-regenerator@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb" + integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== +"@babel/plugin-transform-reserved-words@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586" + integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-runtime@7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.14.5.tgz#30491dad49c6059f8f8fa5ee8896a0089e987523" - integrity sha512-fPMBhh1AV8ZyneiCIA+wYYUH1arzlXR1UMcApjvchDhfKxhy2r2lReJv8uHEyihi4IFIGlr1Pdx7S5fkESDQsg== +"@babel/plugin-transform-runtime@7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz#53d9fd3496daedce1dd99639097fa5d14f4c7c2c" + integrity sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w== dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-spread@^7.14.6": - version "7.14.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144" - integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" - -"@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/preset-env@7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.8.tgz#254942f5ca80ccabcfbb2a9f524c74bca574005b" - integrity sha512-a9aOppDU93oArQ51H+B8M1vH+tayZbuBqzjOhntGetZVa+4tTu5jp+XTwqHGG2lxslqomPYVSjIxQkFwXzgnxg== - dependencies: - "@babel/compat-data" "^7.14.7" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-async-generator-functions" "^7.14.7" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.14.5" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.14.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.14.5" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" +"@babel/plugin-transform-shorthand-properties@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a" + integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-spread@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44" + integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + +"@babel/plugin-transform-sticky-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660" + integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-template-literals@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab" + integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-typeof-symbol@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e" + integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-escapes@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3" + integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/plugin-transform-unicode-regex@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2" + integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + +"@babel/preset-env@7.16.11": + version "7.16.11" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" + integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== + dependencies: + "@babel/compat-data" "^7.16.8" + "@babel/helper-compilation-targets" "^7.16.7" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.16.7" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.16.7" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -1259,50 +1234,50 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.14.5" - "@babel/plugin-transform-classes" "^7.14.5" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.14.5" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.14.5" - "@babel/plugin-transform-modules-systemjs" "^7.14.5" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.14.5" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.14.6" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.14.8" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.2" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.15.0" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.16.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.16.8" + "@babel/plugin-transform-modules-systemjs" "^7.16.7" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.16.7" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.8" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.20.2" semver "^6.3.0" -"@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -1318,32 +1293,23 @@ core-js-pure "^3.15.0" regenerator-runtime "^0.13.4" -"@babel/runtime@7.14.8", "@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.8.tgz#7119a56f421018852694290b9f9148097391b446" - integrity sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg== +"@babel/runtime@7.16.7", "@babel/runtime@^7.10.2", "@babel/runtime@^7.8.4": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa" + integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== +"@babel/template@7.16.7", "@babel/template@^7.14.5", "@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" -"@babel/template@^7.14.5", "@babel/template@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5": +"@babel/traverse@^7.13.0": version "7.14.7" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753" integrity sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ== @@ -1358,22 +1324,39 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.14.8", "@babel/traverse@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" - integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" +"@babel/traverse@^7.16.10": + version "7.16.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" + integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.10" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.8.tgz#bab2f2b09a5fe8a8d9cad22cbfe3ba1d126fef9c" + integrity sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.16.7" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.16.8" + "@babel/types" "^7.16.8" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.14.5", "@babel/types@^7.4.4", "@babel/types@^7.8.6": +"@babel/types@^7.14.5", "@babel/types@^7.4.4": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== @@ -1381,12 +1364,12 @@ "@babel/helper-validator-identifier" "^7.14.5" to-fast-properties "^2.0.0" -"@babel/types@^7.14.8", "@babel/types@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.4.tgz#74eeb86dbd6748d2741396557b9860e57fce0a0d" - integrity sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw== +"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== dependencies: - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@cspotcode/source-map-consumer@0.8.0": @@ -1401,74 +1384,74 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== - -"@discoveryjs/json-ext@0.5.3": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" - integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== +"@discoveryjs/json-ext@0.5.6": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" + integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== -"@es-joy/jsdoccomment@~0.17.0": - version "0.17.0" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.17.0.tgz#e6dcfeefdd070b317d572ec38e791b9602f506f2" - integrity sha512-B8DIIWE194KyQFPojUs+THa2XX+1vulwTBjirw6GqcxjtNE60Rreex26svBnV9SNLTuz92ctZx5XQE1H7yOxgA== +"@es-joy/jsdoccomment@~0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.18.0.tgz#2532b2ecb8576d694011b157c447ed6b12534c70" + integrity sha512-TjT8KJULV4I6ZiwIoKr6eMs+XpRejqwJ/VA+QPDeFGe9j6bZFKmMJ81EeFsGm6JNZhnzm37aoxVROmTh2PZoyA== dependencies: comment-parser "1.3.0" esquery "^1.4.0" - jsdoc-type-pratt-parser "~2.2.1" + jsdoc-type-pratt-parser "~2.2.2" -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint/eslintrc@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318" + integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" + debug "^4.3.2" + espree "^9.2.0" globals "^13.9.0" ignore "^4.0.6" import-fresh "^3.2.1" - js-yaml "^3.13.1" + js-yaml "^4.1.0" minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@gar/promisify@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" + integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== + +"@humanwhocodes/config-array@^0.9.2": + version "0.9.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.2.tgz#68be55c737023009dfc5fe245d51181bb6476914" + integrity sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" "@istanbuljs/schema@^0.1.2": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/resolve-uri@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz#3fdf5798f0b49e90155896f6291df186eac06c83" - integrity sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA== - -"@jsdevtools/coverage-istanbul-loader@3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz#2a4bc65d0271df8d4435982db4af35d81754ee26" - integrity sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA== - dependencies: - convert-source-map "^1.7.0" - istanbul-lib-instrument "^4.0.3" - loader-utils "^2.0.0" - merge-source-map "^1.1.0" - schema-utils "^2.7.0" +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.3.tgz#b80093f4edbb5490c49746231513669c8f518acb" + integrity sha512-fuIOnc81C5iRNevb/XPiM8Khp9bVjreydRQ37rt0C/dY0PAW1DRvEM3WrKX/5rStS5lbgwS0FCgqSndh9tvK5w== "@ngneat/transloco-utils@^3.0.1": version "3.0.2" @@ -1478,10 +1461,10 @@ cosmiconfig "^7.0.0" tslib "^2.3.0" -"@ngneat/transloco@3.1.1": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@ngneat/transloco/-/transloco-3.1.1.tgz#c1c08803811647c6241e38b69cbd3c7896414b43" - integrity sha512-AcZQzupOELLbfIHfaSz0ewxeigAfqJKK2DCzvOsSaUHNuJGqcLk5FvltX3HX+vlDe0liURzYtYvew9j59QF/+w== +"@ngneat/transloco@3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@ngneat/transloco/-/transloco-3.1.3.tgz#359cd87917447c158e9d05851d7b3d27073e2166" + integrity sha512-Qij0510+Hf4b3cIdMuHft4m4FfIaMveGAuAWcahl1WaqT/Efu5yeTjW2Dfms3EhAYLqBNj6eO9UmpHjCfSo8Lg== dependencies: "@ngneat/transloco-utils" "^3.0.1" flat "5.0.2" @@ -1490,10 +1473,31 @@ replace-in-file "^6.2.0" tslib "^2.2.0" -"@ngtools/webpack@12.2.12": - version "12.2.12" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-12.2.12.tgz#5c0ef0d26ba332e4b52a1efb92fefe5b76863d26" - integrity sha512-j3043wP+EWk2zMmAYrOzecpUX2n37R6XqypEBbj1qLAQBiSDulRN0dIsZzgTlrBgeOQ1YtFoRMuqaPsGIbuNiw== +"@ngtools/webpack@13.2.1": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-13.2.1.tgz#20887a22ecde77d3f022f7fdace8aead2e425bab" + integrity sha512-NugLJfzp0EFX2Pdbr94bsktE/qniUE6mEgmv3ZkmimPBBHhAd1M73XBx8lesjLh7D3SRecHCjD5yyygF8gNO0g== + +"@ngxs/form-plugin@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@ngxs/form-plugin/-/form-plugin-3.7.3.tgz#96633a62666a8973050a5d65e4a2c89a80e5d40d" + integrity sha512-P4yfW/JO29I3qJIVYDO+TRZ8WbsJNHYKeQct/hN047uBB/X93By3eeItgwbU7oe4Khv3cRt+37RuJcgw9IAjLw== + dependencies: + tslib "^1.9.0" + +"@ngxs/storage-plugin@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@ngxs/storage-plugin/-/storage-plugin-3.7.3.tgz#6ece7ed0e48386d1b42b0a9dad8de6bc81af6d2a" + integrity sha512-NSQdOJ2WKhRXY++UaXeuGIxTW4V3x2vunRutS2O28y7NViWwOz06SpwnD9McU868G6R0xxcmEiZvj8EYBMZuaQ== + dependencies: + tslib "^1.9.0" + +"@ngxs/store@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@ngxs/store/-/store-3.7.3.tgz#74e2878d527fc12dace343ce43fd79fa1a2645af" + integrity sha512-JjATXC7FsxxQu2SaayP/iLe4O+5/RkRov3/J7WkaQmV6/JWFNkkdOwbEa6pDbh/po0JO7DHHMk3huIUNpDu67g== + dependencies: + tslib "^1.9.0" "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1516,6 +1520,14 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.0.tgz#bec1d1b89c170d40e1b73ad6c943b0b75e7d2951" + integrity sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA== + dependencies: + "@gar/promisify" "^1.0.1" + semver "^7.3.5" + "@npmcli/git@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-2.1.0.tgz#2fbd77e147530247d37f325930d457b3ebe894f6" @@ -1631,13 +1643,13 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.15.tgz#6a9d143f7f4f49db2d782f9e1c8839a29b43ae23" integrity sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA== -"@schematics/angular@12.2.15": - version "12.2.15" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-12.2.15.tgz#c54b66c8dee817d9726866d2f38a9a1c067fdcee" - integrity sha512-ZikKBRBNcE3+BkV9EGsCrpRQ4uhQ1dFNKff9l65tIeXtJcG0RFmbNmiqVwv60sXXqYIVtHlDuuB2+5+heMYHpQ== +"@schematics/angular@13.2.1": + version "13.2.1" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-13.2.1.tgz#72553b75f09144997aa1b0947c629836af86ec12" + integrity sha512-WoJXGYBpv2tBFBO89L82b8e21aR856xAtghe+Il6qr/bz2F9ovGJZRa6SMGWS7hBE65CJFI3HpMCksvWeJiazg== dependencies: - "@angular-devkit/core" "12.2.15" - "@angular-devkit/schematics" "12.2.15" + "@angular-devkit/core" "13.2.1" + "@angular-devkit/schematics" "13.2.1" jsonc-parser "3.0.0" "@sindresorhus/is@^0.14.0": @@ -1714,10 +1726,10 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@trysound/sax@0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.1.1.tgz#3348564048e7a2d7398c935d466c0414ebb6a669" - integrity sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow== +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@tsconfig/node10@^1.0.7": version "1.0.8" @@ -1739,6 +1751,21 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + "@types/cacheable-request@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" @@ -1754,6 +1781,21 @@ resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea" integrity sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg== +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + "@types/cookie@^0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" @@ -1772,11 +1814,6 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint-visitor-keys@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" - integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== - "@types/eslint@*": version "7.2.13" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.13.tgz#e0ca7219ba5ded402062ad6f926d491ebb29dd53" @@ -1795,25 +1832,43 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== -"@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== dependencies: - "@types/minimatch" "*" "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" "@types/http-cache-semantics@*": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== +"@types/http-proxy@^1.17.5": + version "1.17.8" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" + integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== + dependencies: + "@types/node" "*" + "@types/jasmine@~3.10.3": version "3.10.3" resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.10.3.tgz#a89798b3d5a8bd23ca56e855a9aee3e5a93bdaaa" integrity sha512-SWyMrjgdAUHNQmutvDcKablrJhkDLy4wunTme8oYLjKp41GnHGxMRXr2MQMvy/qy8H3LdzwQk9gH4hZ6T++H8g== -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.7": +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== @@ -1835,37 +1890,30 @@ dependencies: "@types/node" "*" -"@types/lodash.merge@^4.6.6": - version "4.6.6" - resolved "https://registry.yarnpkg.com/@types/lodash.merge/-/lodash.merge-4.6.6.tgz#b84b403c1d31bc42d51772d1cd5557fa008cd3d6" - integrity sha512-IB90krzMf7YpfgP3u/EvZEdXVvm4e3gJbUvh5ieuI+o+XqiNEt6fCzqNRaiLlPVScLI59RxIGZMQ3+Ko/DJ8vQ== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.170" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" - integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== - -"@types/minimatch@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.4.tgz#f0ec25dbf2f0e4b18647313ac031134ca5b24b21" - integrity sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== -"@types/node@*", "@types/node@>=10.0.0", "@types/node@^17.0.8": - version "17.0.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" - integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== +"@types/node@*", "@types/node@>=10.0.0", "@types/node@^17.0.14": + version "17.0.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.14.tgz#33b9b94f789a8fedd30a68efdbca4dbb06b61f20" + integrity sha512-SbjLmERksKOGzWzPNuW7fJM7fk3YXVTFiZWB/Hs99gwhk+/dnrQRPBQjPW9aO+fi1tAffi9PrwFvsmOKmDTyng== "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/q@^0.0.32": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" - integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== "@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" @@ -1874,74 +1922,55 @@ dependencies: "@types/node" "*" -"@types/selenium-webdriver@^3.0.0": - version "3.0.17" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b" - integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw== +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" -"@types/webpack-sources@^0.1.5": - version "0.1.8" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.8.tgz#078d75410435993ec8a0a2855e88706f3f751f81" - integrity sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA== +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== dependencies: + "@types/mime" "^1" "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" -"@typescript-eslint/eslint-plugin@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" + "@types/node" "*" + +"@types/ws@^8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" + integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz#f8c1d59fc37bd6d9d11c97267fdfe722c4777152" + integrity sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q== + dependencies: + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/type-utils" "5.10.2" + "@typescript-eslint/utils" "5.10.2" + debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" - regexpp "^3.1.0" + regexpp "^3.2.0" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/experimental-utils@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz#4ebdec06a10888e9326e1d51d81ad52a361bd0b0" - integrity sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.28.2" - "@typescript-eslint/types" "4.28.2" - "@typescript-eslint/typescript-estree" "4.28.2" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/experimental-utils@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - "@typescript-eslint/experimental-utils@5.3.0": version "5.3.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.3.0.tgz#ee56b4957547ed2b0fc7451205e41502e664f546" @@ -1954,42 +1983,38 @@ eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/parser@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.10.0.tgz#e039664f294eb7ab1d3ede7125f5e01be67acc7f" + integrity sha512-GeQAPqQMI5DVMGOUwGbSR+NdsirryyKOgUFRTWInhlsKUArns/MVnXmPpzxfrzB1nU36cT5WJAwmfCsjoaVBWg== dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" + "@typescript-eslint/utils" "5.10.0" -"@typescript-eslint/parser@^3.0.0": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.10.1.tgz#1883858e83e8b442627e1ac6f408925211155467" - integrity sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw== +"@typescript-eslint/parser@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.10.2.tgz#b6076d27cc5499ce3f2c625f5ccde946ecb7db9a" + integrity sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "3.10.1" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-visitor-keys "^1.1.0" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/typescript-estree" "5.10.2" + debug "^4.3.2" -"@typescript-eslint/scope-manager@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz#451dce90303a3ce283750111495d34c9c204e510" - integrity sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A== +"@typescript-eslint/scope-manager@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz#bb5d872e8b9e36203908595507fbc4d3105329cb" + integrity sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg== dependencies: - "@typescript-eslint/types" "4.28.2" - "@typescript-eslint/visitor-keys" "4.28.2" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== +"@typescript-eslint/scope-manager@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz#92c0bc935ec00f3d8638cdffb3d0e70c9b879639" + integrity sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/visitor-keys" "5.10.2" "@typescript-eslint/scope-manager@5.3.0": version "5.3.0" @@ -1999,63 +2024,53 @@ "@typescript-eslint/types" "5.3.0" "@typescript-eslint/visitor-keys" "5.3.0" -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== +"@typescript-eslint/type-utils@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz#ad5acdf98a7d2ab030bea81f17da457519101ceb" + integrity sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw== + dependencies: + "@typescript-eslint/utils" "5.10.2" + debug "^4.3.2" + tsutils "^3.21.0" -"@typescript-eslint/types@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.28.2.tgz#e6b9e234e0e9a66c4d25bab881661e91478223b5" - integrity sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA== +"@typescript-eslint/types@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.0.tgz#beb3cb345076f5b088afe996d57bcd1dfddaa75c" + integrity sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ== -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/types@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.10.2.tgz#604d15d795c4601fffba6ecb4587ff9fdec68ce8" + integrity sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w== "@typescript-eslint/types@5.3.0": version "5.3.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.3.0.tgz#af29fd53867c2df0028c57c36a655bd7e9e05416" integrity sha512-fce5pG41/w8O6ahQEhXmMV+xuh4+GayzqEogN24EK+vECA3I6pUwKuLi5QbXO721EMitpQne5VKXofPonYlAQg== -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== - dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" - -"@typescript-eslint/typescript-estree@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz#680129b2a285289a15e7c6108c84739adf3a798c" - integrity sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg== +"@typescript-eslint/typescript-estree@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz#4be24a3dea0f930bb1397c46187d0efdd955a224" + integrity sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA== dependencies: - "@typescript-eslint/types" "4.28.2" - "@typescript-eslint/visitor-keys" "4.28.2" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/visitor-keys" "5.10.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== +"@typescript-eslint/typescript-estree@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz#810906056cd3ddcb35aa333fdbbef3713b0fe4a7" + integrity sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/visitor-keys" "5.10.2" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" @@ -2072,28 +2087,45 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/utils@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.0.tgz#c3d152a85da77c400e37281355561c72fb1b5a65" + integrity sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg== + dependencies: + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.10.0" + "@typescript-eslint/types" "5.10.0" + "@typescript-eslint/typescript-estree" "5.10.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/utils@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.10.2.tgz#1fcd37547c32c648ab11aea7173ec30060ee87a8" + integrity sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg== dependencies: - eslint-visitor-keys "^1.1.0" + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.10.2" + "@typescript-eslint/types" "5.10.2" + "@typescript-eslint/typescript-estree" "5.10.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@4.28.2": - version "4.28.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz#bf56a400857bb68b59b311e6d0a5fbef5c3b5130" - integrity sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w== +"@typescript-eslint/visitor-keys@5.10.0": + version "5.10.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz#770215497ad67cd15a572b52089991d5dfe06281" + integrity sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ== dependencies: - "@typescript-eslint/types" "4.28.2" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.10.0" + eslint-visitor-keys "^3.0.0" -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== +"@typescript-eslint/visitor-keys@5.10.2": + version "5.10.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz#fdbf272d8e61c045d865bd6c8b41bea73d222f3d" + integrity sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q== dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.10.2" + eslint-visitor-keys "^3.0.0" "@typescript-eslint/visitor-keys@5.3.0": version "5.3.0" @@ -2262,7 +2294,7 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78" integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA== -acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: +acorn-jsx@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== @@ -2272,16 +2304,16 @@ acorn-walk@^8.0.0, acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc" integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w== -acorn@^7.1.1, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8.0.4, acorn@^8.4.1: version "8.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c" integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA== +acorn@^8.7.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== + adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" @@ -2290,11 +2322,6 @@ adjust-sourcemap-loader@^4.0.0: loader-utils "^2.0.0" regex-parser "^2.2.11" -adm-zip@^0.4.9: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -2302,13 +2329,6 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== - dependencies: - es6-promisify "^5.0.0" - agentkeepalive@^4.1.3: version "4.1.4" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" @@ -2326,34 +2346,36 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-formats@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.0.tgz#96eaf83e38d32108b66d82a9cb0cfa24886cdfeb" - integrity sha512-USH2jBb+C/hIpwD2iRjp0pe0k+MvzG0mlSn/FIdCgQhUb9ALPRjt2KIQdfZDS9r0ZIeUAg7gOu9KL0PFqGqr5Q== +ajv-formats@2.1.1, ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: ajv "^8.0.0" -ajv-keywords@^3.1.0, ajv-keywords@^3.5.2: +ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@8.6.2, ajv@^8.0.0, ajv@^8.0.1: - version "8.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@8.9.0, ajv@^8.0.0, ajv@^8.8.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2363,11 +2385,6 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - ansi-align@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" @@ -2380,11 +2397,6 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2392,10 +2404,10 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" @@ -2412,22 +2424,22 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -2441,14 +2453,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -2507,6 +2511,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" @@ -2515,21 +2524,6 @@ aria-query@^4.2.2: "@babel/runtime" "^7.10.2" "@babel/runtime-corejs3" "^7.10.2" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -2556,13 +2550,6 @@ array-includes@^3.1.4: get-intrinsic "^1.1.1" is-string "^1.0.7" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" @@ -2573,16 +2560,6 @@ array-union@^3.0.1: resolved "https://registry.yarnpkg.com/array-union/-/array-union-3.0.1.tgz#da52630d327f8b88cfbfb57728e2af5cd9b6b975" integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - array.prototype.flat@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" @@ -2592,43 +2569,6 @@ array.prototype.flat@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - async@0.9.x: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -2641,11 +2581,6 @@ async@^2.6.2: dependencies: lodash "^4.17.14" -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -2656,38 +2591,27 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.6.1: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== +autoprefixer@^10.4.2: + version "10.4.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.2.tgz#25e1df09a31a9fba5c40b578936b90d35c9d4d3b" + integrity sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ== dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - colorette "^1.2.1" + browserslist "^4.19.1" + caniuse-lite "^1.0.30001297" + fraction.js "^4.1.2" normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" axobject-query@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-loader@8.2.2: - version "8.2.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" - integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== +babel-loader@8.2.3: + version "8.2.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" + integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw== dependencies: find-cache-dir "^3.3.1" loader-utils "^1.4.0" @@ -2701,29 +2625,40 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== +babel-plugin-istanbul@6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5" + integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.3.1" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.2.2: - version "0.2.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.3.tgz#72add68cf08a8bf139ba6e6dfc0b1d504098e57b" - integrity sha512-rCOFzEIJpJEAU14XCcV/erIf/wZQMmMT5l5vXOpL5uoznyOGfDIjPj6FVytMvtzaKSTSVKouOCTPJ5OMUZH30g== +babel-plugin-polyfill-corejs3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz#d66183bf10976ea677f4149a7fcc4d8df43d4060" + integrity sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.14.0" + "@babel/helper-define-polyfill-provider" "^0.3.1" + core-js-compat "^3.20.0" -babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990" + integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.3.1" balanced-match@^1.0.0: version "1.0.2" @@ -2745,31 +2680,11 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -2823,23 +2738,11 @@ bin-wrapper@^4.0.0, bin-wrapper@^4.0.1: os-filter-obj "^2.0.0" pify "^4.0.1" -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - bl@^1.0.0: version "1.2.3" resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7" @@ -2857,13 +2760,6 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -blocking-proxy@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" - integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== - dependencies: - minimist "^1.2.0" - body-parser@1.19.0, body-parser@^1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -2924,22 +2820,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2947,23 +2827,16 @@ braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.6, browserslist@^4.6.4, browserslist@^4.9.1: - version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== +browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.9.1: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" escalade "^3.1.1" - node-releases "^1.1.71" - -browserstack@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.1.tgz#e051f9733ec3b507659f395c7a4765a1b1e358b3" - integrity sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw== - dependencies: - https-proxy-agent "^2.2.1" + node-releases "^2.0.1" + picocolors "^1.0.0" buffer-alloc-unsafe@^1.1.0: version "1.1.0" @@ -3021,11 +2894,12 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@15.2.0, cacache@^15.0.5, cacache@^15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.2.0.tgz#73af75f77c58e72d8c630a7a2858cb18ef523389" - integrity sha512-uKoJSHmnrqXgthDFx/IU6ED/5xd+NNGe+Bb+kLZy7Ku4P+BaiWEUflAKPZ7eAzsYGcsAGASJZsybXp+quEcHTw== +cacache@15.3.0, cacache@^15.0.5, cacache@^15.2.0: + version "15.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" + 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" @@ -3044,21 +2918,6 @@ cacache@15.2.0, cacache@^15.0.5, cacache@^15.2.0: tar "^6.0.2" unique-filename "^1.1.1" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" @@ -3129,7 +2988,7 @@ camelcase@^2.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= -camelcase@^5.0.0: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3139,31 +2998,16 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001032, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: - version "1.0.30001241" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598" - integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ== +caniuse-lite@^1.0.30001286, caniuse-lite@^1.0.30001297, caniuse-lite@^1.0.30001299: + version "1.0.30001300" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz#11ab6c57d3eb6f964cba950401fd00a146786468" + integrity sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA== canonical-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - caw@^2.0.0, caw@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95" @@ -3190,7 +3034,7 @@ chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -3215,7 +3059,7 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, chokidar@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== @@ -3230,25 +3074,6 @@ chardet@^0.7.0: optionalDependencies: fsevents "~2.3.2" -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -3274,16 +3099,6 @@ circular-dependency-plugin@5.2.2: resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz#39e836079db1d3cf2f988dc48c5188a44058b600" integrity sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -3311,15 +3126,6 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -3364,14 +3170,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3417,44 +3215,22 @@ color@^3.1.3: color-convert "^1.9.1" color-string "^1.5.4" -colord@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.0.1.tgz#1e7fb1f9fa1cf74f42c58cb9c20320bab8435aa0" - integrity sha512-vm5YpaWamD0Ov6TSG0GGmUIwstrWcfKQV/h2CmbR7PbNu41+qdB5PW9lpzhjedrpm08uuYvcXi0Oel1RLZIJuA== - -colord@^2.6: - version "2.7.0" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.7.0.tgz#706ea36fe0cd651b585eb142fe64b6480185270e" - integrity sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q== - -colorette@^1.2.1, colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== +colorette@^2.0.10: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== colors@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - commander@^2.20.0, commander@^2.8.1: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - -commander@^7.1.0: +commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -3464,17 +3240,12 @@ comment-parser@1.3.0: resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.0.tgz#68beb7dbe0849295309b376406730cd16c719c44" integrity sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA== -common-tags@^1.4.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" - integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.1, component-emitter@~1.3.0: +component-emitter@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== @@ -3524,6 +3295,11 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" +confusing-browser-globals@^1.0.10: + version "1.0.11" + resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" @@ -3590,30 +3366,24 @@ copy-anything@^2.0.1: dependencies: is-what "^3.12.0" -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -copy-webpack-plugin@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz#b71d21991599f61a4ee00ba79087b8ba279bbb59" - integrity sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw== +copy-webpack-plugin@10.2.1: + version "10.2.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz#115a41f913070ac236a1b576066204cbf35341a1" + integrity sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg== dependencies: - fast-glob "^3.2.5" - glob-parent "^6.0.0" - globby "^11.0.3" + fast-glob "^3.2.7" + glob-parent "^6.0.1" + globby "^12.0.2" normalize-path "^3.0.0" - p-limit "^3.1.0" - schema-utils "^3.0.0" + schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.14.0, core-js-compat@^3.15.0: - version "3.15.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.1.tgz#1afe233716d37ee021956ef097594071b2b585a7" - integrity sha512-xGhzYMX6y7oEGQGAJmP2TmtBLvR4nZmRGEcFa3ubHOq5YEp51gGN9AovVa0AoujGZIq+Wm6dISiYyGNfdflYww== +core-js-compat@^3.20.0, core-js-compat@^3.20.2: + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.3.tgz#d71f85f94eb5e4bea3407412e549daa083d23bd6" + integrity sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw== dependencies: - browserslist "^4.16.6" + browserslist "^4.19.1" semver "7.0.0" core-js-pure@^3.15.0: @@ -3621,15 +3391,10 @@ core-js-pure@^3.15.0: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.1.tgz#8356f6576fa2aa8e54ca6fe02620968ff010eed7" integrity sha512-OZuWHDlYcIda8sJLY4Ec6nWq2hRjlyCqCZ+jCflyleMkVt3tPedDVErvHslyS2nbO+SlBFMSBJYvtLMwxnrzjA== -core-js@3.16.0: - version "3.16.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.0.tgz#1d46fb33720bc1fa7f90d20431f36a5540858986" - integrity sha512-5+5VxRFmSf97nM8Jr2wzOwLqRo6zphH2aX+7KsAUONObyzakDNq2G/bgbhinxB4PoV9L3aXQYhiDKyIKWd2c8g== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-js@3.20.3: + version "3.20.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.20.3.tgz#c710d0a676e684522f3db4ee84e5e18a9d11d69a" + integrity sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag== core-util-is@~1.0.0: version "1.0.3" @@ -3660,13 +3425,13 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -critters@0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.12.tgz#32baa87526e053a41b67e19921673ed92264e2ab" - integrity sha512-ujxKtKc/mWpjrOKeaACTaQ1aP0O31M0ZPWhfl85jZF1smPU4Ivb9va5Ox2poif4zVJQQo0LCFlzGtEZAsCAPcw== +critters@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.16.tgz#ffa2c5561a65b43c53b940036237ce72dcebfe93" + integrity sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A== dependencies: chalk "^4.1.0" - css-select "^4.1.3" + css-select "^4.2.0" parse5 "^6.0.1" parse5-htmlparser2-tree-adapter "^6.0.1" postcss "^8.3.7" @@ -3679,7 +3444,7 @@ cross-env@7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@7.0.3, cross-spawn@^7.0.1, cross-spawn@^7.0.2: +cross-spawn@7.0.3, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3710,40 +3475,27 @@ cross-spawn@^6.0.0: crypto-random-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== - dependencies: - postcss "^7.0.5" - -css-color-names@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-1.0.1.tgz#6ff7ee81a823ad46e020fa2fd6ab40a887e2ba67" - integrity sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA== + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-declaration-sorter@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.0.3.tgz#9dfd8ea0df4cc7846827876fafb52314890c21a9" - integrity sha512-52P95mvW1SMzuRZegvpluT6yEv0FqQusydKQPZsNN5Q7hh8EwQvN8E2nwuJ16BBvNN6LcoIZXu/Bk58DAhrrxw== +css-blank-pseudo@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz#f8660f6a48b17888a9277e53f25cc5abec1f0169" + integrity sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew== dependencies: - timsort "^0.3.0" + postcss-selector-parser "^6.0.8" -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== +css-has-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz#4824a34cb92dae7e09ea1d3fd19691b653412098" + integrity sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ== dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" + postcss-selector-parser "^6.0.8" -css-loader@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.2.0.tgz#9663d9443841de957a3cb9bcea2eda65b3377071" - integrity sha512-/rvHfYRjIpymZblf49w8jYcRo2y9gj6rV8UroHGmBxKrIyGLokpycyKzp9OkitvqT29ZSpzJ0Ic7SpnJX3sC8g== +css-loader@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.5.1.tgz#0c43d4fbe0d97f699c91e9818cb585759091d1b1" + integrity sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ== dependencies: icss-utils "^5.1.0" postcss "^8.2.15" @@ -3754,139 +3506,46 @@ css-loader@6.2.0: postcss-value-parser "^4.1.0" semver "^7.3.5" -css-minimizer-webpack-plugin@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.0.2.tgz#8fadbdf10128cb40227bff275a4bb47412534245" - integrity sha512-B3I5e17RwvKPJwsxjjWcdgpU/zqylzK1bPVghcmpFHRL48DXiBgrtqz1BJsn68+t/zzaLp9kYAaEDvQ7GyanFQ== - dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - p-limit "^3.0.2" - postcss "^8.3.5" - schema-utils "^3.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-parse@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= - dependencies: - css "^2.0.0" - -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" +css-prefers-color-scheme@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz#d5c03a980caab92d8beeee176a8795d331e0c727" + integrity sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA== -css-select@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" - integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== +css-select@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" + integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== dependencies: boolbase "^1.0.0" - css-what "^5.0.0" - domhandler "^4.2.0" - domutils "^2.6.0" - nth-check "^2.0.0" - -css-tree@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" + css-what "^5.1.0" + domhandler "^4.3.0" + domutils "^2.8.0" + nth-check "^2.0.1" -css-what@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" - integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== +css-what@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" + integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== -css@^2.0.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== dependencies: - inherits "^2.0.3" + inherits "^2.0.4" source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" + source-map-resolve "^0.6.0" -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== - -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== +cssdb@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-5.1.0.tgz#ec728d5f5c0811debd0820cbebda505d43003400" + integrity sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw== cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.1.4.tgz#359943bf00c5c8e05489f12dd25f3006f2c1cbd2" - integrity sha512-sPpQNDQBI3R/QsYxQvfB4mXeEcWuw0wGtKtmS5eg8wudyStYMgKOQT39G07EbW1LB56AOYrinRS9f0ig4Y3MhQ== - dependencies: - css-declaration-sorter "^6.0.3" - cssnano-utils "^2.0.1" - postcss-calc "^8.0.0" - postcss-colormin "^5.2.0" - postcss-convert-values "^5.0.1" - postcss-discard-comments "^5.0.1" - postcss-discard-duplicates "^5.0.1" - postcss-discard-empty "^5.0.1" - postcss-discard-overridden "^5.0.1" - postcss-merge-longhand "^5.0.2" - postcss-merge-rules "^5.0.2" - postcss-minify-font-values "^5.0.1" - postcss-minify-gradients "^5.0.2" - postcss-minify-params "^5.0.1" - postcss-minify-selectors "^5.1.0" - postcss-normalize-charset "^5.0.1" - postcss-normalize-display-values "^5.0.1" - postcss-normalize-positions "^5.0.1" - postcss-normalize-repeat-style "^5.0.1" - postcss-normalize-string "^5.0.1" - postcss-normalize-timing-functions "^5.0.1" - postcss-normalize-unicode "^5.0.1" - postcss-normalize-url "^5.0.2" - postcss-normalize-whitespace "^5.0.1" - postcss-ordered-values "^5.0.2" - postcss-reduce-initial "^5.0.1" - postcss-reduce-transforms "^5.0.1" - postcss-svgo "^5.0.2" - postcss-unique-selectors "^5.0.1" - -cssnano-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-2.0.1.tgz#8660aa2b37ed869d2e2f22918196a9a8b6498ce2" - integrity sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ== - -cssnano@^5.0.6: - version "5.0.8" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.0.8.tgz#39ad166256980fcc64faa08c9bb18bb5789ecfa9" - integrity sha512-Lda7geZU0Yu+RZi2SGpjYuQz4HI4/1Y+BhdD0jL7NXAQ5larCzVn+PUGuZbDMYz904AXXCOgO5L1teSvgu7aFg== - dependencies: - cssnano-preset-default "^5.1.4" - is-resolvable "^1.1.0" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -3899,58 +3558,32 @@ custom-event@~1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -date-format@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-2.1.0.tgz#31d5b5ea211cf5fd764cd38baf9d033df7e125cf" - integrity sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA== - -date-format@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/date-format/-/date-format-3.0.0.tgz#eb8780365c7d2b1511078fb491e6479780f3ad95" - integrity sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w== +date-format@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.3.tgz#f63de5dc08dc02efd8ef32bf2a6918e486f35873" + integrity sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@4.3.3, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@~4.3.1, debug@~4.3.2: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" -debug@4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -debug@^3.1.0, debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: +debug@^3.1.1, debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4057,13 +3690,12 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" + execa "^5.0.0" defaults@^1.0.3: version "1.0.3" @@ -4094,58 +3726,19 @@ define-properties@^1.1.3: dependencies: object-keys "^1.0.12" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - 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" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" delegates@^1.0.0: version "1.0.0" @@ -4194,11 +3787,6 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dlv@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -4264,10 +3852,17 @@ domhandler@^4.2.0: dependencies: domelementtype "^2.2.0" -domutils@^2.6.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" - integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== +domhandler@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" + integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== + dependencies: + domelementtype "^2.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" domelementtype "^2.2.0" @@ -4325,14 +3920,6 @@ duplexer@^0.1.2: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -4345,10 +3932,10 @@ ejs@^3.1.5: dependencies: jake "^10.6.1" -electron-to-chromium@^1.3.723: - version "1.3.760" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.760.tgz#cf19c9ae9ff23c0ac6bb289e3b71c09b7c3f8de1" - integrity sha512-XPKwjX6pHezJWB4FLVuSil9gGmU6XYl27ahUwEHODXF4KjCEB8RuIT05MkU1au2Tdye57o49yY0uCMK+bwUt+A== +electron-to-chromium@^1.4.17: + version "1.4.47" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.47.tgz#5d5535cdbca2b9264abee4d6ea121995e9554bbe" + integrity sha512-ZHc8i3/cgeCRK/vC7W2htAG6JqUmOUgDNn/f9yY9J8UjfLjwzwOVEt4MWmgJAdvmxyrsR5KIFA/6+kUHGY0eUA== emoji-regex@^7.0.1: version "7.0.3" @@ -4407,15 +3994,15 @@ engine.io@~6.0.0: engine.io-parser "~5.0.0" ws "~8.2.3" -enhanced-resolve@^5.8.0: - version "5.8.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" - integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== +enhanced-resolve@^5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5, enquirer@~2.3.6: +enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -4442,7 +4029,7 @@ err-code@^2.0.2: resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== -errno@^0.1.1, errno@^0.1.3: +errno@^0.1.1: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== @@ -4482,10 +4069,10 @@ es-abstract@^1.19.0, es-abstract@^1.19.1: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" -es-module-lexer@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d" - integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw== +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== es-to-primitive@^1.2.1: version "1.2.1" @@ -4501,130 +4088,124 @@ es6-error@^4.1.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= - dependencies: - es6-promise "^4.0.3" - -esbuild-android-arm64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.8.tgz#c20e875c3c98164b1ffba9b28637bdf96f5e9e7c" - integrity sha512-AilbChndywpk7CdKkNSZ9klxl+9MboLctXd9LwLo3b0dawmOF/i/t2U5d8LM6SbT1Xw36F8yngSUPrd8yPs2RA== - -esbuild-darwin-64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.13.8.tgz#f46e6b471ddbf62265234808a6a1aa91df18a417" - integrity sha512-b6sdiT84zV5LVaoF+UoMVGJzR/iE2vNUfUDfFQGrm4LBwM/PWXweKpuu6RD9mcyCq18cLxkP6w/LD/w9DtX3ng== - -esbuild-darwin-arm64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.8.tgz#a991157a6013facd4f2e14159b7da52626c90154" - integrity sha512-R8YuPiiJayuJJRUBG4H0VwkEKo6AvhJs2m7Tl0JaIer3u1FHHXwGhMxjJDmK+kXwTFPriSysPvcobXC/UrrZCQ== - -esbuild-freebsd-64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.8.tgz#301601d2e443ad458960e359b402a17d9500be9d" - integrity sha512-zBn6urrn8FnKC+YSgDxdof9jhPCeU8kR/qaamlV4gI8R3KUaUK162WYM7UyFVAlj9N0MyD3AtB+hltzu4cysTw== - -esbuild-freebsd-arm64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.8.tgz#039a63acc12ec0892006c147ea221e55f9125a9f" - integrity sha512-pWW2slN7lGlkx0MOEBoUGwRX5UgSCLq3dy2c8RIOpiHtA87xAUpDBvZK10MykbT+aMfXc0NI2lu1X+6kI34xng== - -esbuild-linux-32@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.8.tgz#c537b67d7e694b60bfa2786581412838c6ba0284" - integrity sha512-T0I0ueeKVO/Is0CAeSEOG9s2jeNNb8jrrMwG9QBIm3UU18MRB60ERgkS2uV3fZ1vP2F8i3Z2e3Zju4lg9dhVmw== - -esbuild-linux-64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.8.tgz#0092fc8a064001a777bfa0e3b425bb8be8f96e6a" - integrity sha512-Bm8SYmFtvfDCIu9sjKppFXzRXn2BVpuCinU1ChTuMtdKI/7aPpXIrkqBNOgPTOQO9AylJJc1Zw6EvtKORhn64w== - -esbuild-linux-arm64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.8.tgz#5cd3f2bb924212971482e8dbc25c4afd09b28110" - integrity sha512-X4pWZ+SL+FJ09chWFgRNO3F+YtvAQRcWh0uxKqZSWKiWodAB20flsW/OWFYLXBKiVCTeoGMvENZS/GeVac7+tQ== - -esbuild-linux-arm@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.8.tgz#ad634f96bf2975536907aeb9fdb75a3194f4ddce" - integrity sha512-4/HfcC40LJ4GPyboHA+db0jpFarTB628D1ifU+/5bunIgY+t6mHkJWyxWxAAE8wl/ZIuRYB9RJFdYpu1AXGPdg== - -esbuild-linux-mips64le@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.8.tgz#57857edfebf9bf65766dc8be1637f2179c990572" - integrity sha512-o7e0D+sqHKT31v+mwFircJFjwSKVd2nbkHEn4l9xQ1hLR+Bv8rnt3HqlblY3+sBdlrOTGSwz0ReROlKUMJyldA== - -esbuild-linux-ppc64le@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.8.tgz#fdb82a059a5b86bb10fb42091b4ebcf488b9cd46" - integrity sha512-eZSQ0ERsWkukJp2px/UWJHVNuy0lMoz/HZcRWAbB6reoaBw7S9vMzYNUnflfL3XA6WDs+dZn3ekHE4Y2uWLGig== - -esbuild-netbsd-64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.8.tgz#d7879e7123d3b2c04754ece8bd061aa6866deeff" - integrity sha512-gZX4kP7gVvOrvX0ZwgHmbuHczQUwqYppxqtoyC7VNd80t5nBHOFXVhWo2Ad/Lms0E8b+wwgI/WjZFTCpUHOg9Q== - -esbuild-openbsd-64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.8.tgz#88b280b6cb0a3f6adb60abf27fc506c506a35cf0" - integrity sha512-afzza308X4WmcebexbTzAgfEWt9MUkdTvwIa8xOu4CM2qGbl2LanqEl8/LUs8jh6Gqw6WsicEK52GPrS9wvkcw== - -esbuild-sunos-64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.8.tgz#229ae7c7703196a58acd0f0291ad9bebda815d63" - integrity sha512-mWPZibmBbuMKD+LDN23LGcOZ2EawMYBONMXXHmbuxeT0XxCNwadbCVwUQ/2p5Dp5Kvf6mhrlIffcnWOiCBpiVw== - -esbuild-wasm@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.13.8.tgz#f34134c187ffcfc22d476e925917f70bab40f8b0" - integrity sha512-UbD+3nloiSpJWXTCInZQrqPe8Y+RLfDkY/5kEHiXsw/lmaEvibe69qTzQu16m5R9je/0bF7VYQ5jaEOq0z9lLA== - -esbuild-windows-32@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.8.tgz#892d093e32a21c0c9135e5a0ffdc380aeb70e763" - integrity sha512-QsZ1HnWIcnIEApETZWw8HlOhDSWqdZX2SylU7IzGxOYyVcX7QI06ety/aDcn437mwyO7Ph4RrbhB+2ntM8kX8A== - -esbuild-windows-64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.8.tgz#7defd8d79ae3bb7e6f53b65a7190be7daf901686" - integrity sha512-76Fb57B9eE/JmJi1QmUW0tRLQZfGo0it+JeYoCDTSlbTn7LV44ecOHIMJSSgZADUtRMWT9z0Kz186bnaB3amSg== - -esbuild-windows-arm64@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.8.tgz#e59ae004496fd8a5ab67bfc7945a2e47480d6fb9" - integrity sha512-HW6Mtq5eTudllxY2YgT62MrVcn7oq2o8TAoAvDUhyiEmRmDY8tPwAhb1vxw5/cdkbukM3KdMYtksnUhF/ekWeg== - -esbuild@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.13.8.tgz#bd7cc51b881ab067789f88e17baca74724c1ec4f" - integrity sha512-A4af7G7YZLfG5OnARJRMtlpEsCkq/zHZQXewgPA864l9D6VjjbH1SuFYK/OSV6BtHwDGkdwyRrX0qQFLnMfUcw== +esbuild-android-arm64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.14.tgz#3705f32f209deeb11c275af47c298c8783dd5f0c" + integrity sha512-be/Uw6DdpQiPfula1J4bdmA+wtZ6T3BRCZsDMFB5X+k0Gp8TIh9UvmAcqvKNnbRAafSaXG3jPCeXxDKqnc8hFQ== + +esbuild-darwin-64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.14.tgz#c07e4eae6d938300a2d330ea82494c55bcea84e5" + integrity sha512-BEexYmjWafcISK8cT6O98E3TfcLuZL8DKuubry6G54n2+bD4GkoRD6HYUOnCkfl2p7jodA+s4369IjSFSWjtHg== + +esbuild-darwin-arm64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.14.tgz#a8631e13a51a6f784fb0906e2a64c6ab53988755" + integrity sha512-tnBKm41pDOB1GtZ8q/w26gZlLLRzVmP8fdsduYjvM+yFD7E2DLG4KbPAqFMWm4Md9B+DitBglP57FY7AznxbTg== + +esbuild-freebsd-64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.14.tgz#c280c2b944746b27ee6c6487c2691865c90bed2e" + integrity sha512-Q9Rx6sgArOHalQtNwAaIzJ6dnQ8A+I7f/RsQsdkS3JrdzmnlFo8JEVofTmwVQLoIop7OKUqIVOGP4PoQcwfVMA== + +esbuild-freebsd-arm64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.14.tgz#aa4e21276efcf20e5ab2487e91ca1d789573189b" + integrity sha512-TJvq0OpLM7BkTczlyPIphcvnwrQwQDG1HqxzoYePWn26SMUAlt6wrLnEvxdbXAvNvDLVzG83kA+JimjK7aRNBA== + +esbuild-linux-32@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.14.tgz#3db4d929239203ce38a9060d5419ac6a6d28846c" + integrity sha512-h/CrK9Baimt5VRbu8gqibWV7e1P9l+mkanQgyOgv0Ng3jHT1NVFC9e6rb1zbDdaJVmuhWX5xVliUA5bDDCcJeg== + +esbuild-linux-64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.14.tgz#f880026254c1f565a7a10fdebb7cff9b083a127d" + integrity sha512-IC+wAiIg/egp5OhQp4W44D9PcBOH1b621iRn1OXmlLzij9a/6BGr9NMIL4CRwz4j2kp3WNZu5sT473tYdynOuQ== + +esbuild-linux-arm64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.14.tgz#a34bc3076e50b109c3b8c8bad9c146e35942322b" + integrity sha512-6QVul3RI4M5/VxVIRF/I5F+7BaxzR3DfNGoqEVSCZqUbgzHExPn+LXr5ly1C7af2Kw4AHpo+wDqx8A4ziP9avw== + +esbuild-linux-arm@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.14.tgz#231ffd12fef69ee06365d4c94b69850e4830e927" + integrity sha512-gxpOaHOPwp7zSmcKYsHrtxabScMqaTzfSQioAMUaB047YiMuDBzqVcKBG8OuESrYkGrL9DDljXr/mQNg7pbdaQ== + +esbuild-linux-mips64le@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.14.tgz#bd00570e3a30422224b732c7a5f262146c357403" + integrity sha512-4Jl5/+xoINKbA4cesH3f4R+q0vltAztZ6Jm8YycS8lNhN1pgZJBDxWfI6HUMIAdkKlIpR1PIkA9aXQgZ8sxFAg== + +esbuild-linux-ppc64le@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.14.tgz#430609413fd9e04d9def4e3f06726b031b23d825" + integrity sha512-BitW37GxeebKxqYNl4SVuSdnIJAzH830Lr6Mkq3pBHXtzQay0vK+IeOR/Ele1GtNVJ+/f8wYM53tcThkv5SC5w== + +esbuild-linux-s390x@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.14.tgz#2f0d8cbfe53cf3cb97f6372549a41a8051dbd689" + integrity sha512-vLj6p76HOZG3wfuTr5MyO3qW5iu8YdhUNxuY+tx846rPo7GcKtYSPMusQjeVEfZlJpSYoR+yrNBBxq+qVF9zrw== + +esbuild-netbsd-64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.14.tgz#3e44de35e1add7e9582f3c0d2558d86aafbc813b" + integrity sha512-fn8looXPQhpVqUyCBWUuPjesH+yGIyfbIQrLKG05rr1Kgm3rZD/gaYrd3Wpmf5syVZx70pKZPvdHp8OTA+y7cQ== + +esbuild-openbsd-64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.14.tgz#04710ef1d01cd9f15d54f50d20b5a3778f8306a2" + integrity sha512-HdAnJ399pPff3SKbd8g+P4o5znseni5u5n5rJ6Z7ouqOdgbOwHe2ofZbMow17WMdNtz1IyOZk2Wo9Ve6/lZ4Rg== + +esbuild-sunos-64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.14.tgz#8e583dd92c5c7ac4303ddc37f588e44211e04e19" + integrity sha512-bmDHa99ulsGnYlh/xjBEfxoGuC8CEG5OWvlgD+pF7bKKiVTbtxqVCvOGEZeoDXB+ja6AvHIbPxrEE32J+m5nqQ== + +esbuild-wasm@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.14.14.tgz#d4c8d5fc405939a2234a31abf00967dfd1da1caa" + integrity sha512-qTjK4MWnYtQHCMGg2qDUqeFYXfVvYq5qJkQTIsOV4VZCknoYePVaDTG9ygEB9Ct0kc0DWs7IrS6Ja+GjY62Kzw== + +esbuild-windows-32@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.14.tgz#6d293ddfb71229f21cc13d85d5d2f43e8131693b" + integrity sha512-6tVooQcxJCNenPp5GHZBs/RLu31q4B+BuF4MEoRxswT+Eq2JGF0ZWDRQwNKB8QVIo3t6Svc5wNGez+CwKNQjBg== + +esbuild-windows-64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.14.tgz#08a36844b69542f8ec1cb33a5ddcea02b9d0b2e8" + integrity sha512-kl3BdPXh0/RD/dad41dtzj2itMUR4C6nQbXQCyYHHo4zoUoeIXhpCrSl7BAW1nv5EFL8stT1V+TQVXGZca5A2A== + +esbuild-windows-arm64@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.14.tgz#ca747ce4066d5b8a79dbe48fe6ecd92d202e5366" + integrity sha512-dCm1wTOm6HIisLanmybvRKvaXZZo4yEVrHh1dY0v582GThXJOzuXGja1HIQgV09RpSHYRL3m4KoUBL00l6SWEg== + +esbuild@0.14.14: + version "0.14.14" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.14.tgz#3b99f20d628013c3e2ae90e67687e03f1d6eb071" + integrity sha512-aiK4ddv+uui0k52OqSHu4xxu+SzOim7Rlz4i25pMEiC8rlnGU0HJ9r+ZMfdWL5bzifg+nhnn7x4NSWTeehYblg== optionalDependencies: - esbuild-android-arm64 "0.13.8" - esbuild-darwin-64 "0.13.8" - esbuild-darwin-arm64 "0.13.8" - esbuild-freebsd-64 "0.13.8" - esbuild-freebsd-arm64 "0.13.8" - esbuild-linux-32 "0.13.8" - esbuild-linux-64 "0.13.8" - esbuild-linux-arm "0.13.8" - esbuild-linux-arm64 "0.13.8" - esbuild-linux-mips64le "0.13.8" - esbuild-linux-ppc64le "0.13.8" - esbuild-netbsd-64 "0.13.8" - esbuild-openbsd-64 "0.13.8" - esbuild-sunos-64 "0.13.8" - esbuild-windows-32 "0.13.8" - esbuild-windows-64 "0.13.8" - esbuild-windows-arm64 "0.13.8" + esbuild-android-arm64 "0.14.14" + esbuild-darwin-64 "0.14.14" + esbuild-darwin-arm64 "0.14.14" + esbuild-freebsd-64 "0.14.14" + esbuild-freebsd-arm64 "0.14.14" + esbuild-linux-32 "0.14.14" + esbuild-linux-64 "0.14.14" + esbuild-linux-arm "0.14.14" + esbuild-linux-arm64 "0.14.14" + esbuild-linux-mips64le "0.14.14" + esbuild-linux-ppc64le "0.14.14" + esbuild-linux-s390x "0.14.14" + esbuild-netbsd-64 "0.14.14" + esbuild-openbsd-64 "0.14.14" + esbuild-sunos-64 "0.14.14" + esbuild-windows-32 "0.14.14" + esbuild-windows-64 "0.14.14" + esbuild-windows-arm64 "0.14.14" escalade@^3.1.1: version "3.1.1" @@ -4651,6 +4232,28 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-airbnb-base@15.0.0, eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== + dependencies: + confusing-browser-globals "^1.0.10" + object.assign "^4.1.2" + object.entries "^1.1.5" + semver "^6.3.0" + +eslint-config-airbnb-typescript@^16.1.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-16.1.0.tgz#f75a6b4f3bb679eef34c3c930359c2ca9bc3f09c" + integrity sha512-W5Cq20KpEx5ZLC54bnVrC37zq2+WD956Kp/Ma3nYFRjT1v9KM63v+DPkrrmmrVqrlDKaD0ivm/qeYmyHV6qKlw== + dependencies: + eslint-config-airbnb-base "^15.0.0" + +eslint-config-prettier@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + eslint-import-resolver-node@^0.3.6: version "0.3.6" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" @@ -4667,6 +4270,15 @@ eslint-module-utils@^2.7.2: debug "^3.2.7" find-up "^2.1.0" +eslint-plugin-deprecation@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-1.3.2.tgz#a8125d28c56158cdfa1a685197e6be8ed86f189e" + integrity sha512-z93wbx9w7H/E3ogPw6AZMkkNJ6m51fTZRNZPNQqxQLmx+KKt7aLkMU9wN67s71i+VVHN4tLOZ3zT3QLbnlC0Mg== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + tslib "^2.3.1" + tsutils "^3.21.0" + eslint-plugin-import@2.25.4: version "2.25.4" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz#322f3f916a4e9e991ac7af32032c25ce313209f1" @@ -4686,12 +4298,12 @@ eslint-plugin-import@2.25.4: resolve "^1.20.0" tsconfig-paths "^3.12.0" -eslint-plugin-jsdoc@37.6.1: - version "37.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.6.1.tgz#3d2a18d2535618d3f9d26c3c7eccfb15b6db20d4" - integrity sha512-Y9UhH9BQD40A9P1NOxj59KrSLZb9qzsqYkLCZv30bNeJ7C9eaumTWhh9beiGqvK7m821Hj1dTsZ5LOaFIUTeTg== +eslint-plugin-jsdoc@37.7.0: + version "37.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.7.0.tgz#975d9f18cb0520dde7a2b0db5f4421dfee3fdd17" + integrity sha512-vzy3/ltXoGtabRnjLogaEmhGxxIv5B8HK5MJLIrdxFJUvhBppZjuVuLr71DjIBi0jg6bFomwkYKjojt29cN8PA== dependencies: - "@es-joy/jsdoccomment" "~0.17.0" + "@es-joy/jsdoccomment" "~0.18.0" comment-parser "1.3.0" debug "^4.3.3" escape-string-regexp "^4.0.0" @@ -4705,7 +4317,14 @@ eslint-plugin-prefer-arrow@1.2.3: resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz#e7fbb3fa4cd84ff1015b9c51ad86550e55041041" integrity sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ== -eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.0, eslint-scope@^5.1.1: +eslint-plugin-prettier@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@5.1.1, eslint-scope@^5.1.0, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -4713,12 +4332,13 @@ eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.0, eslint-scope@^5.1. esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153" + integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" eslint-utils@^3.0.0: version "3.0.0" @@ -4727,91 +4347,72 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - eslint-visitor-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz#eee4acea891814cda67a7d8812d9647dd0179af2" - integrity sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1" + integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ== -eslint@^7.32.0, eslint@^7.9.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== +eslint@^8.8.0: + version "8.8.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.8.0.tgz#9762b49abad0cb4952539ffdb0a046392e571a2d" + integrity sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" + "@eslint/eslintrc" "^1.0.5" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^7.1.0" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.2.0" + espree "^9.3.0" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" + glob-parent "^6.0.1" globals "^13.6.0" - ignore "^4.0.6" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" 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" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.2.0, espree@^9.3.0: + version "9.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8" + integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ== dependencies: - acorn "^7.4.0" + acorn "^8.7.0" acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + eslint-visitor-keys "^3.1.0" esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.4.0: +esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== @@ -4860,13 +4461,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource@^1.0.7: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== - dependencies: - original "^1.0.0" - exec-buffer@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b" @@ -4904,6 +4498,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + 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" + executable@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" @@ -4911,24 +4520,6 @@ executable@^4.1.0: dependencies: pify "^2.2.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" @@ -4985,22 +4576,7 @@ ext-name@^5.0.0: ext-list "^2.0.0" sort-keys-length "^1.0.0" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -5014,36 +4590,17 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.1.1, fast-glob@^3.2.5: +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.6.tgz#434dd9529845176ea049acc9343e8282765c6e1a" integrity sha512-GnLuqj/pvQ7pX8/L4J84nijv6sAnlwvSDpMkJi9i7nPmPxGtRPkBSStfvDW5l6nMdX9VWe+pkKWFTgD+vF2QSQ== @@ -5065,6 +4622,17 @@ fast-glob@^3.2.7: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + 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" + fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -5152,11 +4720,6 @@ file-type@^8.1.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c" integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ== -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - filelist@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" @@ -5178,16 +4741,6 @@ filenamify@^2.0.0: strip-outer "^1.0.0" trim-repeated "^1.0.0" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -5208,7 +4761,7 @@ finalhandler@1.1.2, finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@3.3.1, find-cache-dir@^3.3.1: +find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -5232,13 +4785,6 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -5267,56 +4813,25 @@ flat@5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - -flatted@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" - integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== - -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +flatted@^3.1.0, flatted@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== follow-redirects@^1.0.0: version "1.14.7" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" +fraction.js@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.1.2.tgz#13e420a92422b6cf244dff8690ed89401029fbe8" + integrity sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA== fresh@0.5.2: version "0.5.2" @@ -5336,7 +4851,7 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@10.0.0: +fs-extra@10.0.0, fs-extra@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== @@ -5345,15 +4860,6 @@ fs-extra@10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" @@ -5381,14 +4887,6 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -5452,6 +4950,11 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.1" +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + get-proxy@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93" @@ -5491,6 +4994,11 @@ get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -5499,31 +5007,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - github-from-package@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -5531,22 +5019,22 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.0.tgz#f851b59b388e788f3a44d63fab50382b2859c33c" - integrity sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww== +glob-parent@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - is-glob "^4.0.1" + is-glob "^4.0.3" glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@7.1.7, glob@^7.0.3, glob@^7.0.6, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@7.2.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5593,7 +5081,19 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" -globby@^11.0.3, globby@^11.0.4: +globby@^11.0.1: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + 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" + +globby@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== @@ -5617,28 +5117,17 @@ globby@^12.0.0: merge2 "^1.4.1" slash "^4.0.0" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= +globby@^12.0.2: + version "12.2.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-12.2.0.tgz#2ab8046b4fba4ff6eede835b29f678f90e3d3c22" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" + array-union "^3.0.1" + dir-glob "^3.0.1" + fast-glob "^3.2.7" + ignore "^5.1.9" + merge2 "^1.4.1" + slash "^4.0.0" got@11.8.2: version "11.8.2" @@ -5717,10 +5206,10 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.8, graceful-fs@^4.2.9: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== gzip-size@^6.0.0: version "6.0.0" @@ -5734,19 +5223,6 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -5789,45 +5265,14 @@ has-to-string-tag-x@^1.2.0: has-tostringtag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@^2.0.0, has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + has-symbols "^1.0.2" + +has-unicode@^2.0.0, has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-yarn@^2.1.0: version "2.1.0" @@ -5877,10 +5322,10 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-entities@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== html-escaper@^2.0.0: version "2.0.2" @@ -5948,17 +5393,27 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz#7ef3417a479fb7666a571e09966c66a39bd2c15f" + integrity sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg== + dependencies: + "@types/http-proxy" "^1.17.5" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" -http-proxy@^1.17.0, http-proxy@^1.18.1: +http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -5967,15 +5422,6 @@ http-proxy@^1.17.0, http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -5992,13 +5438,10 @@ https-proxy-agent@5.0.0, https-proxy-agent@^5.0.0: agent-base "6" debug "4" -https-proxy-agent@^2.2.1: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== - dependencies: - agent-base "^4.3.0" - debug "^3.1.0" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== humanize-ms@^1.2.1: version "1.2.1" @@ -6014,7 +5457,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.2: +iconv-lite@^0.6.2, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -6038,7 +5481,7 @@ ignore-walk@^4.0.1: dependencies: minimatch "^3.0.4" -ignore@5.1.9, ignore@^5.0.4, ignore@^5.1.4, ignore@^5.1.8: +ignore@5.1.9: version "5.1.9" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== @@ -6048,6 +5491,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.0.4, ignore@^5.1.4, ignore@^5.1.8, ignore@^5.1.9, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -6084,10 +5532,10 @@ imagemin@8.0.1: replace-ext "^2.0.0" slash "^3.0.0" -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -6107,14 +5555,6 @@ import-lazy@^3.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-3.1.0.tgz#891279202c8a2280fdbd6674dbd8da1a1dfc67cc" integrity sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ== -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -6132,11 +5572,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -6190,13 +5625,25 @@ inquirer@8.1.2: strip-ansi "^6.0.0" through "^2.3.6" -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== +inquirer@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a" + integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ== dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.2.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" internal-slot@^1.0.3: version "1.0.3" @@ -6215,39 +5662,20 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: +ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== is-arguments@^1.0.4: version "1.1.0" @@ -6271,13 +5699,6 @@ is-bigint@^1.0.1: resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -6292,11 +5713,6 @@ is-boolean-object@^1.1.0: dependencies: call-bind "^1.0.2" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.4: version "1.2.3" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" @@ -6314,68 +5730,24 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== +is-core-module@^2.8.0, is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= @@ -6402,13 +5774,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -6454,13 +5819,6 @@ is-number-object@^1.0.4: resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -6476,44 +5834,11 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-cwd@^2.0.0: +is-path-cwd@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== - dependencies: - is-path-inside "^1.0.0" - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -6524,7 +5849,12 @@ is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= -is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -6557,11 +5887,6 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-resolvable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" @@ -6577,6 +5902,11 @@ is-stream@^1.0.0, is-stream@^1.1.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" @@ -6596,7 +5926,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -6623,16 +5953,6 @@ is-what@^3.12.0: resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -6645,7 +5965,7 @@ is-yarn-global@^0.3.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -6660,23 +5980,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -6692,6 +6000,17 @@ istanbul-lib-instrument@^4.0.3: istanbul-lib-coverage "^3.0.0" semver "^6.3.0" +istanbul-lib-instrument@^5.0.4: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -6741,11 +6060,6 @@ jasmine-core@^3.6.0: resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.10.1.tgz#7aa6fa2b834a522315c651a128d940eca553989a" integrity sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA== -jasmine-core@~2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" - integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= - jasmine-core@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.0.0.tgz#8299ed38a100c47a1d154af63449a40967a7be5c" @@ -6758,20 +6072,6 @@ jasmine-spec-reporter@~7.0.0: dependencies: colors "1.4.0" -jasmine@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" - integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= - dependencies: - exit "^0.1.2" - glob "^7.0.6" - jasmine-core "~2.8.0" - -jasminewd2@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" - integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= - jest-worker@^27.0.2: version "27.0.6" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.6.tgz#a5fdb1e14ad34eb228cfe162d9f729cdbfa28aed" @@ -6794,15 +6094,17 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" -jsdoc-type-pratt-parser@~2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.1.tgz#08c6d1740a9e468ac6993985ae1d0d6981c50537" - integrity sha512-rkbaDZw3IPwd/ZPXob4XqQwVDKN/qeC2Dd7jL8EEGLEHLRmkPJgGAPw6OIIVmnwJrdcDh3vMR83/fc7lR5YpqA== +jsdoc-type-pratt-parser@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.2.tgz#a85e407ac502b444dc23333aa4d6d0dc83f76187" + integrity sha512-zRokSWcPLSWkoNzsWn9pq7YYSwDhKyEe+cJYT2qaPqLOOJb5sFSi46BPj81vP+e8chvCNdQL9RG86Bi9EI6MDw== jsesc@^2.5.1: version "2.5.2" @@ -6844,26 +6146,16 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -6883,13 +6175,6 @@ jsonc-parser@3.0.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -6904,26 +6189,6 @@ jsonparse@^1.3.1: resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jszip@^3.1.3: - version "3.7.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.7.1.tgz#bd63401221c15625a1228c556ca8a68da6fda3d9" - 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" - junk@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" @@ -6967,10 +6232,10 @@ karma-source-map-support@1.4.0: dependencies: source-map-support "^0.5.5" -karma@~6.3.11: - version "6.3.11" - resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.11.tgz#2c2fb09f1a9f52e1a0739adeedace2a68d4c0d34" - integrity sha512-QGUh4yXgizzDNPLB5nWTvP+wysKexngbyLVWFOyikB661hpa2RZLf5anZQzqliWtAQuYVep0ot0D1U7UQKpsxQ== +karma@~6.3.13: + version "6.3.13" + resolved "https://registry.yarnpkg.com/karma/-/karma-6.3.13.tgz#ff58622c4f913508dbf86506a5fc614be0e98137" + integrity sha512-64lbtHBnM/sG7XKvitSQVlImKYNugyjw4K2e8cZYrlZm0GwoWrfsrkzgS/KWY/r3+fVM/2xvT/JN6MyfdttxLw== dependencies: body-parser "^1.19.0" braces "^3.0.2" @@ -6984,7 +6249,7 @@ karma@~6.3.11: http-proxy "^1.18.1" isbinaryfile "^4.0.8" lodash "^4.17.21" - log4js "^6.3.0" + log4js "^6.4.1" mime "^2.5.2" minimatch "^3.0.4" qjobs "^1.2.0" @@ -7017,31 +6282,7 @@ keyv@^4.0.0: dependencies: json-buffer "3.0.1" -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -7051,6 +6292,11 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0" integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA== +klona@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" + integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + latest-version@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" @@ -7058,21 +6304,21 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" -less-loader@10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.0.1.tgz#c05aaba68d00400820275f21c2ad87cb9fa9923f" - integrity sha512-Crln//HpW9M5CbtdfWm3IO66Cvx1WhZQvNybXgfB2dD/6Sav9ppw+IWqs/FQKPBFO4B6X0X28Z0WNznshgwUzA== +less-loader@10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32" + integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg== dependencies: klona "^2.0.4" -less@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.1.tgz#15bf253a9939791dc690888c3ff424f3e6c7edba" - integrity sha512-w09o8tZFPThBscl5d0Ggp3RcrKIouBoQscnOMgFH3n5V3kN/CXGHNfCkRPtxJk6nKryDXaV9aHLK55RXuH4sAw== +less@4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0" + integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" - tslib "^1.10.0" + tslib "^2.3.0" optionalDependencies: errno "^0.1.1" graceful-fs "^4.1.2" @@ -7090,25 +6336,12 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -license-webpack-plugin@2.3.20: - version "2.3.20" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz#f51fb674ca31519dbedbe1c7aabc036e5a7f2858" - integrity sha512-AHVueg9clOKACSHkhmEI+PCC9x8+qsQVuKECZD3ETxETK5h/PCv5/MUzyG1gm8OMcip/s1tcNxqo9Qb7WhjGsg== - dependencies: - "@types/webpack-sources" "^0.1.5" - webpack-sources "^1.2.0" - -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== +license-webpack-plugin@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-4.0.0.tgz#11cf6ac96559f4a987cf55d3d2a33f295ae8f13b" + integrity sha512-b9iMrROrw2fTOJBZ57h0xJfT5/1Cxg4ucYbtpWoukv4Awb2TFPfDDFVHNM8w6SYQpVfB13a5tQJxgGamqwrsyw== dependencies: - immediate "~3.0.5" - -lilconfig@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.3.tgz#68f3005e921dafbd2a2afb48379986aa6d2579fd" - integrity sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg== + webpack-sources "^3.0.0" lines-and-columns@^1.1.6: version "1.1.6" @@ -7131,14 +6364,10 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== -loader-utils@2.0.0, loader-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" +loader-utils@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== loader-utils@^1.4.0: version "1.4.0" @@ -7149,6 +6378,15 @@ loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -7157,14 +6395,6 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -7172,11 +6402,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -7187,27 +6412,12 @@ lodash.kebabcase@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha1-hImxyw0p/4gZXM7KRI/21swpXDY= -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.merge@^4.6.0, lodash.merge@^4.6.2: +lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7220,16 +6430,16 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log4js@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" - integrity sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw== +log4js@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.4.1.tgz#9d3a8bf2c31c1e213fe3fc398a6053f7a2bc53e8" + integrity sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg== dependencies: - date-format "^3.0.0" - debug "^4.1.1" - flatted "^2.0.1" - rfdc "^1.1.4" - streamroller "^2.2.4" + date-format "^4.0.3" + debug "^4.3.3" + flatted "^3.2.4" + rfdc "^1.3.0" + streamroller "^3.0.2" logalot@^2.0.0, logalot@^2.1.0: version "2.1.0" @@ -7239,19 +6449,6 @@ logalot@^2.0.0, logalot@^2.1.0: figures "^1.3.5" squeak "^1.0.0" -loglevel-colored-level-prefix@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" - integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4= - dependencies: - chalk "^1.1.3" - loglevel "^1.4.1" - -loglevel@^1.4.1, loglevel@^1.6.8: - version "1.7.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" - integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== - longest@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -7339,15 +6536,15 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -make-fetch-happen@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.0.3.tgz#57bbfb5b859807cd28005ca85aa6a72568675e24" - integrity sha512-uZ/9Cf2vKqsSWZyXhZ9wHHyckBrkntgbnqV68Bfe8zZenlf7D6yuGMXvHZQ+jSnzPkjosuNP1HGasj1J4h8OlQ== +make-fetch-happen@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.0.0.tgz#a2dc77ec1ebf082927f4dc6eaa70227f72e5a250" + integrity sha512-CREcDkbKZZ64g5MN1FT+u58mDHX9FQFFtFyio5HonX44BdQdytqPZBXUz+6ibi2w/6ncji59f2phyXGSMGpgzA== dependencies: agentkeepalive "^4.1.3" cacache "^15.2.0" http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" + http-proxy-agent "^5.0.0" https-proxy-agent "^5.0.0" is-lambda "^1.0.1" lru-cache "^6.0.0" @@ -7356,9 +6553,9 @@ make-fetch-happen@^9.0.1: minipass-fetch "^1.3.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - negotiator "^0.6.2" + negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^5.0.0" + socks-proxy-agent "^6.0.0" ssri "^8.0.0" make-fetch-happen@^9.1.0: @@ -7383,30 +6580,11 @@ make-fetch-happen@^9.1.0: socks-proxy-agent "^6.0.0" ssri "^8.0.0" -map-age-cleaner@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - matcher@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" @@ -7414,24 +6592,11 @@ matcher@^3.0.0: dependencies: escape-string-regexp "^4.0.0" -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -mem@^8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/mem/-/mem-8.1.1.tgz#cf118b357c65ab7b7e0817bdf00c8062297c0122" - integrity sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA== - dependencies: - map-age-cleaner "^0.1.3" - mimic-fn "^3.1.0" - memfs@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.2.tgz#5de461389d596e3f23d48bb7c2afb6161f4df40e" @@ -7439,14 +6604,6 @@ memfs@^3.2.2: dependencies: fs-monkey "1.0.3" -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - meow@^3.3.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -7468,13 +6625,6 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -7490,26 +6640,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.4: +micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== @@ -7522,7 +6653,7 @@ mime-db@1.48.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24: version "2.1.31" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== @@ -7534,7 +6665,7 @@ mime@1.6.0, mime@^1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.3.1, mime@^2.4.4, mime@^2.5.2: +mime@^2.3.1, mime@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== @@ -7544,11 +6675,6 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-fn@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74" - integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ== - mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -7564,12 +6690,12 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -mini-css-extract-plugin@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz#b3508191ea479388a4715018c99dd3e6dd40d2d2" - integrity sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA== +mini-css-extract-plugin@2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz#c5c79f9b22ce9b4f164e9492267358dbe35376d9" + integrity sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw== dependencies: - schema-utils "^3.1.0" + schema-utils "^4.0.0" minimalistic-assert@^1.0.0: version "1.0.1" @@ -7650,27 +6776,19 @@ minizlib@^2.0.0, minizlib@^2.1.1: minipass "^3.0.0" yallist "^4.0.0" -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.1, mkdirp@^0.5.5: +mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: minimist "^1.2.5" -mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -7713,37 +6831,10 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== - -nanoid@^3.1.23: - version "3.1.23" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" - integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== - nanoid@^3.1.30: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" + version "3.2.0" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.2.0.tgz#62667522da6673971cca916a6d3eff3f415ff80c" + integrity sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA== napi-build-utils@^1.0.1: version "1.0.2" @@ -7769,6 +6860,11 @@ negotiator@0.6.2, negotiator@^0.6.2: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" @@ -7799,10 +6895,10 @@ node-addon-api@^3.0.0, node-addon-api@^3.2.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-forge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" + integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== node-gyp-build@^4.2.2: version "4.2.3" @@ -7825,10 +6921,10 @@ node-gyp@^8.2.0: tar "^6.1.2" which "^2.0.2" -node-releases@^1.1.71: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== nopt@^5.0.0: version "5.0.0" @@ -7847,13 +6943,6 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -7939,12 +7028,12 @@ npm-pick-manifest@6.1.1, npm-pick-manifest@^6.0.0, npm-pick-manifest@^6.1.1: npm-package-arg "^8.1.2" semver "^7.3.4" -npm-registry-fetch@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz#68c1bb810c46542760d62a6a965f85a702d43a76" - integrity sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA== +npm-registry-fetch@^12.0.0: + version "12.0.1" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-12.0.1.tgz#211eff2483b1e71706c9a7ce891182ab3ea9168b" + integrity sha512-ricy4ezH3Uv0d4am6RSwHjCYTWJI74NJjurIigWMAG7Vs3PFyd0TUlkrez5L0AgaPzDLRsEzqb5cOZ/Ue01bmA== dependencies: - make-fetch-happen "^9.0.1" + make-fetch-happen "^10.0.0" minipass "^3.1.3" minipass-fetch "^1.3.0" minipass-json-stream "^1.0.1" @@ -7958,6 +7047,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + npmlog@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -7978,18 +7074,13 @@ npmlog@^6.0.0: gauge "^4.0.0" set-blocking "^2.0.0" -nth-check@^2.0.0: +nth-check@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== dependencies: boolbase "^1.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -8009,24 +7100,10 @@ nx@13.2.1: dependencies: "@nrwl/cli" "*" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" @@ -8046,13 +7123,6 @@ object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" @@ -8063,12 +7133,14 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: - isobject "^3.0.1" + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.1" object.values@^1.1.5: version "1.1.5" @@ -8103,17 +7175,17 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -open@8.2.1: - version "8.2.1" - resolved "https://registry.yarnpkg.com/open/-/open-8.2.1.tgz#82de42da0ccbf429bc12d099dad2e0975e14e8af" - integrity sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ== +open@8.4.0, open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -8124,13 +7196,6 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -8167,13 +7232,6 @@ ora@5.4.1, ora@^5.3.0, ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - os-filter-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16" @@ -8181,7 +7239,7 @@ os-filter-obj@^2.0.0: dependencies: arch "^2.1.0" -os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -8206,11 +7264,6 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - p-event@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085" @@ -8242,14 +7295,14 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -8263,13 +7316,6 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -8284,11 +7330,6 @@ p-map-series@^1.0.0: dependencies: p-reduce "^1.0.0" -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -8306,12 +7347,13 @@ p-reduce@^1.0.0: resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo= -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== dependencies: - retry "^0.12.0" + "@types/retry" "^0.12.0" + retry "^0.13.1" p-timeout@^1.1.1: version "1.2.1" @@ -8347,10 +7389,10 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" -pacote@12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-12.0.2.tgz#14ae30a81fe62ec4fc18c071150e6763e932527c" - integrity sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg== +pacote@12.0.3: + version "12.0.3" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-12.0.3.tgz#b6f25868deb810e7e0ddf001be88da2bcaca57c7" + integrity sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow== dependencies: "@npmcli/git" "^2.1.0" "@npmcli/installed-package-contents" "^1.0.6" @@ -8365,14 +7407,14 @@ pacote@12.0.2: npm-package-arg "^8.0.1" npm-packlist "^3.0.0" npm-pick-manifest "^6.0.0" - npm-registry-fetch "^11.0.0" + npm-registry-fetch "^12.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" -pako@^1.0.3, pako@~1.0.2: +pako@^1.0.3: version "1.0.11" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== @@ -8443,16 +7485,6 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -8475,22 +7507,17 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -8524,11 +7551,6 @@ pend@~1.2.0: resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -8566,10 +7588,10 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -piscina@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.1.0.tgz#2333636865b6cb69c5a370bbc499a98cabcf3e04" - integrity sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg== +piscina@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.2.0.tgz#f5a1dde0c05567775690cccefe59d9223924d154" + integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== dependencies: eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" @@ -8577,13 +7599,6 @@ piscina@3.1.0: optionalDependencies: nice-napi "^1.0.2" -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -8596,7 +7611,7 @@ png2icons@2.0.1: resolved "https://registry.yarnpkg.com/png2icons/-/png2icons-2.0.1.tgz#09d8f10b71302e98ca178d3324bc4deff9b90124" integrity sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA== -portfinder@^1.0.26: +portfinder@^1.0.28: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== @@ -8605,188 +7620,104 @@ portfinder@^1.0.26: debug "^3.1.1" mkdirp "^0.5.5" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== +postcss-attribute-case-insensitive@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz#39cbf6babf3ded1e4abf37d09d6eda21c644105c" + integrity sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ== dependencies: - postcss "^7.0.2" postcss-selector-parser "^6.0.2" -postcss-calc@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.0.0.tgz#a05b87aacd132740a5db09462a3612453e5df90a" - integrity sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g== +postcss-color-functional-notation@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz#a25e9e1855e14d04319222a689f120b3240d39e0" + integrity sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw== dependencies: - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" + postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== +postcss-color-hex-alpha@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz#7a248b006dd47bd83063f662352d31fd982f74ec" + integrity sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== +postcss-color-rebeccapurple@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz#5d397039424a58a9ca628762eb0b88a61a66e079" + integrity sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== - dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" +postcss-custom-media@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" + integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== +postcss-custom-properties@^12.1.2: + version "12.1.3" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz#8e37651c7188e72e6762eeae8db39755e84d3a64" + integrity sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== +postcss-custom-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz#022839e41fbf71c47ae6e316cb0e6213012df5ef" + integrity sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-selector-parser "^6.0.4" -postcss-colormin@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.2.0.tgz#2b620b88c0ff19683f3349f4cf9e24ebdafb2c88" - integrity sha512-+HC6GfWU3upe5/mqmxuqYZ9B2Wl4lcoUUNkoaX59nEWV4EtADCMiBqui111Bu8R8IvaZTmqmxrqOAqjbHIwXPw== +postcss-dir-pseudo-class@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz#febfe305e75267913a53bf5094c7679f5cfa9b55" + integrity sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw== dependencies: - browserslist "^4.16.6" - caniuse-api "^3.0.0" - colord "^2.0.1" - postcss-value-parser "^4.1.0" + postcss-selector-parser "^6.0.8" -postcss-convert-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.0.1.tgz#4ec19d6016534e30e3102fdf414e753398645232" - integrity sha512-C3zR1Do2BkKkCgC0g3sF8TS0koF2G+mN8xxayZx3f10cIRmTaAnpgpRQZjNekTZxM2ciSPoh2IWJm0VZx8NoQg== +postcss-double-position-gradients@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz#2484b9785ef3ba81b0f03a279c52ec58fc5344c2" + integrity sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog== dependencies: - postcss-value-parser "^4.1.0" + postcss-value-parser "^4.2.0" -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== +postcss-env-function@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.4.tgz#4e85359ca4fcdde4ec4b73752a41de818dbe91cc" + integrity sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ== dependencies: - postcss "^7.0.14" + postcss-value-parser "^4.2.0" -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== +postcss-focus-visible@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz#14635b71a6b9140f488f11f26cbc9965a13f6843" + integrity sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA== dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" + postcss-selector-parser "^6.0.8" -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== +postcss-focus-within@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz#0b0bf425f14a646bbfd973b463e2d20d85a3a841" + integrity sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + postcss-selector-parser "^6.0.8" -postcss-dir-pseudo-class@^5.0.0: +postcss-font-variant@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" - -postcss-discard-comments@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz#9eae4b747cf760d31f2447c27f0619d5718901fe" - integrity sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg== - -postcss-discard-duplicates@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz#68f7cc6458fe6bab2e46c9f55ae52869f680e66d" - integrity sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA== - -postcss-discard-empty@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz#ee136c39e27d5d2ed4da0ee5ed02bc8a9f8bf6d8" - integrity sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw== - -postcss-discard-overridden@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz#454b41f707300b98109a75005ca4ab0ff2743ac6" - integrity sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q== - -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== - dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" - -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== - dependencies: - postcss "^7.0.2" - -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== -postcss-font-variant@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" - integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== - dependencies: - postcss "^7.0.2" - -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== - dependencies: - postcss "^7.0.2" +postcss-gap-properties@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz#562fbf43a6a721565b3ca0e01008690991d2f726" + integrity sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw== -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== +postcss-image-set-function@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz#ce91579ab2c1386d412ff5cd5e733c474b1f75ee" + integrity sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" postcss-import@14.0.2: version "14.0.2" @@ -8797,99 +7728,36 @@ postcss-import@14.0.2: read-cache "^1.0.0" resolve "^1.1.7" -postcss-initial@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" - integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== - dependencies: - postcss "^7.0.2" +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== +postcss-lab-function@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz#633745b324afbcd5881da85fe2cef58b17487536" + integrity sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-loader@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.1.1.tgz#58dd0a3accd9bc87cc52eff75244db578d11301a" - integrity sha512-lBmJMvRh1D40dqpWKr9Rpygwxn8M74U9uaCSeYGNKLGInbk9mXBt1ultHf2dH9Ghk6Ue4UXlXWwGMH9QdUJ5ug== +postcss-loader@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== dependencies: cosmiconfig "^7.0.0" - klona "^2.0.4" + klona "^2.0.5" semver "^7.3.5" -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" - -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" - -postcss-merge-longhand@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz#277ada51d9a7958e8ef8cf263103c9384b322a41" - integrity sha512-BMlg9AXSI5G9TBT0Lo/H3PfUy63P84rVz3BjCFE9e9Y9RXQZD3+h3YO1kgTNsNJy7bBc1YQp8DmSnwLIW5VPcw== - dependencies: - css-color-names "^1.0.1" - postcss-value-parser "^4.1.0" - stylehacks "^5.0.1" - -postcss-merge-rules@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz#d6e4d65018badbdb7dcc789c4f39b941305d410a" - integrity sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg== - dependencies: - browserslist "^4.16.6" - caniuse-api "^3.0.0" - cssnano-utils "^2.0.1" - postcss-selector-parser "^6.0.5" - vendors "^1.0.3" - -postcss-minify-font-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz#a90cefbfdaa075bd3dbaa1b33588bb4dc268addf" - integrity sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-minify-gradients@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.0.2.tgz#7c175c108f06a5629925d698b3c4cf7bd3864ee5" - integrity sha512-7Do9JP+wqSD6Prittitt2zDLrfzP9pqKs2EcLX7HJYxsxCOwrrcLt4x/ctQTsiOw+/8HYotAoqNkrzItL19SdQ== - dependencies: - colord "^2.6" - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-minify-params@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz#371153ba164b9d8562842fdcd929c98abd9e5b6c" - integrity sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw== - dependencies: - alphanum-sort "^1.0.2" - browserslist "^4.16.0" - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - uniqs "^2.0.0" +postcss-logical@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.3.tgz#9934e0fb16af70adbd94217b24d2f315ceb5c2f0" + integrity sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ== -postcss-minify-selectors@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz#4385c845d3979ff160291774523ffa54eafd5a54" - integrity sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og== - dependencies: - alphanum-sort "^1.0.2" - postcss-selector-parser "^6.0.5" +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== postcss-modules-extract-imports@^3.0.0: version "3.0.0" @@ -8919,210 +7787,89 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz#121559d1bebc55ac8d24af37f67bd4da9efd91d0" - integrity sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg== - -postcss-normalize-display-values@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz#62650b965981a955dffee83363453db82f6ad1fd" - integrity sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-positions@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz#868f6af1795fdfa86fbbe960dceb47e5f9492fe5" - integrity sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-normalize-repeat-style@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz#cbc0de1383b57f5bb61ddd6a84653b5e8665b2b5" - integrity sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-string@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz#d9eafaa4df78c7a3b973ae346ef0e47c554985b0" - integrity sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-normalize-timing-functions@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz#8ee41103b9130429c6cbba736932b75c5e2cb08c" - integrity sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-unicode@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz#82d672d648a411814aa5bf3ae565379ccd9f5e37" - integrity sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA== - dependencies: - browserslist "^4.16.0" - postcss-value-parser "^4.1.0" - -postcss-normalize-url@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz#ddcdfb7cede1270740cf3e4dfc6008bd96abc763" - integrity sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ== - dependencies: - is-absolute-url "^3.0.3" - normalize-url "^6.0.1" - postcss-value-parser "^4.1.0" - -postcss-normalize-whitespace@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz#b0b40b5bcac83585ff07ead2daf2dcfbeeef8e9a" - integrity sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA== - dependencies: - postcss-value-parser "^4.1.0" - -postcss-ordered-values@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz#1f351426977be00e0f765b3164ad753dac8ed044" - integrity sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" - -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== - dependencies: - postcss "^7.0.2" - -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== - dependencies: - postcss "^7.0.2" - -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" - -postcss-preset-env@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== +postcss-nesting@^10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.2.tgz#2e5f811b3d75602ea18a95dd445bde5297145141" + integrity sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + postcss-selector-parser "^6.0.8" -postcss-reduce-initial@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz#9d6369865b0f6f6f6b165a0ef5dc1a4856c7e946" - integrity sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw== - dependencies: - browserslist "^4.16.0" - caniuse-api "^3.0.0" +postcss-overflow-shorthand@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz#b4e9c89728cd1e4918173dfb95936b75f78d4148" + integrity sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg== -postcss-reduce-transforms@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz#93c12f6a159474aa711d5269923e2383cedcf640" - integrity sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA== - dependencies: - cssnano-utils "^2.0.1" - postcss-value-parser "^4.1.0" +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== +postcss-place@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.3.tgz#ca8040dfd937c7769a233a3bd6e66e139cf89e62" + integrity sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@7.2.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz#01b9b6eea0ff16c27a3d514f10105d56363428a6" + integrity sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA== + dependencies: + autoprefixer "^10.4.2" + browserslist "^4.19.1" + caniuse-lite "^1.0.30001299" + css-blank-pseudo "^3.0.2" + css-has-pseudo "^3.0.3" + css-prefers-color-scheme "^6.0.2" + cssdb "^5.0.0" + postcss-attribute-case-insensitive "^5.0.0" + postcss-color-functional-notation "^4.2.1" + postcss-color-hex-alpha "^8.0.2" + postcss-color-rebeccapurple "^7.0.2" + postcss-custom-media "^8.0.0" + postcss-custom-properties "^12.1.2" + postcss-custom-selectors "^6.0.0" + postcss-dir-pseudo-class "^6.0.3" + postcss-double-position-gradients "^3.0.4" + postcss-env-function "^4.0.4" + postcss-focus-visible "^6.0.3" + postcss-focus-within "^5.0.3" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.2" + postcss-image-set-function "^4.0.4" + postcss-initial "^4.0.1" + postcss-lab-function "^4.0.3" + postcss-logical "^5.0.3" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.1.2" + postcss-overflow-shorthand "^3.0.2" + postcss-page-break "^3.0.4" + postcss-place "^7.0.3" + postcss-pseudo-class-any-link "^7.0.2" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^5.0.0" + +postcss-pseudo-class-any-link@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz#6284c2f970715c78fe992d2fac1130e9991585c9" + integrity sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA== dependencies: - postcss "^7.0.2" + postcss-selector-parser "^6.0.8" -postcss-selector-matches@^4.0.0: +postcss-replace-overflow-wrap@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" - -postcss-selector-not@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" - integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== - dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: +postcss-selector-not@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" + integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + balanced-match "^1.0.0" -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: +postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.0.6" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== @@ -9130,63 +7877,32 @@ postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.0.2.tgz#bc73c4ea4c5a80fbd4b45e29042c34ceffb9257f" - integrity sha512-YzQuFLZu3U3aheizD+B1joQ94vzPfE6BNUcSYuceNxlVnKKsOtdo6hL9/zyC168Q8EwfLSgaDSalsUGa9f2C0A== - dependencies: - postcss-value-parser "^4.1.0" - svgo "^2.3.0" - -postcss-unique-selectors@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz#3be5c1d7363352eff838bd62b0b07a0abad43bfc" - integrity sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w== +postcss-selector-parser@^6.0.8: + version "6.0.8" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz#f023ed7a9ea736cd7ef70342996e8e78645a7914" + integrity sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ== dependencies: - alphanum-sort "^1.0.2" - postcss-selector-parser "^6.0.5" - uniqs "^2.0.0" + cssesc "^3.0.0" + util-deprecate "^1.0.2" -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@8.3.6: - version "8.3.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" - integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== - dependencies: - colorette "^1.2.2" - nanoid "^3.1.23" - source-map-js "^0.6.2" - -postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" +postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.2.15, postcss@^8.3.5, postcss@^8.3.7: - version "8.3.11" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" - integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA== +postcss@8.4.5, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.3.7: + version "8.4.5" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.5.tgz#bae665764dfd4c6fcc24dc0fdf7e7aa00cc77f95" + integrity sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg== dependencies: nanoid "^3.1.30" picocolors "^1.0.0" - source-map-js "^0.6.2" + source-map-js "^1.0.1" prebuild-install@^6.1.2: version "6.1.3" @@ -9222,25 +7938,14 @@ prepend-http@^2.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier-eslint@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-13.0.0.tgz#769f5c04057278d071847d893ebc7b9817594184" - integrity sha512-P5K31qWgUOQCtJL/3tpvEe28KfP49qbr6MTVEXC7I2k7ci55bP3YDr+glhyCdhIzxGCVp2f8eobfQ5so52RIIA== +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: - "@typescript-eslint/parser" "^3.0.0" - common-tags "^1.4.0" - dlv "^1.1.0" - eslint "^7.9.0" - indent-string "^4.0.0" - lodash.merge "^4.6.0" - loglevel-colored-level-prefix "^1.0.0" - prettier "^2.0.0" - pretty-format "^23.0.1" - require-relative "^0.8.7" - typescript "^3.9.3" - vue-eslint-parser "~7.1.0" - -prettier@^2.0.0, prettier@^2.5.1: + fast-diff "^1.1.2" + +prettier@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== @@ -9250,24 +7955,11 @@ pretty-bytes@^5.3.0: resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-format@^23.0.1: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -9286,27 +7978,6 @@ proto-list@~1.2.1: resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= -protractor@~7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03" - integrity sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw== - dependencies: - "@types/q" "^0.0.32" - "@types/selenium-webdriver" "^3.0.0" - blocking-proxy "^1.0.0" - browserstack "^1.5.1" - chalk "^1.1.3" - glob "^7.0.3" - jasmine "2.8.0" - jasminewd2 "^2.1.0" - q "1.4.1" - saucelabs "^1.5.0" - selenium-webdriver "3.6.0" - source-map-support "~0.4.0" - webdriver-js-extender "2.1.0" - webdriver-manager "^12.1.7" - yargs "^15.3.1" - proxy-addr@~2.0.5: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -9325,11 +7996,6 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -9338,12 +8004,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -9355,16 +8016,6 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -q@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= - -q@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - qjobs@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" @@ -9375,11 +8026,6 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - query-string@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" @@ -9389,16 +8035,6 @@ query-string@^5.0.1: object-assign "^4.1.0" strict-uri-encode "^1.0.0" -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -9481,7 +8117,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -9510,15 +8146,6 @@ readable-web-to-node-stream@^3.0.0: dependencies: readable-stream "^3.6.0" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -9563,14 +8190,6 @@ regenerator-transform@^0.14.2: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regex-parser@^2.2.11: version "2.2.11" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" @@ -9584,7 +8203,7 @@ regexp.prototype.flags@^1.2.0: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: +regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -9632,21 +8251,6 @@ regjsparser@^0.6.4: dependencies: jsesc "~0.5.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -9668,32 +8272,6 @@ replace-in-file@^6.2.0: glob "^7.1.6" yargs "^16.2.0" -request@^2.87.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -9709,11 +8287,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -require-relative@^0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" - integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -9724,46 +8297,35 @@ resolve-alpn@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.1.2.tgz#30b60cfbb0c0b8dc897940fe13fe255afcdd4d28" integrity sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA== -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-url-loader@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" - integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url-loader@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" + integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== dependencies: adjust-sourcemap-loader "^4.0.0" convert-source-map "^1.7.0" loader-utils "^2.0.0" - postcss "^7.0.35" + postcss "^8.2.14" source-map "0.6.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.20.0, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@1.22.0, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@1.0.2, responselike@^1.0.2: version "1.0.2" @@ -9787,27 +8349,27 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - retry@^0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rfdc@^1.1.4: +rfdc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3: +rimraf@^2.5.4: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9850,79 +8412,58 @@ rxjs-for-await@0.0.2: resolved "https://registry.yarnpkg.com/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz#26598a1d6167147cc192172970e7eed4e620384b" integrity sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw== -rxjs@6.6.7, rxjs@^6.5.4, rxjs@~6.6.7: +rxjs@6.6.7, rxjs@^6.5.4: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" -rxjs@^7.2.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6" - integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== +rxjs@^7.2.0, rxjs@~7.5.2: + version "7.5.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.2.tgz#11e4a3a1dfad85dbf7fb6e33cbba17668497490b" + integrity sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w== dependencies: - tslib "~2.1.0" + tslib "^2.1.0" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: +safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-loader@12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.1.0.tgz#b73324622231009da6fba61ab76013256380d201" - integrity sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg== +sass-loader@12.4.0: + version "12.4.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.4.0.tgz#260b0d51a8a373bb8e88efc11f6ba5583fea0bcf" + integrity sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg== dependencies: klona "^2.0.4" neo-async "^2.6.2" -sass@1.36.0: - version "1.36.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.36.0.tgz#5912ef9d5d16714171ba11cb17edb274c4bbc07e" - integrity sha512-fQzEjipfOv5kh930nu3Imzq3ie/sGDc/4KtQMJlt7RRdrkQSfe37Bwi/Rf/gfuYHsIuE1fIlDMvpyMcEwjnPvg== +sass@1.49.0: + version "1.49.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.0.tgz#65ec1b1d9a6bc1bae8d2c9d4b392c13f5d32c078" + integrity sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw== dependencies: chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" -saucelabs@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" - integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== - dependencies: - https-proxy-agent "^2.2.1" - -sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -schema-utils@^2.6.5, schema-utils@^2.7.0: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -9949,6 +8490,16 @@ schema-utils@^3.1.0: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + seek-bzip@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4" @@ -9961,22 +8512,12 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" - integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== - dependencies: - jszip "^3.1.3" - rimraf "^2.5.4" - tmp "0.0.30" - xml2js "^0.4.17" - -selfsigned@^1.10.8: - version "1.10.11" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" - integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== +selfsigned@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.0.tgz#e927cd5377cbb0a1075302cff8df1042cc2bce5b" + integrity sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ== dependencies: - node-forge "^0.10.0" + node-forge "^1.2.0" semver-compare@^1.0.0: version "1.0.0" @@ -10019,7 +8560,7 @@ semver@7.3.4: dependencies: lru-cache "^6.0.0" -semver@7.3.5, semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: +semver@7.3.5, semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -10092,21 +8633,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -10176,6 +8702,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" @@ -10216,50 +8747,11 @@ slash@^4.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - smart-buffer@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - socket.io-adapter@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz#4d6111e4d42e9f7646e365b4f578269821f13486" @@ -10286,18 +8778,6 @@ socket.io@^4.2.0: socket.io-adapter "~2.3.2" socket.io-parser "~4.0.4" -sockjs-client@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6" - integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ== - dependencies: - debug "^3.2.6" - eventsource "^1.0.7" - faye-websocket "^0.11.3" - inherits "^2.0.4" - json3 "^3.3.3" - url-parse "^1.5.1" - sockjs@^0.3.21: version "0.3.21" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" @@ -10307,15 +8787,6 @@ sockjs@^0.3.21: uuid "^3.4.0" websocket-driver "^0.7.4" -socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== - dependencies: - agent-base "^6.0.2" - debug "4" - socks "^2.3.3" - socks-proxy-agent@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz#e664e8f1aaf4e1fb3df945f09e3d94f911137f87" @@ -10325,7 +8796,7 @@ socks-proxy-agent@^6.0.0: debug "^4.3.1" socks "^2.6.1" -socks@^2.3.3, socks@^2.6.1: +socks@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== @@ -10354,57 +8825,42 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== +"source-map-js@>=0.6.2 <2.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== +source-map-js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.1.tgz#a1741c131e3c77d048252adfa24e23b908670caf" + integrity sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA== -source-map-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.0.tgz#f2a04ee2808ad01c774dea6b7d2639839f3b3049" - integrity sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw== +source-map-loader@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== dependencies: abab "^2.0.5" - iconv-lite "^0.6.2" - source-map-js "^0.6.2" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== dependencies: atob "^2.1.2" decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" -source-map-support@0.5.19, source-map-support@^0.5.5, source-map-support@~0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@0.5.21, source-map-support@^0.5.5, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.4.0: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -10414,7 +8870,7 @@ source-map@0.7.3, source-map@^0.7.3, source-map@~0.7.2: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -10473,13 +8929,6 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - sprintf-js@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" @@ -10499,21 +8948,6 @@ squeak@^1.0.0: console-stream "^0.1.1" lpad-align "^1.0.1" -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - ssri@^8.0.0, ssri@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" @@ -10521,32 +8955,19 @@ ssri@^8.0.0, ssri@^8.0.1: dependencies: minipass "^3.1.1" -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -streamroller@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-2.2.4.tgz#c198ced42db94086a6193608187ce80a5f2b0e53" - integrity sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ== +streamroller@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.0.2.tgz#30418d0eee3d6c93ec897f892ed098e3a81e68b7" + integrity sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA== dependencies: - date-format "^2.1.0" + date-format "^4.0.3" debug "^4.1.1" - fs-extra "^8.1.0" + fs-extra "^10.0.0" strict-uri-encode@^1.0.0: version "1.1.0" @@ -10579,7 +9000,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^3.0.0, string-width@^3.1.0: +string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -10641,27 +9062,27 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^6.0.1: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -10686,6 +9107,11 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" @@ -10718,40 +9144,25 @@ strtok3@^6.2.4: "@tokenizer/token" "^0.3.0" peek-readable "^4.0.1" -style-loader@3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.2.1.tgz#63cb920ec145c8669e9a50e92961452a1ef5dcde" - integrity sha512-1k9ZosJCRFaRbY6hH49JFlRB0fVSbmnyq1iTPjNxUmGVjBNEmwrrHPenhlp+Lgo51BojHSf6pl2FcqYaN3PfVg== - -stylehacks@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.0.1.tgz#323ec554198520986806388c7fdaebc38d2c06fb" - integrity sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA== - dependencies: - browserslist "^4.16.0" - postcss-selector-parser "^6.0.4" - -stylus-loader@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-6.1.0.tgz#7a3a719a27cb2b9617896d6da28fda94c3ed9762" - integrity sha512-qKO34QCsOtSJrXxQQmXsPeaVHh6hMumBAFIoJTcsSr2VzrA6o/CW9HCGR8spCjzJhN8oKQHdj/Ytx0wwXyElkw== +stylus-loader@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-6.2.0.tgz#0ba499e744e7fb9d9b3977784c8639728a7ced8c" + integrity sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg== dependencies: - fast-glob "^3.2.5" + fast-glob "^3.2.7" klona "^2.0.4" normalize-path "^3.0.0" -stylus@0.54.8: - version "0.54.8" - resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" - integrity sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg== +stylus@0.56.0: + version "0.56.0" + resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.56.0.tgz#13fc85c48082db483c90d2530942fe8b0be988eb" + integrity sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA== dependencies: - css-parse "~2.0.0" - debug "~3.1.0" + css "^3.0.0" + debug "^4.3.2" glob "^7.1.6" - mkdirp "~1.0.4" safer-buffer "^2.1.2" sax "~1.2.4" - semver "^6.3.0" source-map "^0.7.3" supports-color@^2.0.0: @@ -10766,13 +9177,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -10787,36 +9191,16 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -svgo@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.3.1.tgz#603a69ce50311c0e36791528f549644ec1b3f4bc" - integrity sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw== - dependencies: - "@trysound/sax" "0.1.1" - chalk "^4.1.0" - commander "^7.1.0" - css-select "^4.1.3" - css-tree "^1.1.2" - csso "^4.2.0" - stable "^0.1.8" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== symbol-observable@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== -table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" - tapable@^2.1.1, tapable@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" @@ -10881,7 +9265,7 @@ tempfile@^2.0.0: temp-dir "^1.0.0" uuid "^3.0.1" -terser-webpack-plugin@5.1.4, terser-webpack-plugin@^5.1.3: +terser-webpack-plugin@^5.1.3: version "5.1.4" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.4.tgz#c369cf8a47aa9922bd0d8a94fe3d3da11a7678a1" integrity sha512-C2WkFwstHDhVEmsmlCxrXUtVklS+Ir1A7twrYzrDrQQOIMOaVAYykaoo/Aq1K0QRkMoY2hhvDQY1cm4jnIMFwA== @@ -10893,14 +9277,23 @@ terser-webpack-plugin@5.1.4, terser-webpack-plugin@^5.1.3: source-map "^0.6.1" terser "^5.7.0" -terser@5.7.1, terser@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.1.tgz#2dc7a61009b66bb638305cb2a824763b116bf784" - integrity sha512-b3e+d5JbHAe/JSjwsC3Zn55wsBIM7AsHLjKxT31kGCldgbpFePaFo+PiddtO6uwRZWRw7sPXmAN8dTW61xmnSg== +terser@5.10.0, terser@^5.7.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" + integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== dependencies: commander "^2.20.0" source-map "~0.7.2" - source-map-support "~0.5.19" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" text-table@0.2.0, text-table@^0.2.0: version "0.2.0" @@ -10922,18 +9315,6 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -tmp@0.0.30: - version "0.0.30" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" - integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= - dependencies: - os-tmpdir "~1.0.1" - tmp@0.2.1, tmp@^0.2.1, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" @@ -10958,26 +9339,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -10985,16 +9351,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -11013,14 +9369,6 @@ totalist@^1.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -11066,27 +9414,17 @@ tsconfig-paths@^3.12.0: minimist "^1.2.0" strip-bom "^3.0.0" -tslib@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: +tslib@2.3.1, tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== +tslib@^1.8.1, tslib@^1.9.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tsutils@^3.17.1, tsutils@^3.21.0: +tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== @@ -11100,11 +9438,6 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -11135,6 +9468,11 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" +typed-assert@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/typed-assert/-/typed-assert-1.0.8.tgz#4bf9f1ce7f3f974d09c3afd7c68d12e1391a233c" + integrity sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -11142,20 +9480,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@4.3.5: - version "4.3.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" - integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== - -typescript@^3.9.3: - version "3.9.10" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" - integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== - -typescript@~4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" - integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== +typescript@~4.5.5: + version "4.5.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" + integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== ua-parser-js@^0.7.30: version "0.7.31" @@ -11203,26 +9531,6 @@ unicode-property-aliases-ecmascript@^1.0.4: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -11244,11 +9552,6 @@ unique-string@^2.0.0: dependencies: crypto-random-string "^2.0.0" -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -11259,19 +9562,6 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - update-notifier@5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" @@ -11299,11 +9589,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - url-parse-lax@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" @@ -11318,32 +9603,11 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3, url-parse@^1.5.1: - version "1.5.3" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" - integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k= -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11359,7 +9623,7 @@ uuid@8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: +uuid@^3.0.1, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -11389,41 +9653,15 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vendors@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= -vue-eslint-parser@~7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.1.tgz#c43c1c715ff50778b9a7e9a4e16921185f3425d3" - integrity sha512-8FdXi0gieEwh1IprIBafpiJWcApwrU+l2FEj8c1HtHFdNXMd0+2jUSjBVmcQYohf/E72irwAXEXLga6TQcB3FA== - dependencies: - debug "^4.1.1" - eslint-scope "^5.0.0" - eslint-visitor-keys "^1.1.0" - espree "^6.2.1" - esquery "^1.0.1" - lodash "^4.17.15" - -watchpack@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" - integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -11442,115 +9680,66 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webdriver-js-extender@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" - integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ== - dependencies: - "@types/selenium-webdriver" "^3.0.0" - selenium-webdriver "^3.0.1" - -webdriver-manager@^12.1.7: - version "12.1.8" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.8.tgz#5e70e73eaaf53a0767d5745270addafbc5905fd4" - integrity sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg== - dependencies: - adm-zip "^0.4.9" - chalk "^1.1.1" - del "^2.2.0" - glob "^7.0.3" - ini "^1.3.4" - minimist "^1.2.0" - q "^1.4.1" - request "^2.87.0" - rimraf "^2.5.2" - semver "^5.3.0" - xml2js "^0.4.17" - -webpack-bundle-analyzer@^4.4.1: - version "4.4.2" - resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz#39898cf6200178240910d629705f0f3493f7d666" - integrity sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ== +webpack-bundle-analyzer@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5" + integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ== dependencies: acorn "^8.0.4" acorn-walk "^8.0.0" chalk "^4.1.0" - commander "^6.2.0" + commander "^7.2.0" gzip-size "^6.0.0" lodash "^4.17.20" opener "^1.5.2" sirv "^1.0.7" ws "^7.3.1" -webpack-dev-middleware@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz#0abe825275720e0a339978aea5f0b03b140c1584" - integrity sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw== +webpack-dev-middleware@5.3.0, webpack-dev-middleware@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz#8fc02dba6e72e1d373eca361623d84610f27be7c" + integrity sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg== dependencies: - colorette "^1.2.2" - mem "^8.1.1" + colorette "^2.0.10" memfs "^3.2.2" mime-types "^2.1.31" range-parser "^1.2.1" - schema-utils "^3.0.0" - -webpack-dev-middleware@^3.7.2: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== - dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" - range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@3.11.2: - version "3.11.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708" - integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ== - dependencies: - ansi-html "0.0.7" + schema-utils "^4.0.0" + +webpack-dev-server@4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz#4e995b141ff51fa499906eebc7906f6925d0beaa" + integrity sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.2.2" + ansi-html-community "^0.0.8" bonjour "^3.5.0" - chokidar "^2.1.8" + chokidar "^3.5.2" + colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" + default-gateway "^6.0.3" + del "^6.0.0" 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.8" - semver "^6.3.0" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^4.0.0" + selfsigned "^2.0.0" serve-index "^1.9.1" sockjs "^0.3.21" - sockjs-client "^1.5.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" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" + strip-ansi "^7.0.0" + webpack-dev-middleware "^5.3.0" + ws "^8.1.0" webpack-merge@5.8.0: version "5.8.0" @@ -11560,30 +9749,22 @@ webpack-merge@5.8.0: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^1.2.0, webpack-sources@^1.3.0: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack-sources@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.0.tgz#b16973bcf844ebcdb3afde32eda1c04d0b90f89d" - integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw== +webpack-sources@^3.0.0, webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack-subresource-integrity@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz#e40b6578d3072e2d24104975249c52c66e9a743e" - integrity sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw== +webpack-subresource-integrity@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz#8b7606b033c6ccac14e684267cb7fb1f5c2a132a" + integrity sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q== dependencies: - webpack-sources "^1.3.0" + typed-assert "^1.0.8" -webpack@5.50.0: - version "5.50.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.50.0.tgz#5562d75902a749eb4d75131f5627eac3a3192527" - integrity sha512-hqxI7t/KVygs0WRv/kTgUW8Kl3YC81uyWQSo/7WUs5LsuRw0htH/fCwbVBGCuiX/t4s7qzjXFcf41O8Reiypag== +webpack@5.67.0: + version "5.67.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.67.0.tgz#cb43ca2aad5f7cc81c4cd36b626e6b819805dbfd" + integrity sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.50" @@ -11594,12 +9775,12 @@ webpack@5.50.0: acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.0" - es-module-lexer "^0.7.1" + enhanced-resolve "^5.8.3" + es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" json-parse-better-errors "^1.0.2" loader-runner "^4.2.0" mime-types "^2.1.27" @@ -11607,8 +9788,8 @@ webpack@5.50.0: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.2.0" - webpack-sources "^3.2.0" + watchpack "^2.3.1" + webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" @@ -11694,15 +9875,6 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -11736,18 +9908,16 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" - ws@^7.3.1: version "7.5.1" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.1.tgz#44fc000d87edb1d9c53e51fbc69a0ac1f6871d66" integrity sha512-2c6faOUH/nhoQN6abwMloF7Iyl0ZS2E9HGtsiLrWn0zOOMWlhtDmdf/uihDt6jnuCxgtwGBNy6Onsoy2s2O2Ow== +ws@^8.1.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" + integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== + ws@~8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" @@ -11758,19 +9928,6 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xml2js@^0.4.17: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -11796,7 +9953,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0, yaml@^1.10.2: +yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== @@ -11806,14 +9963,6 @@ yargs-parser@20.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.0.0.tgz#c65a1daaa977ad63cebdd52159147b789a4e19a9" integrity sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA== -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -11827,7 +9976,12 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@15.4.1, yargs@^15.3.1: +yargs-parser@^21.0.0: + version "21.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" + integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== + +yargs@15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -11844,22 +9998,6 @@ yargs@15.4.1, yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - 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" - yargs@^16.1.1, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" @@ -11873,6 +10011,19 @@ yargs@^16.1.1, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.2.1: + version "17.3.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.3.1.tgz#da56b28f32e2fd45aefb402ed9c26f42be4c07b9" + integrity sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml deleted file mode 100644 index 52db55b9a..000000000 --- a/src-tauri/Cargo.toml +++ /dev/null @@ -1,75 +0,0 @@ -[package] -name = "cabr2" -version = "0.4.1" -description = 'Generate "experiment wise safety sheets" in compliance to European law.' -authors = [ - "Epsilon_02 ", - "crapStone ", - "6543 <6543@obermui.de>", -] -license = "GPLv3+" -repository = "https://github.com/Calciumdibromid/CaBr2/" -default-run = "cabr2" -edition = "2018" -build = "src/build.rs" - -[build-dependencies] -tauri-build = { version = "1.0.0-beta.4" } - -[dependencies] -cabr2_config = { path = "./cabr2_config/" } -cabr2_load_save = { path = "./cabr2_load_save/" } -cabr2_logger = { path = "./cabr2_logger/", optional = true } -cabr2_search = { path = "./cabr2_search/" } -log = "0.4.14" -tauri = { version = "1.0.0-beta.8", features = ["api-all"], optional = true } -tokio = { version = "1.15.0", features = ["macros", "rt-multi-thread"], optional = true } -warp = { version = "0.3.2", optional = true } - -[features] -default = [ - "portable", - "beryllium", - "cabr2", - "pdf", - "gestis", -] -portable = [ "cabr2_config/portable" ] -custom-protocol = [ "tauri/custom-protocol" ] # needed for tauri release builds -tauri_app = [ - "tauri", - "cabr2_logger/tauri_plugin", - "cabr2_config/tauri_plugin", - "cabr2_load_save/tauri_plugin", - "cabr2_search/tauri_plugin", -] -webserver = [ - "warp", - "tokio", - "cabr2_logger", - "cabr2_config/webserver", - "cabr2_load_save/webserver", - "cabr2_search/webserver", -] - -# cabr2_load_save file types -beryllium = [ "cabr2_load_save/beryllium" ] -cabr2 = [ "cabr2_load_save/cabr2" ] -pdf = [ "cabr2_load_save/pdf" ] - -# cabr2_search providers -gestis = [ "cabr2_search/gestis" ] - -[workspace] -members = [ - "cabr2_types", - "cabr2_config", - "cabr2_load_save", - "cabr2_logger", - "cabr2_search", -] - -[profile.release] -panic = "abort" -codegen-units = 1 -lto = true diff --git a/src-tauri/cabr2_config/src/lib.rs b/src-tauri/cabr2_config/src/lib.rs deleted file mode 100644 index 962e8717f..000000000 --- a/src-tauri/cabr2_config/src/lib.rs +++ /dev/null @@ -1,13 +0,0 @@ -#![allow(clippy::upper_case_acronyms)] - -mod error; -pub mod handler; -mod types; - -#[cfg(feature = "tauri_plugin")] -pub mod plugin; -#[cfg(feature = "webserver")] -pub mod webserver; - -pub use handler::{get_hazard_symbols, read_config, DATA_DIR, TMP_DIR}; -pub use types::{BackendConfig, GHSSymbols}; diff --git a/src-tauri/cabr2_load_save/src/beryllium/mod.rs b/src-tauri/cabr2_load_save/src/beryllium/mod.rs deleted file mode 100644 index 1e5c05aec..000000000 --- a/src-tauri/cabr2_load_save/src/beryllium/mod.rs +++ /dev/null @@ -1,164 +0,0 @@ -mod types; - -use async_trait::async_trait; -use chrono::TimeZone; -use lazy_static::lazy_static; -use quick_xml::de::from_reader; -use regex::Regex; - -use cabr2_types::{Amount, Data, Source, SubstanceData, Unit}; - -use super::{ - error::{LoadSaveError, Result}, - types::{CaBr2Document, Header, Loader}, -}; -use types::{BerylliumDocument, TemplateCategory}; - -pub struct Beryllium; - -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] -impl Loader for Beryllium { - async fn load_document(&self, contents: Vec) -> Result { - lazy_static! { - static ref BEGINNING_OF_TIME: chrono::DateTime = chrono::Utc.ymd(1970, 1, 1).and_hms(0, 0, 0); - static ref GESTIS_URL_RE: Regex = - Regex::new(r"http://gestis\.itrust\.de/nxt/gateway\.dll/gestis_(de|en)/(\d{6})\.xml").unwrap(); - } - - match from_reader(contents.as_slice()) { - Ok(beryllium_doc) => { - // simplest way for a typedefinition - let beryllium_doc: BerylliumDocument = beryllium_doc; - Ok(CaBr2Document { - disposal: get_templates_with_category(&beryllium_doc, TemplateCategory::Dumping), - human_and_environment_danger: get_templates_with_category(&beryllium_doc, TemplateCategory::Danger), - in_case_of_danger: get_templates_with_category(&beryllium_doc, TemplateCategory::Behavior), - rules_of_conduct: get_templates_with_category(&beryllium_doc, TemplateCategory::Security), - header: Header { - assistant: beryllium_doc.personal.assistant, - document_title: beryllium_doc.general.title, - lab_course: beryllium_doc.general.location, - name: beryllium_doc.personal.name, - organisation: beryllium_doc.general.institute, - place: beryllium_doc.personal.spot, - preparation: beryllium_doc.product.name, - }, - substance_data: beryllium_doc - .substances - .into_iter() - .map(|mut substance| SubstanceData { - name: Data::new(substance.names[0].clone()), - alternative_names: substance.names.split_off(1), - cas: Data::new(substance.cas), - molecular_formula: Data::new(substance.chemical_formula), - molar_mass: Data::new(substance.molecular_weight), - boiling_point: Data::new(substance.boiling_point), - melting_point: Data::new(match substance.melting_point { - Some(mp) => Some(mp.value), - None => None, - }), - water_hazard_class: Data::new(substance.wgk), - h_phrases: Data::new(match substance.harzard_statements { - Some(phrases) => phrases - .split('-') - .map(|p| (format!("H{}", p), "".into())) // TODO fill statements - .collect(), - None => Vec::new(), - }), - p_phrases: Data::new(match substance.precautionary_statements { - Some(phrases) => phrases - .split('-') - .map(|p| (format!("P{}", p), "".into())) // TODO fill statements - .collect(), - None => Vec::new(), - }), - signal_word: Data::new(substance.signal_word), - symbols: Data::new(match substance.symbols { - Some(symbols) => symbols - .into_iter() - .map(|s| format!("ghs{}", s.trim_end_matches("-neu"))) - .collect(), - None => Vec::new(), - }), - lethal_dose: Data::new(match substance.lethaldose50 { - Some(ld50) => Some(ld50.value), - None => None, - }), - mak: Data::new(match substance.mak { - Some(mak) => Some(mak.value), - None => None, - }), - amount: { - let mut unit = None; - let mut value = None; - if let Some(su) = substance.setting_up { - if su.volumina.unwrap_or_default() { - unit = Some(Unit::Liter); - } else if su.mass.unwrap_or_default() { - unit = Some(Unit::Gram); - } - value = Some(su.value); - } - if let Some(c) = substance.concentration { - if c.relative.unwrap_or_default() { - unit = Some(Unit::SolutionRelative); - } else { - unit = Some(Unit::SolutionMol); - } - value = substance.solution_volumina; - } - - if unit.is_some() && value.is_some() { - Some(Amount { - unit: unit.unwrap(), - value: value.unwrap(), - }) - } else { - log::debug!("could not convert amount: {{ unit: {:?}, value: {:?} }}", unit, value); - None - } - }, - source: Source { - provider: substance - .source_provider - .unwrap_or_else(|| "custom".into()) - .to_lowercase(), - url: { - let mut url = substance.source_url.unwrap_or_default(); - // remap gestis url to new one - if GESTIS_URL_RE.is_match(&url) { - let captures = GESTIS_URL_RE.captures(&url).unwrap(); - url = format!( - "https://gestis-api.dguv.de/api/article/{}/{}", - &captures[1], &captures[2] - ); - } - url - }, - last_updated: match chrono::DateTime::parse_from_rfc2822(&substance.source_fetched.unwrap_or_default()) - { - Ok(datetime) => datetime.into(), - Err(_) => *BEGINNING_OF_TIME, - }, - }, - - checked: true, - }) - .collect(), - }) - } - Err(e) => Err(LoadSaveError::DeserializeError(e.to_string())), - } - } -} - -fn get_templates_with_category(doc: &BerylliumDocument, category: TemplateCategory) -> Vec { - doc - .templates - .templates - .iter() - .filter(|t| t.category == category) - .map(|t| t.content.clone()) - .collect() -} diff --git a/src-tauri/cabr2_load_save/src/cabr2/mod.rs b/src-tauri/cabr2_load_save/src/cabr2/mod.rs deleted file mode 100644 index 61b2dcccf..000000000 --- a/src-tauri/cabr2_load_save/src/cabr2/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -use async_trait::async_trait; - -use super::{ - error::Result, - types::{CaBr2Document, Loader, Saver}, -}; - -pub struct CaBr2; - -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] -impl Loader for CaBr2 { - async fn load_document(&self, contents: Vec) -> Result { - Ok(serde_json::from_slice(&contents)?) - } -} - -#[cfg_attr(not(feature = "wasm"), async_trait)] -#[cfg_attr(feature = "wasm", async_trait(?Send))] -impl Saver for CaBr2 { - async fn save_document(&self, document: CaBr2Document) -> Result> { - Ok(serde_json::to_vec(&document)?) - } -} diff --git a/src-tauri/cabr2_load_save/src/error.rs b/src-tauri/cabr2_load_save/src/error.rs deleted file mode 100644 index cea415509..000000000 --- a/src-tauri/cabr2_load_save/src/error.rs +++ /dev/null @@ -1,49 +0,0 @@ -use serde::{Serialize, Serializer}; -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum LoadSaveError { - #[error("unknown file type")] - UnknownFileType(String), - - #[cfg(feature = "beryllium")] - #[error("failed to load file: '{0}'")] - DeserializeError(String), - - #[error("file already exists: '{0}'")] - FileExists(String), - - #[cfg(feature = "pdf")] - #[error("merging of pdfs failed: '{0}'")] - PdfMergeError(String), - - #[cfg(feature = "pdf")] - #[error("creating template failed: '{0}'")] - TemplateError(#[from] handlebars::TemplateError), - - #[cfg(feature = "pdf")] - #[error("rendering document failed: '{0}'")] - RenderError(#[from] handlebars::RenderError), - - #[cfg(feature = "pdf")] - #[error("PDF creation failed: {0}")] - PdfError(#[from] wkhtmltopdf::Error), - - #[cfg(feature = "cabr2")] - #[error("parsing json failed: '{0}'")] - JsonError(#[from] serde_json::Error), - - #[error("io error: '{0}'")] - IOError(#[from] std::io::Error), -} - -impl Serialize for LoadSaveError { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: Serializer, - { - serializer.serialize_str(self.to_string().as_str()) - } -} - -pub type Result = std::result::Result; diff --git a/src-tauri/cabr2_load_save/src/handler.rs b/src-tauri/cabr2_load_save/src/handler.rs deleted file mode 100644 index a4dffd277..000000000 --- a/src-tauri/cabr2_load_save/src/handler.rs +++ /dev/null @@ -1,132 +0,0 @@ -use std::collections::HashMap; - -use cfg_if::cfg_if; -use lazy_static::lazy_static; - -use cabr2_types::ProviderMapping; - -use crate::{ - error::{LoadSaveError, Result}, - types::{CaBr2Document, DialogFilter, DocumentTypes, Loader, Saver}, -}; - -// because tokio doesn't fully support wasm we have to use two different implementations for these locks -cfg_if! { - if #[cfg(feature = "wasm")] { - use std::sync::RwLock; - } else { - use tokio::sync::RwLock; - } -} - -type LoadersMap = RwLock)>>; -type SaversMap = RwLock)>>; - -lazy_static! { - pub static ref REGISTERED_LOADERS: LoadersMap = RwLock::new(HashMap::new()); - pub static ref REGISTERED_SAVERS: SaversMap = RwLock::new(HashMap::new()); -} - -pub async fn init_handlers(_provider_mapping: ProviderMapping) { - cfg_if! { - if #[cfg(feature = "wasm")] { - let mut _loaders = REGISTERED_LOADERS.write().expect("failed to get write lock of loaders"); - } else { - let mut _loaders = REGISTERED_LOADERS.write().await; - } - } - - #[cfg(feature = "cabr2")] - _loaders.insert("cb2", ("CaBr2", Box::new(crate::cabr2::CaBr2))); - #[cfg(feature = "beryllium")] - _loaders.insert("be", ("Beryllium", Box::new(crate::beryllium::Beryllium))); - - cfg_if! { - if #[cfg(feature = "wasm")] { - let mut _savers = REGISTERED_SAVERS.write().expect("failed to get write lock of savers"); - } else { - let mut _savers = REGISTERED_SAVERS.write().await; - } - } - - #[cfg(feature = "cabr2")] - _savers.insert("cb2", ("CaBr2", Box::new(crate::cabr2::CaBr2))); - #[cfg(feature = "pdf")] - _savers.insert("pdf", ("PDF", Box::new(crate::pdf::PDF::new(_provider_mapping)))); -} - -pub async fn save_document(file_type: &str, document: CaBr2Document) -> Result> { - cfg_if! { - if #[cfg(feature = "wasm")] { - let savers = REGISTERED_SAVERS.read().expect("failed to get read lock of savers"); - } else { - let savers = REGISTERED_SAVERS.read().await; - } - } - - if let Some((_, saver)) = savers.get(file_type) { - return saver.save_document(document).await; - } - - Err(LoadSaveError::UnknownFileType(file_type.to_string())) -} - -pub async fn load_document(file_type: &str, contents: Vec) -> Result { - cfg_if! { - if #[cfg(feature = "wasm")] { - let loaders = REGISTERED_LOADERS.read().expect("failed to get read lock of loaders"); - } else { - let loaders = REGISTERED_LOADERS.read().await; - } - } - - if let Some((_, loader)) = loaders.get(file_type) { - return loader.load_document(contents).await; - } - - Err(LoadSaveError::UnknownFileType(file_type.to_string())) -} - -pub async fn get_available_document_types() -> DocumentTypes { - cfg_if! { - if #[cfg(feature = "wasm")] { - let loaders = REGISTERED_LOADERS.read().expect("failed to get read lock of loaders"); - } else { - let loaders = REGISTERED_LOADERS.read().await; - } - } - - let mut load: Vec = loaders - .iter() - .map(|(ext, (name, _))| DialogFilter { - name: name.to_string(), - extensions: vec![ext.to_string()], - }) - .collect(); - - // set cb2 as first element - if let Some((i, _)) = (&load).iter().enumerate().find(|(_, f)| f.extensions[0] == "cb2") { - if i != 0 { - log::debug!("setting cb2 as first file type from: {}", i); - load.swap(i, 0); - } - } - - cfg_if! { - if #[cfg(feature = "wasm")] { - let savers = REGISTERED_SAVERS.read().expect("failed to get read lock of savers"); - } else { - let savers = REGISTERED_SAVERS.read().await; - } - } - - let save = savers - .iter() - .map(|(ext, (name, _))| DialogFilter { - name: name.to_string(), - extensions: vec![ext.to_string()], - }) - .collect(); - - DocumentTypes { load, save } -} diff --git a/src-tauri/cabr2_search/contrib/gestis/helper.rs b/src-tauri/cabr2_search/contrib/gestis/helper.rs deleted file mode 100644 index 624d5b6b1..000000000 --- a/src-tauri/cabr2_search/contrib/gestis/helper.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::{ - fs::{self, OpenOptions}, - io::{BufWriter, Write}, - path::PathBuf, -}; - -use structopt::StructOpt; - -use cabr2_search::gestis::{self, types::GestisResponse}; - -#[derive(StructOpt, Debug)] -#[structopt(name = "gestis_helper")] -struct Arguments { - /// Extract xmls from gestis id - #[structopt(short, long)] - pub extract: Option, -} - -fn main() { - let args = Arguments::from_args(); - - if args.extract.is_some() { - let gestis = gestis::Gestis::new(ureq::agent()); - let (res, _) = gestis.get_article(args.extract.unwrap()).unwrap(); - - extract_xmls(&res).unwrap(); - } -} - -fn extract_xmls(res: &GestisResponse) -> std::io::Result<()> { - let mut folder = PathBuf::from("gestis_helper"); - folder.push(&res.name); - fs::create_dir_all(&folder)?; - - let mut response_file = folder.clone(); - response_file.push("_response.json"); - let file = OpenOptions::new().write(true).create(true).open(response_file)?; - let writer = BufWriter::new(file); - serde_json::to_writer_pretty(writer, res)?; - - println!("extracting: {}.json", res.name); - - for (chapter_name, (chapter, subchapter)) in gestis::xml_parser::CHAPTER_MAPPING.iter() { - print!(" trying: {} ... ", chapter_name); - - match gestis::xml_parser::get_xml(res, chapter, subchapter) { - Ok(xml) => { - let mut filename = folder.clone(); - filename.push(chapter_name); - - let mut file = OpenOptions::new() - .create(true) - .write(true) - .open(filename.with_extension("xml"))?; - - file.write_all(xml.as_bytes())?; - - println!("\x1B[32mSUCCESS\x1B[m"); - } - Err(_) => { - println!("\x1B[31mNO_XML\x1B[m"); - continue; - } - } - } - - Ok(()) -} diff --git a/src-tauri/cabr2_search/contrib/gestis_helper.sh b/src-tauri/cabr2_search/contrib/gestis_helper.sh deleted file mode 100755 index 513cc3c66..000000000 --- a/src-tauri/cabr2_search/contrib/gestis_helper.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -cargo run --bin gestis_helper --features="structopt gestis" -- $@ diff --git a/src-tauri/cabr2_search/src/error.rs b/src-tauri/cabr2_search/src/error.rs deleted file mode 100644 index 77d9e03c6..000000000 --- a/src-tauri/cabr2_search/src/error.rs +++ /dev/null @@ -1,62 +0,0 @@ -use serde::{Serialize, Serializer}; -use thiserror::Error; - -#[derive(Error, Debug)] -pub enum SearchError { - // should never occur in the wild - #[error("already logged")] - Logged, - - #[error("unknown provider: {0}")] - UnknownProvider(String), - - #[error("rate limited by server")] - RateLimit, - - #[error("request error: {0}")] - RequestError(u16), - - #[error("parsing json failed")] - JsonError, - - #[error("no xml found")] - NoXML, - - // the value is explicitly empty - #[error("no value")] - Empty, - - #[error("missing information: {0}")] - MissingInfo(String), - - #[error("more values than expected")] - Multiple(String), - - #[cfg(feature = "gestis")] - #[error("reqwest error")] - ReqwestError(#[from] reqwest::Error), - #[cfg(feature = "gestis")] - #[error("parsing xml failed")] - XmlError(roxmltree::Error), - #[error("io error")] - IOError(#[from] std::io::Error), -} - -#[cfg(feature = "gestis")] -impl From for SearchError { - #[inline] - fn from(e: roxmltree::Error) -> Self { - SearchError::XmlError(e) - } -} - -impl Serialize for SearchError { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: Serializer, - { - serializer.serialize_str(self.to_string().as_str()) - } -} - -pub type Result = std::result::Result; diff --git a/src-tauri/cabr2_search/src/gestis/types.rs b/src-tauri/cabr2_search/src/gestis/types.rs deleted file mode 100644 index 4a82d7487..000000000 --- a/src-tauri/cabr2_search/src/gestis/types.rs +++ /dev/null @@ -1,47 +0,0 @@ -use serde::{Deserialize, Serialize}; - -#[derive(Debug)] -pub struct ParsedData { - pub cas: Option, - pub molecular_formula: Option, - pub molar_mass: Option, - pub melting_point: Option, - pub boiling_point: Option, - pub water_hazard_class: Option, - pub h_phrases: Option>, - pub p_phrases: Option>, - pub signal_word: Option, - pub symbols: Option>, - pub lethal_dose: Option, - pub mak: Option, -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct GestisResponse { - #[serde(rename = "zvgnummer_mit_null")] - pub zvg_number: String, - pub name: String, - #[serde(rename = "hauptkapitel")] - pub chapters: Vec, - pub aliases: Vec, -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct Chapter { - #[serde(rename = "drnr")] - pub number: String, - #[serde(rename = "unterkapitel")] - pub subchapters: Vec, -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct Subchapter { - #[serde(rename = "drnr")] - pub number: String, - pub text: Option, -} - -#[derive(Debug, Deserialize, Serialize)] -pub struct Alias { - pub name: String, -} diff --git a/src-tauri/cabr2_search/src/gestis/xml_parser.rs b/src-tauri/cabr2_search/src/gestis/xml_parser.rs deleted file mode 100644 index 02296f2eb..000000000 --- a/src-tauri/cabr2_search/src/gestis/xml_parser.rs +++ /dev/null @@ -1,538 +0,0 @@ -use std::collections::BTreeMap; - -use lazy_static::lazy_static; -use roxmltree::{Document, Node, NodeId}; - -use super::types::{GestisResponse, ParsedData}; -use crate::error::{Result, SearchError}; - -lazy_static! { - pub static ref CHAPTER_MAPPING: BTreeMap<&'static str, (&'static str, &'static str)> = [ - ("boiling_point", ("0600", "0603")), - ("cas_number", ("0100", "0100")), - ("h_p_signal_symbols", ("1100", "1303")), - ("lethal_dose", ("0500", "0501")), - ("mak1", ("1100", "1201")), - ("mak2", ("1100", "1203")), - ("melting_point", ("0600", "0602")), - ("molecular_formula", ("0400", "0400")), - ("water_hazard_class", ("1100", "1106")), - ] - .iter() - .cloned() - .collect(); -} - -pub fn parse_response(json: &GestisResponse) -> Result { - log::info!("extracting data for: {} [{}] ...", json.name, json.zvg_number); - - let h_p_signal_symbols_error; - let (h_phrases, p_phrases, signal_word, symbols) = match get_h_p_signal_symbols(json) { - Ok(inner) => { - h_p_signal_symbols_error = None; - inner - } - Err(e) => { - h_p_signal_symbols_error = Some(e); - ( - // this error type should not be used like this but here it is - // only a sentinel value that is ignored further down anyways - Err(SearchError::Empty), - Err(SearchError::Empty), - Err(SearchError::Empty), - Err(SearchError::Empty), - ) - } - }; - - let molecular_formula_molar_mass_error; - let (molecular_formula, molar_mass) = match get_molecular_formula_molar_mass(json) { - Ok(inner) => { - molecular_formula_molar_mass_error = None; - inner - } - Err(e) => { - molecular_formula_molar_mass_error = Some(e); - ( - // this error type should not be used like this but here it is - // only a sentinel value that is ignored further down anyways - Err(SearchError::Empty), - Err(SearchError::Empty), - ) - } - }; - - Ok(ParsedData { - cas: match get_cas(json) { - Ok(inner) => Some(inner), - Err(e) => { - let e = match &molecular_formula_molar_mass_error { - Some(e_new) => e_new, - None => &e, - }; - log::debug!("[cas_number] error: {:#?}", e); - None - } - }, - molecular_formula: match molecular_formula { - Ok(inner) => Some(inner), - Err(e) => { - let e = match &molecular_formula_molar_mass_error { - Some(e_new) => e_new, - None => &e, - }; - log::debug!("[molecular_formula] error: {:#?}", e); - None - } - }, - molar_mass: match molar_mass { - Ok(inner) => Some(inner), - Err(e) => { - let e = match &molecular_formula_molar_mass_error { - Some(e_new) => e_new, - None => &e, - }; - log::debug!("[molar_mass] error: {:#?}", e); - None - } - }, - melting_point: match get_melting_point(json) { - Ok(inner) => Some(inner), - Err(e) => { - log::debug!("[melting_point] error: {:#?}", e); - None - } - }, - boiling_point: match get_boiling_point(json) { - Ok(inner) => Some(inner), - Err(e) => { - log::debug!("[boiling_point] error: {:#?}", e); - None - } - }, - water_hazard_class: match get_whc(json) { - Ok(inner) => Some(inner), - Err(e) => { - log::debug!("[water_hazard_class] error: {:#?}", e); - None - } - }, - h_phrases: match h_phrases { - Ok(inner) => Some(inner), - Err(e) => { - let e = match &h_p_signal_symbols_error { - Some(e_new) => e_new, - None => &e, - }; - log::debug!("[h_phrases] error: {:#?}", e); - None - } - }, - p_phrases: match p_phrases { - Ok(inner) => Some(inner), - Err(e) => { - let e = match &h_p_signal_symbols_error { - Some(e_new) => e_new, - None => &e, - }; - log::debug!("[p_phrases] error: {:#?}", e); - None - } - }, - signal_word: match signal_word { - Ok(inner) => Some(inner), - Err(e) => { - let e = match &h_p_signal_symbols_error { - Some(e_new) => e_new, - None => &e, - }; - log::debug!("[signal_word] error: {:#?}", e); - None - } - }, - symbols: match symbols { - Ok(inner) => Some(inner), - Err(e) => { - let e = match &h_p_signal_symbols_error { - Some(e_new) => e_new, - None => &e, - }; - log::debug!("[symbols] error: {:#?}", e); - None - } - }, - lethal_dose: match get_lethal_dose(json) { - Ok(inner) => inner, - Err(e) => { - log::debug!("[lethal_dose] error: {:#?}", e); - match e { - SearchError::Multiple(inner) => Some(inner), - _ => None, - } - } - }, - mak: match get_mak(json) { - Ok(inner) => Some(inner), - Err(e) => { - log::debug!("[mak] error: {:#?}", e); - None - } - }, - }) -} - -/* #region helpers */ - -pub fn get_xml(json: &GestisResponse, chapter: &str, subchapter: &str) -> Result { - if let Some(subchapters) = json.chapters.iter().find(|c| c.number == chapter) { - if let Some(sub) = subchapters.subchapters.iter().find(|s| s.number == subchapter) { - return Ok(format!("
      \n{}
      \n", sub.text.as_ref().unwrap())); - } - } - Err(SearchError::NoXML) -} - -#[inline] -fn tables(node: &Node, class: &str) -> Vec>> { - node - .children() - .filter(|n| { - n.has_tag_name("table") - // && n.has_attribute("class") - && n.attribute_node("class").unwrap().value() == class - }) - .map(|n| { - n.children() - .filter(|c| c.has_tag_name("tr")) - .map(|n| n.children().filter(|n| n.has_tag_name("td")).map(|n| n.id()).collect()) - .collect() - }) - .collect() -} - -/* #endregion */ - -/* #region extractors */ - -fn get_cas(json: &GestisResponse) -> Result { - let (chapter, subchapter) = CHAPTER_MAPPING.get("cas_number").unwrap(); - let xml = get_xml(json, chapter, subchapter)?; - let doc = Document::parse(&xml)?; - - for table in tables(&doc.root().first_child().unwrap(), "block") - .into_iter() - // each table has only one row ¯\_(ツ)_/¯ - .flatten() - { - if table.len() < 2 { - continue; - } - let data = doc.get_node(table[1]).unwrap(); - if let Some(cas) = data.first_element_child() { - if cas.has_tag_name("casnr") { - return Ok(cas.text().unwrap().into()); - } - } - } - - Err(SearchError::MissingInfo("cas number".into())) -} - -fn get_molecular_formula_molar_mass(json: &GestisResponse) -> Result<(Result, Result)> { - let (chapter, subchapter) = CHAPTER_MAPPING.get("molecular_formula").unwrap(); - let xml = get_xml(json, chapter, subchapter)?; - let doc = Document::parse(&xml)?; - - let mut id_tables = tables(&doc.root().first_child().unwrap(), "block") - // tables - .into_iter() - // rows - .flatten() - // ids - .flatten(); - - let mut data; - - // kill empty tables at beginning - loop { - let data_id = id_tables.next().unwrap(); - data = doc.get_node(data_id).unwrap(); - if data.children().count() > 0 { - break; - } - } - - let mut molecular_formula = Err(SearchError::MissingInfo("molecular formula".into())); - if let Some(mf) = data.children().find(|c| c.has_tag_name("summenformel")) { - molecular_formula = Ok(mf.first_child().unwrap().text().unwrap().into()); - } - - let mut molar_mass = Err(SearchError::MissingInfo("molar mass".into())); - if let Some(new_table_id) = id_tables.nth(2) { - let mut new_table = tables(&doc.get_node(new_table_id).unwrap(), "feldmitlabel") - .into_iter() - .flatten() - .flatten(); - if let Some(text) = doc.get_node(new_table.nth(1).unwrap()).unwrap().text() { - molar_mass = Ok(text.trim().into()) - } - } - - Ok((molecular_formula, molar_mass)) -} - -fn get_melting_point(json: &GestisResponse) -> Result { - get_mp_bp(json, "melting_point", "Schmelzpunkt:") -} - -fn get_boiling_point(json: &GestisResponse) -> Result { - get_mp_bp(json, "boiling_point", "Siedepunkt:") -} - -/// returns melting point or boiling point -fn get_mp_bp(json: &GestisResponse, name: &str, xml_check: &str) -> Result { - let (chapter, subchapter) = CHAPTER_MAPPING.get(name).unwrap(); - let xml = get_xml(json, chapter, subchapter)?; - let doc = Document::parse(&xml)?; - - let mut mp_bp_point = None; - - for data_id in tables(&doc.root().first_child().unwrap(), "block") - // tables - .into_iter() - // rows - .flatten() - // ids - .flatten() - { - let data = doc.get_node(data_id).unwrap(); - let tables = tables(&data, "feldmitlabel"); - if tables.is_empty() { - continue; - } - let mut inner_data_ids = tables - // tables - .into_iter() - // rows - .flatten() - // ids - .flatten(); - - let mp_bp_text_node = doc.get_node(inner_data_ids.next().unwrap()).unwrap(); - if let Some(mp_bp_text) = mp_bp_text_node.text() { - if mp_bp_text == xml_check { - let mp_bp_node = doc.get_node(inner_data_ids.next().unwrap()).unwrap(); - mp_bp_point = mp_bp_node.text(); - } - } - } - - match mp_bp_point { - Some(mp) => Ok(mp.trim().into()), - None => Err(SearchError::MissingInfo(name.into())), - } -} - -fn get_whc(json: &GestisResponse) -> Result { - static KEYWORD: &str = "Nicht wassergefährdender Stoff"; - - let (chapter, subchapter) = CHAPTER_MAPPING.get("water_hazard_class").unwrap(); - let xml = get_xml(json, chapter, subchapter)?; - let doc = Document::parse(&xml)?; - - let mut tables = tables(&doc.root().first_child().unwrap(), "block") - // tables - .into_iter() - // rows - .flatten() - // ids - .flatten(); - - let mut data; - - // kill empty tables at beginning - loop { - let data_id = tables.next().unwrap(); - data = doc.get_node(data_id).unwrap(); - if data.children().count() > 0 { - break; - } - } - - if let Some(node_id) = tables.next() { - data = doc.get_node(node_id).unwrap(); - let text = data.text().unwrap(); - if text == KEYWORD { - return Err(SearchError::Empty); - } else { - return Ok(text.split('-').next().unwrap().trim().into()); - } - } - - Err(SearchError::MissingInfo("water hazard class".into())) -} - -type HPSignalSymbolsResult = Result<( - Result>, - Result>, - Result, - Result>, -)>; - -fn get_h_p_signal_symbols(json: &GestisResponse) -> HPSignalSymbolsResult { - #[inline] - fn extract_h_p(id: NodeId, doc: &Document) -> Vec<(String, String)> { - let data = doc.get_node(id).unwrap(); - data - .children() - .filter(|n| n.is_text()) - .map(|n| n.text().unwrap()) - .map(|s| s.splitn(2, ':').map(|s| s.trim()).collect::>()) - // TODO remove lines that are no h/p-phrases - .filter(|v| v.len() > 1) // TODO quickfix, remove - .map(|v| (v[0].into(), v[1].into())) - .collect() - } - - let (chapter, subchapter) = CHAPTER_MAPPING.get("h_p_signal_symbols").unwrap(); - let xml = get_xml(json, chapter, subchapter)?; - let doc = Document::parse(&xml)?; - - let mut h_phrases = Err(SearchError::MissingInfo("h phrases".into())); - let mut p_phrases = Err(SearchError::MissingInfo("p phrases".into())); - let mut signal_word = Err(SearchError::MissingInfo("signal word".into())); - let mut symbols = Err(SearchError::MissingInfo("symbols".into())); - - for table in tables(&doc.root().first_child().unwrap(), "block").into_iter() { - let mut row_iter = table.into_iter(); - - if let Some(row) = row_iter.next() { - let mut data_iter = row.into_iter().map(|id| doc.get_node(id).unwrap()).peekable(); - - if let Some(data) = data_iter.peek() { - if let Some(inner) = data.first_element_child() { - if inner.has_tag_name("b") { - if inner.text() == Some("Gefahrenhinweise - H-Sätze:") { - if let Some(row) = row_iter.next() { - h_phrases = Ok(extract_h_p(row[0], &doc)); - } - } else if inner.text() == Some("Sicherheitshinweise - P-Sätze:") { - if let Some(row) = row_iter.next() { - p_phrases = Ok(extract_h_p(row[0], &doc)); - } - } - } else if inner.has_tag_name("img") { - symbols = Ok( - data_iter - .map(|n| n.first_element_child()) - .filter(|n| n.is_some()) - .map(|n| { - let data = n.unwrap(); - // only alt text is needed as identifier - data.attribute("alt").unwrap().trim_end_matches("-neu").into() - }) - .collect::>(), - ); - } else if inner.has_tag_name("table") { - let mut table_iter = tables(data, "feldmitlabel") - .into_iter() - .flatten() - .flatten() - .map(|id| doc.get_node(id).unwrap()); - if let Some(data) = table_iter.next() { - if let Some(inner) = data.first_element_child() { - if inner.has_tag_name("b") && inner.text() == Some("Signalwort:") { - signal_word = Ok(table_iter.next().unwrap().text().unwrap().trim_matches('"').to_string()); - } - } - } - } - } - } - } - } - - Ok((h_phrases, p_phrases, signal_word, symbols)) -} - -fn get_lethal_dose(json: &GestisResponse) -> Result> { - let (chapter, subchapter) = CHAPTER_MAPPING.get("lethal_dose").unwrap(); - let xml = get_xml(json, chapter, subchapter)?; - let doc = Document::parse(&xml)?; - - let mut ld50: Option<&str> = None; - - let mut table_iter = tables(&doc.root().first_child().unwrap(), "block").into_iter(); - - while let Some(table) = table_iter.next() { - let mut row_iter = table.into_iter(); - - if let Some(row) = row_iter.next() { - let mut data_iter = row.into_iter().map(|id| doc.get_node(id).unwrap()).peekable(); - - if let Some(data) = data_iter.peek() { - if let Some(inner) = data.first_element_child() { - if inner.has_tag_name("b") && inner.text() == Some("LD50 oral Ratte") { - if let Some(inner) = ld50 { - return Err(SearchError::Multiple(inner.into())); - } else if let Some(table) = table_iter.next() { - let mut row_iter = table.into_iter(); - - if let Some(row) = row_iter.next() { - let mut data_iter = row.into_iter().map(|id| doc.get_node(id).unwrap()); - - if let Some(data) = data_iter.next() { - if let Some(text) = data.first_child() { - if text.text() == Some("Wert:") { - if let Some(value) = data_iter.next() { - ld50 = value.text(); - } - } - } - } - } - } - } - } - } - } - } - - match ld50 { - Some(inner) => Ok(Some(inner.into())), - None => Err(SearchError::MissingInfo("lethal dose".into())), - } -} - -fn get_mak(_json: &GestisResponse) -> Result { - // TODO implement function - log::error!("not implemented: 'get_mak()'"); - Err(SearchError::MissingInfo("mak".into())) -} - -/* #endregion */ - -#[cfg(test)] -mod tests { - use std::{fs::File, io::BufReader}; - - use crate::gestis::types::GestisResponse; - - use super::parse_response; - - fn load_substance_json(path: &str) -> GestisResponse { - let file = File::open(path).unwrap(); - let reader = BufReader::new(file); - serde_json::from_reader(reader).unwrap() - } - - #[test] - fn test_parsing_cobaltdinitrat() { - parse_response(&load_substance_json("tests/assets/cobaltdinitrat.json")).unwrap(); - } - - #[test] - fn test_parsing_calcium() { - parse_response(&load_substance_json("tests/assets/calcium.json")).unwrap(); - } -} diff --git a/src-tauri/cabr2_search/src/handler.rs b/src-tauri/cabr2_search/src/handler.rs deleted file mode 100644 index 6157de7ab..000000000 --- a/src-tauri/cabr2_search/src/handler.rs +++ /dev/null @@ -1,166 +0,0 @@ -use std::{borrow::Borrow, collections::HashMap}; - -use cabr2_types::SubstanceData; -use cfg_if::cfg_if; -use lazy_static::lazy_static; - -use crate::{ - error::{Result, SearchError}, - types::{Provider, ProviderInfo, SearchArguments, SearchResponse, SearchType}, -}; - -// because tokio doesn't fully support wasm we have to use two different implementations for these locks -cfg_if! { - if #[cfg(feature = "wasm")] { - use std::sync::RwLock; - } else { - use tokio::sync::RwLock; - } -} - -lazy_static! { - pub static ref REGISTERED_PROVIDERS: RwLock>> = - RwLock::new(HashMap::new()); -} - -#[cfg(all(feature = "gestis", not(feature = "wasm")))] -const USER_AGENT: &str = concat!("cabr2/v", env!("CARGO_PKG_VERSION")); - -pub async fn init_providers() -> Result<()> { - log::trace!("initializing providers"); - // let mut _providers; - cfg_if! { - if #[cfg(feature = "wasm")] { - let mut _providers = REGISTERED_PROVIDERS.write().expect("failed to get write lock"); - } else { - let mut _providers = REGISTERED_PROVIDERS.write().await; - } - } - - #[cfg(feature = "gestis")] - { - cfg_if! { - if #[cfg(feature = "wasm")] { - let agent = reqwest::ClientBuilder::new().build()?; - } else { - let agent = reqwest::ClientBuilder::new().user_agent(USER_AGENT).build()?; - } - } - - _providers.insert("gestis", Box::new(crate::gestis::Gestis::new(agent))); - } - - log::trace!("dropping provider lock..."); - Ok(()) -} - -pub async fn get_provider_mapping() -> HashMap { - cfg_if! { - if #[cfg(feature = "wasm")] { - let providers = REGISTERED_PROVIDERS.read().expect("failed to get read lock"); - } else { - let providers = REGISTERED_PROVIDERS.read().await; - } - } - - let mut mapping = HashMap::new(); - for (id, provider) in providers.iter() { - mapping.insert(id.to_string(), provider.get_name()); - } - - mapping -} - -pub async fn get_available_providers() -> Vec { - cfg_if! { - if #[cfg(feature = "wasm")] { - let providers = REGISTERED_PROVIDERS.read().expect("failed to get read lock"); - } else { - let providers = REGISTERED_PROVIDERS.read().await; - } - } - - let mut providers: Vec = providers - .iter() - .map(|(key, provider)| ProviderInfo { - name: provider.get_name(), - identifier: key.to_string(), - }) - .collect(); - - providers.push(ProviderInfo { - identifier: "custom".into(), - name: "Custom".into(), - }); - - providers -} - -pub async fn get_quick_search_suggestions( - provider: String, - search_type: SearchType, - pattern: String, -) -> Result> { - if pattern.len() < 2 { - return Ok(vec![]); - } - - cfg_if! { - if #[cfg(feature = "wasm")] { - let providers = REGISTERED_PROVIDERS.read().expect("failed to get read lock"); - } else { - let providers = REGISTERED_PROVIDERS.read().await; - } - } - - if let Some(provider) = providers.get(&provider.borrow()) { - return provider.get_quick_search_suggestions(search_type, pattern).await; - } - - Err(SearchError::UnknownProvider(provider)) -} - -pub async fn get_search_results(provider: String, arguments: SearchArguments) -> Result> { - let arguments = SearchArguments { - arguments: arguments - .arguments - .into_iter() - .filter(|a| !a.pattern.is_empty()) - .collect(), - ..arguments - }; - - if arguments.arguments.is_empty() { - return Ok(vec![]); - } - - cfg_if! { - if #[cfg(feature = "wasm")] { - let providers = REGISTERED_PROVIDERS.read().expect("failed to get read lock"); - } else { - let providers = REGISTERED_PROVIDERS.read().await; - } - } - - if let Some(provider) = providers.get(&provider.borrow()) { - return provider.get_search_results(arguments).await; - } - - Err(SearchError::UnknownProvider(provider)) -} - -pub async fn get_substance_data(provider: String, identifier: String) -> Result { - cfg_if! { - if #[cfg(feature = "wasm")] { - let providers = REGISTERED_PROVIDERS.read().expect("failed to get read lock"); - } else { - let providers = REGISTERED_PROVIDERS.read().await; - } - } - - if let Some(provider) = providers.get(&provider.borrow()) { - return provider.get_substance_data(identifier).await; - } - - Err(SearchError::UnknownProvider(provider)) -} diff --git a/src-tauri/cabr2_search/tests/assets/cobaltdinitrat.json b/src-tauri/cabr2_search/tests/assets/cobaltdinitrat.json deleted file mode 100644 index f3b83b2b4..000000000 --- a/src-tauri/cabr2_search/tests/assets/cobaltdinitrat.json +++ /dev/null @@ -1 +0,0 @@ -{"zvgnummer": "5340", "zvgnummer_mit_null": "005340", "name": "Cobalt(II)-nitrat", "sortiername": "Cobaltnitrat", "aliases": [{"name": "Kobalt(II)-nitrat", "sortiername": "Kobaltnitrat"}, {"name": "Cobaltdinitrat", "sortiername": "Cobaltdinitrat"}], "hauptkapitel": [{"drnr": "1300", "ueberschrift": null, "unterkapitel": [{"drnr": "1303", "text": null}], "tables": "\n \n \n \n \n \n
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \"ghs03\"\n \n \"ghs08\"\n \n \"ghs05\"\n \n \"ghs07\"\n \n \"ghs09\"\n
      \n \n \n \n \n \n \n
      \n
      \n \n \n \n \n
      \n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-Chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin und Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
      \n "}, {"drnr": "0100", "ueberschrift": "IDENTIFIKATION\n ", "unterkapitel": [{"drnr": "0100", "text": "\n \n \n \n \n \n
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n Cobalt(II)-nitrat\n
      \n Kobalt(II)-nitrat\n
      \n Cobaltdinitrat\n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      ZVG Nr:\n 5340\n
      \n \n \n \n \n \n \n \n \n \n \n \n
      CAS Nr:\n 10141-05-6\n wasserfrei
      \n \n \n \n \n \n \n \n \n \n \n
      EG Nr:\n 233-402-1\n \n
      \n \n \n \n \n \n \n \n \n \n
      INDEX Nr:\n 027-009-00-2\n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Verwandte
      \n \n \n \n \n \n \n \n \n \n \n \n
      CAS Nr:10026-22-9Hexahydrat
      \n \n \n \n \n \n \n
      \n
      \n \n \n \n \n \n \n
      \n
      \n "}], "links": null}, {"drnr": "0300", "ueberschrift": "CHARAKTERISIERUNG\n ", "unterkapitel": [{"drnr": "0301", "text": "\n STOFFGRUPPENSCHLÜSSEL\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      128500
      137200
      Nitrate
      Cobaltverbindungen
      \n "}, {"drnr": "0303", "text": "\n AGGREGATZUSTAND\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n FeststoffDer Stoff ist fest.
      \n "}, {"drnr": "0304", "text": "\n EIGENSCHAFTEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      kristallin
      rotbraun
      \n
      \n "}, {"drnr": "0305", "text": "\n CHEMISCHE CHARAKTERISIERUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Oxidierender Feststoff.
      Stoff selbst brennt nicht, erhöht jedoch die Feuergefahr bei Berührung mit brennbaren Stoffen und kann einen bestehenden Brand erheblich fördern.
      Sehr leicht löslich in Wasser.
      Hygroskopisch.
      Von dem Stoff gehen akute oder chronische Gesundheitsgefahren aus.
      Der Stoff ist gewässergefährdend.
      (s. Kapitel VORSCHRIFTEN).
      \n "}, {"drnr": "0307", "text": "\n \n \n \n \n \n
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n Stoffinformationen in Wikipedia\n
      \n
      \n "}], "links": null}, {"drnr": "0400", "ueberschrift": "FORMEL\n ", "unterkapitel": [{"drnr": "0400", "text": "\n \n \n \n \n \n
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n Co(NO3)2
      CoN2O6
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Co(NO3)2
      CoN2O6
      \n \"005340\"\n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      Molmasse: 182,95 g/mol
      \n
      \n "}], "links": null}, {"drnr": "0600", "ueberschrift": "PHYSIKALISCH CHEMISCHE EIGENSCHAFTEN\n ", "unterkapitel": [{"drnr": "0602", "text": "\n SCHMELZPUNKT\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Der Stoff zersetzt sich beim Erhitzen (s. Zersetzungstemperatur).
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 99999 
      \n "}, {"drnr": "0604", "text": "\n DICHTE\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      DICHTE
      \n \n \n \n \n \n \n \n \n \n
      Wert: 2,49 g/cm³
      \n
      wasserfrei
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 00131 
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      DICHTE
      \n \n \n \n \n \n \n \n \n \n
      Wert: 1,88 g/cm³
      \n
      Hexahydrat
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 00131 
      \n "}, {"drnr": "0613", "text": "\n WASSERLÖSLICHKEIT\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      Löslichkeit: 1330 g/l
      \n
      \n \n \n \n \n \n \n \n \n \n
      Temperatur: 0 °C
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 01211 
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      Löslichkeit: 2170 g/l
      \n
      \n \n \n \n \n \n \n \n \n \n
      Temperatur: 100 °C
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 01211 
      \n "}, {"drnr": "0614", "text": "\n pH-WERT\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      pH-Wert:ca. 4,0
      \n
      \n \n \n \n \n \n \n \n \n \n
      Temperatur: 20 °C
      \n
      \n \n \n \n \n \n \n \n \n \n
      Konzentration: 100 g/l
      \n
      Hexahydrat
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 01211 
      \n "}, {"drnr": "0619", "text": "\n GEFÄHRLICHES REAKTIONSVERHALTEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      Zersetzungstemperatur: 100 ...  105 °C
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Thermische Zersetzung:
      Kristallwasserabspaltung des Hexahydrats
      bei ca. 55 Grad C.
      Bei Temperaturen > 74 Grad C färbt sich die rote
      wässrige Lösung durch Oxidbildung grün.
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Gefährliche chemische Reaktionen:
       
      Explosionsgefahr bei Kontakt mit:
      oxidierbaren Stoffen
      Ammoniumhexacyanoferrat(II)/Hitze
      Kohle
       
      Der Stoff kann in gefährlicher Weise reagieren mit:
      Hitze
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 00131 06002 
      \n "}], "links": "\n \n \n \n
      \n \n Schmelzpunkt\n | \n Dichte\n | \n Löslichkeit\n | \n pH - Wert\n | \n Gefährliche Reaktionen\n \n
      \n "}, {"drnr": "0500", "ueberschrift": "TOXIKOLOGIE / ÖKOTOXIKOLOGIE\n ", "unterkapitel": [{"drnr": "0501", "text": "\n TOXIKOLOGISCHE DATEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      LD50 oral Ratte
      \n \n \n \n \n \n \n \n \n \n
      Wert: 691 mg/kg
      \n \n \n \n \n \n \n \n
      Food and Chemical Toxicology. Vol. 20, Pg. 311, 1982.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Cobaltnitrat, Hexahydrat
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 02071 
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      LD50 oral Ratte
      \n \n \n \n \n \n \n \n \n \n
      Wert: 434 mg/kg
      \n \n \n \n \n \n \n \n
      Food and Chemical Toxicology. Vol. 20, Pg. 311, 1982.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Cobaltnitrat, wasserfrei
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 02071 
      \n "}, {"drnr": "0502", "text": "\n ÖKOTOXIKOLOGISCHE DATEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      LC50 Fisch (96 Stunden)
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      Minimalwert: 66,8 mg/l
      Maximalwert: 82,7 mg/l
      Medianwert: 74,8 mg/l
      \n \n \n \n \n \n \n \n \n \n
      Studienanzahl:2
      \n \n \n \n \n \n \n \n
      Referenz für Medianwert:
      \n \n \n \n \n \n \n \n
      Ding, S.R. 1980. Acute Toxicities of Vanadium, Nickel and Cobalt to Several Species of Aquatic Organisms. Environ.Qual. 1:17-21 (CHI) (ENG ABS)
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      LC50 Krustentiere (48 Stunden)
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      Minimalwert: 3,4 mg/l
      Maximalwert: 17,2 mg/l
      Medianwert: 10,3 mg/l
      \n \n \n \n \n \n \n \n \n \n
      Studienanzahl:2
      \n \n \n \n \n \n \n \n
      Referenz für Medianwert:
      \n \n \n \n \n \n \n \n
      Ding, S.R. 1980. Acute Toxicities of Vanadium, Nickel and Cobalt to Several Species of Aquatic Organisms. Environ.Qual. 1:17-21 (CHI) (ENG ABS); Kissa, E., M. Moraitou-Apostolopoulou, and V. Kiortsis 1984. Effects of Four Heavy Metals on Survival and Hatching Rate of Artemia salina (L.). Arch.Hydrobiol. 102(2):255-264
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Cobaltnitrat, wasserfrei
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 02072 
      \n "}], "links": null}, {"drnr": "0700", "ueberschrift": "ARBEITSMEDIZIN UND ERSTE HILFE\n ", "unterkapitel": [{"drnr": "0701", "text": "\n AUFNAHMEWEGE\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Hauptaufnahmewege:
      Am Arbeitsplatz wird Cobalt(II)-nitrat (Co-nitrat) bevorzugt über den Atemtrakt aufgenommen.[07619]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Atemwege:
      Zum Resorptionsverhalten inhalierter löslicher Co-Salze liegen Hinweise aus Arbeitsplatzstudien vor. Beruflich Exponierte wiesen deutlich erhöhte Co-Gehalte im Harn auf, wobei die maximale Ausscheidung am Ende des Arbeitstages erreicht wurde und mit der Expositionskonzentration gut korrelierte.[99996]
      Diese Befunde lassen darauf schließen, daß zumindest ein großer Teil der inhalierten Co-Dosis rasch resorbiert wird.[99999]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Haut:
      Kinetische Studien für löslich Co-Salze liegen nicht vor.[99983]
      Da für metallisches Co eine Hautpenetrationsfähigkeit nachgewiesen wurde, sollte eine solche prinzipiell auch für gut lösliche Co-Salze vorausgesetzt werden.[99999]
      Im Vergleich zur inhalativen Aufnahme wird der Hautaufnahme aber allgemein eine untergeordnete Bedeutung zugemessen.[99996]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Verdauungstrakt:
      Bei Staubexposition ist eine anteilige Überführung in den Verdauungstrakt infolge mukoziliarer Atemwegsclearance oder durch evtl. direkte orale Aufnahme zu berücksichtigen.
      Das Ausmaß der Resorption von Co-Salzen ist von der Dosis, der Nahrungsaufnahme, dem Füllungszustand des Magens und dem Ernährungsstatus abhängig (bspw. bei Eisenmangel erhöht).
      Für das Co-chlorid wurden bei Verabreichung an Testpersonen Resorptionsraten im Bereich von 5 - 45 % bestimmt.[99996]
      \n "}, {"drnr": "0702", "text": "\n WIRKUNGSWEISEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Hauptwirkungsweisen:
      akut:
      sensibilisierende Wirkung auf Haut und Atemwege,[07619]
      schleimhautreizendes Potential[00450]
      chronisch:
      allergische oder irritativ bedingte Atemwegsreaktionen, Lungenschädigung (Fibrose), allergische Hauterkrankungen;[99996]
      im hohen Dosisbereich Herzschädigung, Beeinflussung von Blutbildung und Schilddrüsenfunktion[99983]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Akute Toxizität:
      Zur akuten Toxizität von Co-nitrat liegen nur wenige Hinweise vor.[99983]
      Nach beruflicher Erfahrung wirkt Co-nitrat zumindest bei wiederholter Einwirkung augenreizend (vgl. \"Chronische Toxizität\").[00450]
      Ergebnisse tierexperimenteller Prüfungen zur Stärke der augenreizenden Wirkung liegen nicht vor.
      Bezüglich einer Reizwirkung an der Haut finden sich keine Erfahrungsberichte oder Tierversuchsergebnisse.[99983]
      Eine hautsensibilisierende Wirkung von Co-Salzen ist sowohl durch Tierversuche als auch durch Testungen an Hautpatienten eindeutig belegt. Die Sensibilisierung setzt wahrscheinlich einen längeren Kontakt voraus (vgl. \"Chronische Toxizität\").[07890]
      Ist sie erfolgt, können bei erneutem Kontakt jedoch schon geringe Dosen allergische Hautreaktionen auslösen. Co-Salze wirken nachweislich auch als Atemwegsallergene. In inhalativen Provokationstests zeigten sensibilisierte Personen sowohl bronchiale Sofortreaktionen als auch isolierte Spätreaktionen oder duale Reaktionen.[07619]
      Allgemein wurde auch auf mögliche irritative Wirkungen der Co-Salze im Atemtrakt hingewiesen. Im Versuch an Nagern wirkten lösliche Co-Salze bei direkter Applikation in die Luftröhre als akute Lungenreizstoffe.[00450]
      Akute Inhalationstests speziell für Co-nitrat fehlen.[99983]
      Co-sulfat löste in einem subakuten Test (Konzentrationen von 5 - 50 mg/m3) an Ratten Entzündungen in Rachen und Luftröhre bzw. von Nase und Bronchien sowie Todesfälle aus.[99996]
      Bei oraler Applikation von Co-Salzen an Versuchstiere wurde eine sofortige Erweiterung der Hautgefäße (über ca. 1 h), teils mit Blutdruckabfall, beobachtet. Weitere Vergiftungssymptome waren: Diarrhoe, reduzierte Nahrungsaufnahme, Lähmung der hinteren Extremitäten, Nierenfunktionsstörungen.[00450]
      Ähnliche Symptome wurden nach Aufnahme von 500 mg Co-chlorid beim Menschen beobachtet: Hitzegefühl, Erbrechen, Diarrhoe und leichter Kollaps.[07606]
      Die für Co-nitrat in Tierversuchen ermittelten oralen Toxizitätswerte (LD50, Ratte: 430 mg/kg KG; LDLo, Kaninchen: 250 mg/kg KG) lagen in der gleichen Größenordnung wie die für Co-chlorid und Co-sulfat ermittelten Werte.[00438]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Chronische Toxizität:
      Bei Exposition gegenüber Co-Salzen werden Haut und Atemwege als die wesentlichen Zielorgane der Co-Wirkung angesehen.
      Bei längerem Umgang mit verschiedenen löslichen Co-Salze sind häufig allergische Hauterkrankungen beobachtet worden.[99996]
      Auch für Co-nitrat liegen einzelne Fallberichte vor.[07890]
      Typische Befunde bei Co-Allergien sind Hautekzeme an den Kontaktstellen (meist den Händen); in Einzelfällen sollen auch Urtikaria und photoallergische Ekzeme aufgetreten sein.[99983]
      Allgemein sind Co-Hautallergien meist von einer Allergie gegenüber anderen Metallen (meist Nickel/Chrom) begleitet.[07619]
      In der Literatur finden sich unterschiedliche Auffassungen, ob dieser Befund als Kreuzallergie, Folge einer kombinierten Exposition oder Vorschädigung der Haut aufzufassen ist.[99983]
      Im Zusammenhang mit inhalativen Expositionen gegenüber löslichen Co-Verbindungen ist über allergisches Asthma (deutlich erhöhtes Risiko bereits bei 0,1 mg Co/m3) sowie obstruktive Atemwegserkrankungen (chronische Bronchitis, herabgesetzte Atemkapazität) berichtet worden.[07748]
      Dieses Wirkpotential ist auch Co-nitrat zu unterstellen, es liegen hierzu aber keine substanzspezifischen Daten vor.[99983]
      Beschäftigte, die bei der Verarbeitung von Co-nitrat Raumluftkonzentrationen von 79 mg Co/m3 ausgesetzt waren, zeigten Entzündungen der Augenbindehäute und Reizungen im oberen Atemtrakt (keine näheren Angaben verfügbar).[00450]
      Die schwerwiegendsten Co-bedingten Atemwegsschädigungen betreffen Veränderungen im Lungenparenchym und wurden vor allem bei Exposition gegenüber Hartmetall-Staub gefunden.[07748]
      Diese als \"hard metal disease\" oder Hartmetall-Lunge\" bezeichnete Erkrankung umfaßt entzündliche Veränderungen (subakute bis chronische Alveolitis) bis hin zur unspezifischen Lungenfibrose mit Minderung der Dehnbarkeit und Elastizität der Lunge, Einschränkung der Lungenfunktion (restriktives Syndrom) und resultierender Herzschädigung. Schwere, teils tödliche Krankheitsverläufe sind auch nach Exposition gegenüber Cobalt-Kontaktmasse, die Co-carbonat (zu ca. 25 %) enthielt, beobachtet worden.[99996]
      Prinzipiell wird allen Co-Verbindungen unterstellt, daß sie diese Lungenerkrankung auslösen können. Bei der Ausbildung der Erkrankung scheinen aber Zusatznoxen und individuelle Empfindlichkeit wesentliche Einflußfaktoren zu sein.
      Systemische Co-Wirkungen sind vor allem außerberuflich, bei oraler Aufnahme/Injektion von Co-Salzen, beobachtet worden.[99983]
      Zur Behandlung der perniziösen Anämie erhielten Patienten über Tage bis zu mehreren Monaten Co-chlorid in Dosen bis zu 3 mg Co/kg KG pro Tag (ca. 200 mg/Tag, zusätzlich Eisensalz) zur Stimulation der Erythropoese. Nebenwirkungen, die zum Teil direkt mit der resultierenden Polycythämie erklärt werden konnten, waren: Appetitsverlust, Übelkeit, Erbrechen, Diarrhoe, Schmerz hinter dem Brustbein, Hautröte, Hautausschlag, Ohrgeräusche und neurologisch bedingte Schwerhörigkeit; in einigen Fällen Parästhesien und weitere neurologische Störungen, auch Schädigung des Sehnervs.[07783]
      Zudem wurde Schilddrüsenunterfunktion (Struma) beobachtet. Eine herzschädigende Wirkung ist aus Vergiftungsfällen, die nach Genuß von Co-sulfat/Co-chlorid-haltigem Bier auftraten (schwere, oft tödliche Cardiomyopathien), bekannt geworden.[99996]
      Die aufgenommenen Dosen lagen bei 1,7 - 12 mg pro Tag.[07619]
      Da sie vergleichsweise niedrig waren, wird in diesen Fällen ein synergistischer Einfluß von Proteinmangel und der Alkoholaufnahme für wahrscheinlich angesehen.[99996]
      Im Tierversuch war eine entsprechende kardiotoxische Wirkung auch bei Applikation von Co-nitrat nachweisbar.[07619]
      Bei beruflicher Co-Exposition ist nur in Einzelfällen über Herzmuskelschädigungen berichtet worden.[99996]
      Eine beruflich bedingte Beeinflussung der Schilddrüsenfunktion (erhöhtes Serumthyroxin und freies Thyroxin) fand man in einer neueren Studie an Beschäftigten, die gegenüber dem schwach löslichen Zink-Cobalt-silikat exponiert waren.[07866]
      Hinweise auf Blutbildveränderungen im Sinne einer Polycythämie nach beruflicher Exposition scheinen nicht hinreichend gesichert, zumindest werden solche Schädigungen nur bei sehr hohen Überexpositionen erwartet.[07748]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Reproduktionstoxizität, Mutagenität, Kanzerogenität:
      Zur Einstufung des fortpflanzungsgefährdenden, erbgutverändernden und krebserzeugenden Potentials s. Stoffliste nach Anhang VI der GHS-Verordnung / TRGS 905 / MAK-Liste (s. Kapitel VORSCHRIFTEN).
      Reproduktionstoxizität:
      Nach dem vorliegenden Informationsmaterial muss ein Risiko reproduktionstoxischer Wirkung vermutet werden. Zur Einstufung fruchtschädigend / fruchtbarkeitsgefährdend siehe Kapitel VORSCHRIFTEN.
      Co-chlorid, das als Modellsubstanz für lösliche Co-Verbindungen geprüft wurde, verursachte bei oraler Gabe an Nagern Effekte, die auf eine Beeinträchtigung der Fruchtbarkeit schließen lassen. Zur Einschätzung des entwicklungsschädigenden Potentials sind die verfügbaren Daten nicht hinreichend.[05323]
      Mutagenität:
      Eine Schädigung des genetischen Materials der Keimzelle wurde in geeigneten Untersuchungen nachgewiesen bzw. wahrscheinlich gemacht.
      [07619]
      Die aus In-vitro- und In-vivo-Versuchen vorliegenden Testergebnisse lassen allerdings auf eine nur schwache mutagene Wirkung der löslichen Co-Salze schließen, weshalb das Risiko für den Menschen noch nicht abschätzbar ist.[05323]
      Kanzerogenität:
      Für atembare Stäube/Aerosole:
      Aus dem vorliegenden Informationsmaterial wurde abgeleitet, dass der Stoff als kanzerogen für den Menschen angesehen werden sollte.
      In Inhalationsstudien mit Co-sulfat an Nagern wurde eine kanzerogene Wirkung nachgewiesen und in mechanistischen Untersuchungen das Co-Ion als wirksames Agens identifiziert.[07619]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Stoffwechsel und Ausscheidung:
      Co ist für den Menschen ein essentielles Spurenelement, das mit der Nahrung in täglichen Dosen zwischen 40 und 50 µg aufgenommen wird. Im Körper des Erwachsenen findet sich im Durchschnitt ca. 1 mg Co, wobei die größte Menge in Leber, Nieren, Herz und Muskel gespeichert ist.[07620]
      Tierexperimentelle Untersuchungen weisen darauf hin, daß auf oralem oder inhalativem Weg resorbiertes Co in analoger Weise im Körper verteilt und ausgeschieden wird.[00450]
      Die Elimination aus dem Organismus erfolgt hauptsächlich mit dem Urin, daneben mit den Faeces. In Schweiß, Muttermilch und Haaren finden sich nur sehr geringe Mengen. Mit dem Urin wird der überwiegende Teil innerhalb weniger Tage, ein geringer Teil langfristig (> 1 Jahr) eliminiert. Bei beruflich inhalativ gegenüber Co-Salzen exponierten Personen war ein enger Zusammenhang zwischen den Co-Gehalten in Blut/Urin und der Expositionshöhe nachweisbar. Diese Parameter sind zum Biomonitoring geeignet, lassen aber keine Abschätzung der gesundheitlichen Gefährdung zu.[99996]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Anmerkung:
      Die Bearbeitung dieser arbeitsmedizinischen Informationen erfolgte am 03.11.2003.
      Sie werden bei Bedarf angepasst.
      \n "}, {"drnr": "0703", "text": "\n ERSTE HILFE\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Augen:
      Auge unter Schutz des unverletzten Auges 10 Minuten unter fließendem Wasser bei weitgespreizten Lidern spülen.
      Für ärztliche Behandlung sorgen.
      [07750]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Haut:
      Benetzte Kleidung entfernen, dabei Selbstschutz beachten.
      Betroffene Hautpartien gründlich unter fließendem Wasser mit Seife reinigen.
      Bei Reizerscheinungen:
      Für ärztliche Behandlung sorgen.
      [07750, 99999]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Atmungsorgane:
      Verletzten unter Selbstschutz aus dem Gefahrenbereich an die frische Luft bringen.
      Verletzten ruhig lagern, vor Unterkühlung schützen.
      Für ärztliche Behandlung sorgen.
      Bei Anzeichen von Atemwegsreizungen oder Atemnot:
      Ehestmöglich ein Glucocorticoid-Dosieraerosol zur Inhalation wiederholt tief einatmen lassen.
      [07750, 08013]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Verschlucken:
      Mund ausspülen, Flüssigkeit wieder ausspucken.
      Sofort - bei erhaltenem Bewusstsein - 1 Glas Wasser (ca. 200 ml) trinken lassen.
      Bei spontanem Erbrechen Kopf des Betroffenen in Bauchlage tief halten, um Aspiration zu verhüten.
      Zwischenzeitlich Arzt zum Unfallort rufen.
      [08013, 99999]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Hinweise für den Arzt:
      Erfahrungen beim Menschen betreffen meist allergische Haut- und Atemwegsreaktionen und systemische Wirkungen bei längerer oraler/ i.v. Applikation löslicher Co-Salze.
      Auch unter Berücksichtigung von Tierversuchsdaten kann das akute Intoxikationsbild nur annähernd abgeschätzt werden.[99983]
      \n
      - Symptomatik der akuten Vergiftung:
      Augen: Reizwirkung (Konjunktivitis), evtl. Augenschädigung[00450]
      Haut: primäre Reizung eher gering/fehlend; allergische/photoallergische Reaktionen möglich (Urtikaria, Ekzem);[07890] bei massivem Kontakt evtl. systemische Wirkung[00438]
      Inhalation: konzentrationsabhängige Reizung der Atemwege, evtl. auch Lungenschädigung (Ödembildung, Pneumonie);[99996] bei sensibilisierten Personen bereits bei geringer Exposition asthmatische Sofort- und/oder Spätreaktionen;[07619] systemische Wirkung wenig wahrscheinlich[99996]
      Ingestion: lokale Reizungen; Erbrechen, Leibschmerzen, Diarrhoe; nach hohen Dosen Resorptivwirkung[00450]
      Resorption: vorwiegend zentralnervöse und vasoaktive Effekte (Lähmung der Gefäßmuskulatur), evtl. auch kardiale Wirkung, mit Symptomen wie flüchtiger Hautröte im Kopf-Hals-Bereich, Hyperthermie, Blutdrucksenkung, Dyspnoe, Tachykardie, evtl. Lähmungserscheinungen, Krämpfen; Spätschädigung der Herzmuskulatur nicht auszuschließen.[08013]
      \n
      - Hinweise zur Ersten ärztlichen Hilfe:
      Ins Auge gelangte Substanz durch anhaltende Spülung entfernen. Eine Nachkontrolle/Weiterbehandlung durch einen Augenarzt ist anzuraten.[07750]
      Kontaminierte Hautareale gründlich reinigen, insbesondere auf Wunden, Hautrisse und verdeckte Stellen achten. Eventuelle Hautreizungen können mit einem Dermatocorticoid behandelt werden.[99999]
      Nach massiver Inhalation zunächst Frischluftzufuhr und ruhige Lagerung des Betroffenen.[07750]
      Bei Reizerscheinungen oder Atemnot ist sofortige Applikation von Glucocorticoiden (inhalativ/i.v.) indiziert.[99999]
      Nach massiver Exposition sollten neben Glucocorticoid-Gabe erforderlichenfalls alle weiteren Maßnahmen der Lungenödemprophylaxe eingeleitet werden, später auch Pneumonieprophylaxe und längerfristige Nachbeobachtung.
      Nach Verschlucken wurden Flüssigkeits-Gabe, erforderlichenfalls Magenspülung bzw. gastroskopische Untersuchung empfohlen. Systemische Effekte ggf. symptomatisch behandeln.[08013]
      Zur Abklärung der Intoxikation stetsTransport zur Klinik.[99999]
      Empfohlen werden insbesondere Kontrolle von Wasser-/Elektrolythaushalt und Nierenfunktion sowie EKG-Überwachung.[08013]
      Zur Bindung/Austragung von Co sollen DMPS (in Einzelfällen) bzw. DMSA als Chelatbildner angewendet worden sein.[07906]
      Andere Autoren geben an, daß Antidote (wie DMPS, CaNa2-EDTA, Penicillamin oder Natrium- bzw. Calciumthiosulfat) klinisch nicht sicher wirksam sind.
      Im Hinblick auf eine evtl. Kardiomyopathie wird eine gründliche kardiologische Abschlußuntersuchung empfohlen.[08013]
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Empfehlungen:
      Stoff/Produkt und durchgeführte Maßnahmen dem Arzt angeben.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Anmerkung:
      Die Bearbeitung dieser Informationen zur Ersten Hilfe erfolgte am 03.11.2003.
      Sie werden bei Bedarf angepasst.
      \n "}, {"drnr": "1211", "text": "\n ARBEITSMEDIZINISCHE VORSORGE\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Angebotsvorsorge: Arbeitsmedizinische Vorsorge ist anzubieten, wenn bei Tätigkeiten mit dem Stoff eine wiederholte Exposition nicht ausgeschlossen werden kann.
      Nachgehende Vorsorge: Nach Beendigung von Tätigkeiten mit Exposition gegenüber diesem Stoff ist eine nachgehende Vorsorge anzubieten.
      \n \n \n \n \n \n \n \n
      \n
      Fristen: Angebotsvorsorge muss vor Aufnahme der Tätigkeiten angeboten werden. Fristen für die das Angebot von regelmäßiger arbeitsmedizinischer Vorsorge und nachgehender Vorsorge sind der arbeitsmedizinischen Regel „AMR Nummer 2.1“ zu entnehmen.
      \n "}], "links": "\n \n \n \n
      \n \n Aufnahmewege\n | \n Wirkungsweisen\n | \n Erste Hilfe\n | \n Arbeitsmedizinische Vorsorge\n \n
      \n "}, {"drnr": "0800", "ueberschrift": "SICHERER UMGANG\n ", "unterkapitel": [{"drnr": "0801", "text": "\n VORBEMERKUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Bei Tätigkeiten mit dem Stoff sind weitere Schutzmaßnahmen nach TRGS 561 “Tätigkeiten mit krebserzeugenden Metallen und ihren Verbindungen“ zu beachten.
      \n "}, {"drnr": "0802", "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – HANDHABUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Arbeitsraum - Ausstattung/Belüftung:
      Arbeitsbereiche sind möglichst räumlich abzutrennen.
      Sehr gute Be- und Entlüftung des Arbeitsraumes vorsehen.
      Eine Rückführung gereinigter Abluft in die Arbeitsräume sollte in der Regel nicht erfolgen. Abgesaugte Luft kann nur zurückgeführt werden, wenn sie durch anerkannte Verfahren ausreichend gereinigt wurde.
      Der Fußboden sollte keinen Bodenabfluss haben.
      Waschgelegenheit am Arbeitsplatz vorsehen.
      Beim Umgang mit größeren Mengen Notbrausen vorsehen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Apparaturen:
      Krebserzeugende und keimzellmutagene Stoffe nur in geschlossenen Apparaturen handhaben. Ist das Austreten nicht zu verhindern, ist eine Absaugung an der Austrittsstelle erforderlich.
      Emissionsgrenzwerte beachten, ggf. Abluftreinigung vorsehen.
      Behälter und Leitungen sind eindeutig zu kennzeichnen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Hinweise zum sicheren Umgang:
      Auf Sauberkeit und Trockenheit am Arbeitsplatz achten.
      An Arbeitsplätzen dürfen nur die Substanzmengen vorhanden sein, die für den Fortgang der Arbeiten erforderlich sind.
      Gefäße nicht offenstehen lassen.
      Für das Ab- und Umfüllen möglichst dichtschließende Anlagen mit Absaugung einsetzen.
      Verschütten vermeiden.
      Nur in gekennzeichnete Behälter abfüllen.
      Bei offenem Hantieren jeglichen Kontakt vermeiden.
      Bei offenem Hantieren Staubentwicklung vermeiden.
      Beim Transport in zerbrechlichen Gefäßen geeignete Überbehälter benutzen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Reinigung und Instandhaltung:
      Tägliche Reinigung durchführen.
      Beim Reinigen ggf. persönliche Schutzausrüstung benutzen.
      Staubbildung vermeiden. Nicht vermeidbare Staubablagerungen sind regelmäßig aufzunehmen.
      Geprüfte Industriestaubsauger der Klasse H verwenden.
      Bei Reinigungsarbeiten Staub nicht unnötig aufwirbeln.
      Das Abblasen zu Reinigungszwecken ist nicht zulässig.
      Verschmutzte Geräte dürfen nur nach Reinigung in anderen Arbeitsbereichen verwendet werden.
      Instandhaltungsarbeiten und Arbeiten in Behältern oder engen Räumen nur mit schriftlicher Erlaubnis durchführen.
      \n "}, {"drnr": "0803", "text": "\n TECHNISCHE SCHUTZMASSNAHMEN – LAGERUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Lagerbedingungen:
      Unter Verschluss oder nur für fachkundige Personen zugänglich aufbewahren.
      Keine Lebensmittelgefäße verwenden - Verwechslungsgefahr!
      Behälter sind eindeutig und dauerhaft zu kennzeichnen.
      Möglichst im Originalbehälter aufbewahren.
      Zerbrechliche Gefäße in bruchsichere Übergefäße einstellen.
      Behälter dicht verschlossen an einem kühlen, trockenen, gut belüfteten Ort aufbewahren.
      Vor Feuchtigkeit schützen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Zusammenlagerungsbedingungen:
      Lagerklasse 5.1 B (Oxidierend wirkende Stoffe)
      Es sollten nur Stoffe derselben Lagerklasse zusammengelagert werden.
      Die Zusammenlagerung mit folgenden Stoffen ist verboten:
      - Arzneimittel, Lebensmittel und Futtermittel einschließlich Zusatzstoffe.
      - Ansteckungsgefährliche, radioaktive und explosive Stoffe.
      - Gase.
      - Aerosole (Spraydosen).
      - Sonstige explosionsgefährliche Stoffe der Lagerklasse 4.1A.
      - Pyrophore Stoffe.
      - Stoffe, die in Berührung mit Wasser entzündbare Gase entwickeln.
      - Organische Peroxide und selbstzersetzliche Stoffe.
      Die Zusammenlagerung mit folgenden Stoffen ist nur unter bestimmten Bedingungen erlaubt (Einzelheiten siehe TRGS 510):
      - Entzündbare flüssige Stoffe der Lagerklasse 3.
      - Entzündbare feste Stoffe oder desensibilisierte Stoffe der Lagerklasse 4.1B.
      - Ammoniumnitrat und ammoniumnitrathaltige Zubereitungen.
      - Brennbare und nicht brennbare akut giftige Stoffe der Lagerklassen 6.1A und 6.1B.
      - Brennbare giftige oder chronisch wirkende Stoffe der Lagerklasse 6.1C.
      - Nichtbrennbare giftige oder chronisch wirkende Stoffe der Lagerklasse 6.1D.
      - Brennbare ätzende Stoffe der Lagerklasse 8A.
      - Brennbare Flüssigkeiten der Lagerklasse 10.
      - Brennbare Feststoffe der Lagerklasse 11.
      Der Stoff sollte nicht mit Stoffen zusammengelagert werden, mit denen gefährliche chemische Reaktionen möglich sind.
      \n "}, {"drnr": "0804", "text": "\n TECHNISCHE SCHUTZMASSNAHMEN - BRAND- UND EXPLOSIONSSCHUTZ\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Technische, konstruktive Maßnahmen:
      Stoff ist brandfördernd (oxidierend).
      Feuerlöscheinrichtungen sind bereitzustellen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Vorsichtsmaßnahmen beim Umgang:
      Von offenen Flammen fernhalten.
      Rauchverbot beachten!
      Schweißverbot im Arbeitsraum.
      Arbeiten an Behältern und Leitungen nur nach sorgfältigem Freispülen und Inertisieren durchführen.
      Feuerarbeiten mit schriftlicher Erlaubnis durchführen, wenn sich Feuer- und Explosionsgefahren nicht restlos beseitigen lassen.
      Von brennbaren Stoffen fernhalten.
      Filtrieren von Lösungen nur mit Glaswolle, Glasfritten oder Keramikfilter. Kein Filtermaterial aus Papier verwenden, nach Trocknung besteht Entzündungsgefahr. Keine Putzlappen offen liegen lassen.
      \n "}, {"drnr": "0805", "text": "\n ORGANISATORISCHE SCHUTZMASSNAHMEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Unterweisung über Gefahren und Schutzmaßnahmen anhand der Betriebsanweisung (TRGS 555) mit Unterschrift erforderlich, falls mehr als nur eine geringe Gefährdung festgestellt wurde.
      Unterweisungen vor der Beschäftigung und danach mindestens einmal jährlich durchführen.
      Ein Flucht- und Rettungsplan ist aufzustellen, wenn Lage, Ausdehnung und Nutzungsart der Arbeitsstätte dies erfordern.
      Die Konzentration des Stoffes in der Luft ist zu minimieren.
      Die Zahl der Beschäftigten, die mit dem Gefahrstoff umgehen, ist so klein wie möglich zu halten.
      Beschäftigungsbeschränkungen für Jugendliche nach dem Jugendarbeitsschutzgesetz beachten.
      Tätigkeitsbeschränkungen für schwangere Frauen nach Mutterschutzgesetz beachten.
      Das Betreten der Betriebsbereiche ist nur den Beschäftigten gestattet. Entsprechende Hinweisschilder sind anzubringen.
      \n "}, {"drnr": "0806", "text": "\n PERSÖNLICHE SCHUTZMASSNAHMEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Körperschutz:
      Je nach Gefährdung geeignete Schutzkleidung oder geeigneten Chemikalienschutzanzug tragen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Atemschutz:
      In Ausnahmesituationen (z.B. unbeabsichtigte Stofffreisetzung) ist das Tragen von Atemschutz erforderlich. Tragezeitbegrenzungen beachten.
      Atemschutzgerät: Partikelfilter P3, Kennfarbe: weiß.
      Bei Konzentrationen über der Anwendungsgrenze von Filtergeräten, bei Sauerstoffgehalten unter 17 Vol% oder bei unklaren Bedingungen ist ein Isoliergerät zu verwenden.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Augenschutz:
      Es muss ausreichender Augenschutz getragen werden.
      Korbbrille verwenden.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Handschutz:
      Schutzhandschuhe verwenden. Das Handschuhmaterial muss gegen den verwendeten Stoff ausreichend undurchlässig und beständig sein. Vor Gebrauch Dichtheit prüfen. Handschuhe vor dem Ausziehen vorreinigen, danach gut belüftet aufbewahren. Hautpflege beachten.
      Hautschutzsalben bieten keinen ausreichenden Schutz gegen diesen Stoff.
      Völlig ungeeignet sind Stoff- oder Lederhandschuhe. 
      Nachfolgende Daten gelten für wässrige, gesättigte Lösungen des Salzes.
      Geeignet sind Handschuhe aus folgenden Materialien (Durchbruchzeit >= 8 Stunden):
      Naturkautschuk/Naturlatex - NR (0,5 mm) (ungepuderte und allergenfreie Produkte verwenden)
      Polychloropren - CR (0,5 mm)
      Nitrilkautschuk/Nitrillatex - NBR (0,35 mm)
      Butylkautschuk - Butyl (0,5 mm)
      Fluorkautschuk - FKM (0,4 mm)
      Polyvinylchlorid - PVC (0,5 mm)
       
      Die Zeitangaben sind Richtwerte aus Messungen bei 22 °C und dauerhaftem Kontakt. Erhöhte Temperaturen durch erwärmte Substanzen, Körperwärme etc. und eine Verminderung der effektiven Schichtstärke durch Dehnung können zu einer erheblichen Verringerung der Durchbruchzeit führen. Im Zweifelsfall Hersteller ansprechen. Bei einer ca. 1,5-fach größeren/kleineren Schichtdicke verdoppelt/halbiert sich die jeweilige Durchbruchzeit. Die Daten gelten nur für den Reinstoff. Bei Übertragung auf Substanzgemische dürfen sie nur als Orientierungshilfe angesehen werden.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Arbeitshygiene:
      In Arbeitsbereichen dürfen keine Nahrungs- und Genussmittel aufgenommen werden. Für diesen Zweck sind geeignete Bereiche einzurichten.
      Berührung mit der Haut vermeiden. Nach Substanzkontakt ist Hautreinigung erforderlich.
      Berührung mit den Augen vermeiden. Nach Substanzkontakt Augenspülung vornehmen.
      Einatmen von Stäuben vermeiden.
      Berührung mit der Kleidung vermeiden. Verunreinigte Kleidung wechseln und gründlich reinigen.
      Vor Pausen gegebenenfalls die Arbeitskleidung wechseln.
      Getrennte Aufbewahrungsmöglichkeiten für Straßen- und Arbeitskleidung müssen zur Verfügung stehen, wenn eine Gefährdung durch Verunreinigung der Arbeitskleidung zu erwarten ist.
      Vor Pausen und bei Arbeitsende Hautreinigung mit Wasser und Seife erforderlich. Nach der Reinigung fetthaltige Hautpflegemittel verwenden.
      Persönliche Hygiene streng einhalten.
      \n "}, {"drnr": "0807", "text": "\n ENTSORGUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Gefährlicher Abfall nach Abfallverzeichnis-Verordnung (AVV).
      Wenn eine Verwertung nicht möglich ist, müssen Abfälle unter Beachtung der örtlichen behördlichen Vorschriften beseitigt werden.
       
      Sammlung von Kleinmengen:
      In Sammelbehälter für giftige anorganische Rückstände sowie Schwermetall-Salze und ihre Lösungen geben.
      Sammelgefäße sind deutlich mit der systematischen Bezeichnung ihres Inhaltes zu beschriften. Gefäße an einem gut gelüfteten Ort aufbewahren. Der zuständigen Stelle zur Abfallbeseitigung übergeben.
      \n "}, {"drnr": "0808", "text": "\n MASSNAHMEN BEI UNBEABSICHTIGTER FREISETZUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Gefährdeten Bereich räumen, betroffene Umgebung warnen.
      Zur Beseitigung des gefährlichen Zustandes darf der Gefahrenbereich nur mit geeigneten Schutzmaßnahmen betreten werden.
      Atem-, Augen-, Hand- und Körperschutz tragen (s. Kapitel Persönliche Schutzmaßnahmen).
      Staubfrei aufnehmen.
      Anschließend Raum lüften und verschmutzte Gegenstände und Boden reinigen.
       
      Gewässergefährdung:
      Stark wassergefährdend. Eindringen in Gewässer, Kanalisation oder Erdreich unbedingt vermeiden. Schon beim Eindringen geringer Mengen Behörden verständigen.
      \n "}, {"drnr": "0809", "text": "\n MASSNAHMEN BEI BRÄNDEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Verhaltensmaßregeln:
      Stoff selbst brennt nicht, wirkt aber oxidierend.
      Umliegende Gebinde und Behälter mit Sprühwasser kühlen.
      Behälter wenn möglich aus der Gefahrenzone bringen.
      Drucksteigerung, Berst- und Explosionsgefahr beim Erhitzen.
      Löschwasser nicht in die Kanalisation gelangen lassen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Persönliche Schutzausrüstung bei der Brandbekämpfung:
      Bei Einbeziehung in einen Brand können gefährliche Stoffe freigesetzt werden.
      Nitrose Gase (Stickoxide)
      Metalloxidrauch
      Umgebungsluftunabhängiges Atemschutzgerät und Chemieschutzanzug tragen.
      \n "}], "links": "\n \n \n \n
      \n \n Handhabung\n | \n Lagerung\n | \n Brand- und Explosionsschutz\n | \n Organisatorische Maßnahmen\n | \n Persönl. Schutzmaßnahmen\n | \n Entsorgung\n | \n Freisetzung\n | \n Maßnahmen bei Bränden\n \n
      \n "}, {"drnr": "1100", "ueberschrift": "VORSCHRIFTEN\n ", "unterkapitel": [{"drnr": "1303", "text": "\n EU-GHS-EINSTUFUNG UND KENNZEICHNUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Einstufung:
      Oxidierende Feststoffe, Kategorie 2; H272
      Akute Toxizität, Kategorie 4, Verschlucken; H302
      Akute Toxizität, Kategorie 4, Einatmen; H332
      Sensibilisierung der Haut, Kategorie 1; H317
      Schwere Augenschädigung, Kategorie 1; H318
      Sensibilisierung der Atemwege, Kategorie 1; H334
      Karzinogenität, Kategorie 1B; H350i
      Keimzellmutagenität, Kategorie 2; H341
      Reproduktionstoxizität, Kategorie 1B; H360F
      Gewässergefährdend, Akut Kategorie 1; H400
      Gewässergefährdend, Chronisch Kategorie 1; H410
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \"ghs03\"\n \n \"ghs08\"\n \n \"ghs05\"\n \n \"ghs07\"\n \n \"ghs09\"\n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      Signalwort:\"Gefahr\"
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Gefahrenhinweise - H-Sätze:
      H272: Kann Brand verstärken; Oxidationsmittel.
      H302: Gesundheitsschädlich bei Verschlucken.
      H332: Gesundheitsschädlich bei Einatmen.
      H317: Kann allergische Hautreaktionen verursachen.
      H318: Verursacht schwere Augenschäden.
      H334: Kann bei Einatmen Allergie, asthmaartige Symptome oder Atembeschwerden verursachen.
      H350i: Kann bei Einatmen Krebs erzeugen.
      H341: Kann vermutlich genetische Defekte verursachen.
      H360F: Kann die Fruchtbarkeit beeinträchtigen.
      H410: Sehr giftig für Wasserorganismen mit langfristiger Wirkung.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Sicherheitshinweise - P-Sätze:
      P210: Von Hitze, heißen Oberflächen, Funken, offenen Flammen sowie anderen Zündquellen fernhalten. Nicht rauchen.
      P280: Schutzhandschuhe/Schutzkleidung/Augenschutz/Gesichtsschutz tragen.
      P301+P330+P331: BEI VERSCHLUCKEN: Mund ausspülen. KEIN Erbrechen herbeiführen.
      P302+P352: BEI BERÜHRUNG MIT DER HAUT: Mit viel Wasser und Seife waschen.
      P304+P340: BEI EINATMEN: Die Person an die frische Luft bringen und für ungehinderte Atmung sorgen.
      P305+P351+P338: BEI KONTAKT MIT DEN AUGEN: Einige Minuten lang behutsam mit Wasser spülen. Eventuell vorhandene Kontaktlinsen nach Möglichkeit entfernen. Weiter spülen.
      P310: Sofort GIFTINFORMATIONSZENTRUM oder Arzt anrufen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Herstellerangabe Thermo Fisher Scientific
      Cobalt(II)-nitrat, Hexahydrat
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 01231 
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      Stand:2019
      geprüft:2020
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Der Stoff ist gelistet in Anhang VI, Tabelle 3 der EG-GHS-Verordnung.
      Die angegebene Einstufung kann von der Listeneinstufung abweichen, da diese bezüglich fehlender oder abweichender Gefahrenklassen und Kategorien für den jeweiligen Stoff zu ergänzen ist.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 99999 
      \n "}, {"drnr": "1302", "text": "\n GHS-EINSTUFUNG VON GEMISCHEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Spezifische Konzentrationsgrenzen
      Karz. 1B; H350i: C >= 0,01 %
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Für weitere ggf. nicht aufgeführte Konzentrationsbereiche bzw. weitere evtl. vorhandene Gefahreneinstufungen des Stoffes sind die allgemeinen Konzentrationsgrenzen aus Anhang 1 der Verordnung (EG) 1272/2008 heranzuziehen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      M-Faktor:M=10
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Anmerkung 1
      Die angegebenen Konzentrationen sind als Gewichts% des Metalls, bezogen auf das Gesamtgewicht des Gemisches, zu verstehen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Ergänzende Kennzeichnungselemente nach Verordnung (EG) Nr. 1272/2008 Anhang II, Nr. 2.8: Das Kennzeichnungsetikett auf der Verpackung von Gemischen, die mindestens einen als sensibilisierend eingestuften Stoff in einer Konzentration enthalten, die mindestens 0,1 % beträgt oder mindestens ebenso hoch ist wie die in Anhang VI Teil 3 dieser Verordnung in einem besonderen Hinweis für den Stoff genannte Konzentration, muss folgenden Hinweis tragen:
      EUH208 - „Enthält ‚Name des sensibilisierenden Stoffes‘. Kann allergische Reaktionen hervorrufen.“
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 07501 07505 
      \n "}, {"drnr": "1104", "text": "\n ARBEITSPLATZKENNZEICHNUNG NACH ASR A1.3\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      Verbotszeichen:
      \n \n \n \n \n \n
      \n \"P02_FEUE\"\n Keine offene Flamme; Feuer, offene Zündquelle und Rauchen verboten
      \n
      \n \n \n \n \n \n
      \n \"P06_ZUTR\"\n Zutritt für Unbefugte verboten
      \n
      \n \n \n \n \n \n
      \n \"P19_esstr\"\n Essen und Trinken verboten
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      Warnzeichen:
      \n \n \n \n \n \n
      \n \"W04_AETZ\"\n Warnung vor ätzenden Stoffen
      \n
      \n \n \n \n \n \n
      \n \"W11_bran\"\n Warnung vor brandfördernden Stoffen
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Gebotszeichen:
      \n \n \n \n \n \n
      \n \"M01_auge\"\n Augenschutz benutzen
      \n
      \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n
      \n \"M06_hand\"\n Schutzhandschuhe benutzen
      \n
      \n "}, {"drnr": "1106", "text": "\n EINSTUFUNG WASSERGEFÄHRDENDER STOFFE\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      Stoff Nr.:520
      \n
      WGK 3 - stark wassergefährdend
      Einstufung gemäß Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt ergänzt 17.12.2020
      \n "}, {"drnr": "1107", "text": "\n TECHNISCHE ANLEITUNG ZUR REINHALTUNG DER LUFT (TA LUFT)\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Kapitel 5.2.7.1.1 Krebserzeugende Stoffe
      Klasse I
      Als Mindestanforderung dürfen die folgende Werte im Abgas insgesamt nicht überschritten werden.
      \n
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      \n \n \n \n \n \n \n \n \n \n
      Massenstrom: 0,15 g/h
      \n
      oder
      \n \n \n \n \n \n \n \n \n \n
      Massenkonzentration: 0,05 mg/m³
      \n
      \n \n \n \n \n \n \n \n
      Angegeben als Co.
      \n
      \n "}, {"drnr": "1108", "text": "\n TRANSPORTVORSCHRIFTEN\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n \n 1477\n \n \n \n \n \n \n
      \n 1477 II\n
      UN-Nummer: 1477
      Gefahrgut-Bezeichnung: Nitrate, anorganisch, n.a.g.
      Nummer zur Kennzeichnung der Gefahr: 50
      Klasse: 5.1 (Entzündend/oxidierend wirkende Stoffe)
      Verpackungsgruppe: II (mittlere Gefährlichkeit)
      Gefahrzettel: 5.1
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      \n \n \n \n \n
      \n \n \n \n \n
      \n \n \n \n \n
      \n \"TPlabel5_1\"\n \n \n
      \n
      \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Besondere Kennzeichnung: Symbol (Fisch und Baum)
      \n \"TPlabel9_1\"\n
      \n \n \n \n \n \n \n \n \n \n
      Klassifizierungscode:O2
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Tunnelbeschränkungen:
      Durchfahrt verboten durch Tunnel der Kategorie E.
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 01231 
      \n "}, {"drnr": "1109", "text": "\n REACH - VERORDNUNG\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Stoff ist in der REACH-Kandidatenliste der besonders besorgniserregenden Stoffe aufgeführt.
      \n "}, {"drnr": "1203", "text": "\n EMPFEHLUNGEN DER MAK-KOMMISSION\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Die Angaben sind wissenschaftliche Empfehlungen und kein geltendes Recht.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Gefahr der Hautresorption
      Gefahr der Sensibilisierung der Atemwege und der Haut
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Krebserzeugend: Kategorie 2
      Stoffe, die als krebserzeugend für den Menschen anzusehen sind, weil durch Ergebnisse aus Tierversuchen davon auszugehen ist, dass sie einen nennenswerten Beitrag zum Krebsrisiko leisten.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Keimzellmutagen: Kategorie 3A
      Stoffe, für die eine Schädigung des genetischen Materials der Keimzellen beim Menschen oder im Tierversuch nachgewiesen wurde oder für die gezeigt wurde, dass sie mutagene Effekte in somatischen Zellen Säugetieren in vivo hervorrufen und dass sie in aktiver Form die Keimzellen erreichen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Geltungsbereich: einatembare Fraktion
      \n
      \n "}, {"drnr": "1212", "text": "\n TRGS 910\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      Stoffspezifische Akzeptanz- und Toleranzkonzentrationen
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Akzeptanzkonzentration
      \n \n \n \n \n \n \n \n \n \n \n \n
      Gew.-Konz.:0,5 µg/m³Alveolengängige Fraktion
      \n \n \n \n \n \n \n \n
      Akzeptanzkonzentration assoziiert mit Risiko 4:10000
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Toleranzkonzentration
      \n \n \n \n \n \n \n \n \n \n \n \n
      Gew-Konz.:5 µg/m³Alveolengängige Fraktion
      \n \n \n \n \n \n \n \n \n \n
      Überschreitungsfaktor:8
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      Die Konzentrationen beziehen sich auf den Elementgehalt des entsprechenden Metalls.
      siehe TRGS 561
      Geltungsbereich: Cobaltverbindungen, als Carc. 1A, Carc. 1B eingestuft
      \n
      \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Quelle:\n 05326 
      \n "}, {"drnr": "1214", "text": "\n STÖRFALLVERORDNUNG (StoerfallV)\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Anhang I Nummer:1.2.8
      \n \n \n \n \n \n \n \n \n
      \n P8 Oxidierende Flüssigkeiten oder Feststoffe der Kategorien 1, 2 oder 3
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      Mengenschwelle untere Kl.:50 t
      Mengenschwelle obere Kl.:200 t
      \n \n
      \n
      \n \n STÖRFALLVERORDNUNG (StoerfallV)\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n
      Anhang I Nummer:1.3.1
      \n \n \n \n \n \n \n \n \n
      \n E1 Gewässergefährdend, Kategorie Akut 1 oder Chronisch 1
      \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      Mengenschwelle untere Kl.:100 t
      Mengenschwelle obere Kl.:200 t
      \n \n
      \n
      \n "}, {"drnr": "1208", "text": "\n VERWENDUNGSBESCHRÄNKUNGEN / VERWENDUNGSVERBOTE\n \n \n
      \n
      \n \n \n \n \n \n \n \n \n \n \n
      REACH-Verordnung (EG) Nr. 1907/2006 Anhang XVII
      Anhang XVII, Nummer 28, Nummer 29 bzw. Nummer 30
      Der Stoff darf nicht in Verkehr gebracht oder verwendet werden als Stoff, als Bestandteil anderer Stoffe oder in Gemischen, die zum Verkauf an die breite Öffentlichkeit bestimmt sind, wenn die Einzelkonzentration des Stoffs oder Gemischs die Konzentrationsgrenzwerte nach CLP-Verordnung erreicht oder übersteigt. Beim Inverkehrbringen für gewerbliche Anwender muss der Lieferant gewährleisten, dass die Verpackung mit der Aufschrift „Nur für gewerbliche Anwender.“ versehen ist. Weitere Einzelheiten sind der Verordnung zu entnehmen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Anhang XVII, Nummer 75
      Gemische, die bestimmte gefährliche Stoffe enthalten, dürfen für Tätowierungszwecke nicht mehr in Verkehr gebracht werden. Gemische die solche Stoffe in vorgegebener Konzentration enthalten, dürfen nach dem 04.01.2022 nicht mehr für Tätowierungszwecke verwendet werden. Bei den Stoffen handelt es sich um:
      - karzinogene oder reproduktionstoxische Stoffe gemäß Anhang VI Teil 3 der CLP-Verordnung (es sei denn, die Einstufung gründet sich auf Wirkungen, die nur nach Exposition durch Inhalation auftreten),
      - hautsensibilisierende, hautätzende, hautreizende, schwer augenschädigende oder augenreizende Stoffe gemäß Anhang VI Teil 3 der CLP-Verordnung,
      - Stoffe, die mit maßgeblichen Bedingungen in Anhang II oder IV der Verordnung (EG) Nr. 1223/2009 [Kosmetikverordnung] aufgeführt sind und
      - Stoffe, die in der Anlage 13 des Anhang XVII (Nummer 75) der REACH-Verordnung aufgeführt sind.
      Generell müssen Gemische, die zur Verwendung für Tätowierungszwecke in Verkehr gebracht werden, ab dem 04.01.2022 mit der Kennzeichnung “Gemisch zur Verwendung in Tätowierungen oder Permanent-Make-up.” versehen werden und dürfen ohne diese Kennzeichnung nicht zu Tätowierungszwecken verwendet werden. Weitere Sicherheitsinformationen sind auf der Verpackung oder in der Gebrauchsanweisung anzugeben. Der Tätowierer hat der Person, die sich dem Verfahren unterzieht, diese Informationen bereitzustellen.
      Weitere Informationen zu den Beschränkungen, Konzentrationsgrenzen und den Ausnahmen sind der Verordnung zu entnehmen.
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      Anhang XVII der Verordnung (EG) 1907/2006, konsolidierte Version (BAUA)
      \n "}, {"drnr": "1209", "text": "\n TECHNISCHE REGELN FÜR GEFAHRSTOFFE (TRGS)\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 201
      Einstufung und Kennzeichnung bei Tätigkeiten mit Gefahrstoffen; Ausgabe Februar 2017, zuletzt geändert und ergänzt April 2018
      \n
      TRGS 400
      Gefährdungsbeurteilung für Tätigkeiten mit Gefahrstoffen; Ausgabe Juli 2017
      \n
      TRGS 555
      Betriebsanweisung und Information der Beschäftigten; Ausgabe Februar 2017
      \n
      TRGS 600
      Substitution; Ausgabe Juli 2020
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 401
      Gefährdung durch Hautkontakt, Ermittlung - Beurteilung - Maßnahmen; Ausgabe Juni 2008; zuletzt berichtigt März 2011
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 406
      Sensibilisierende Stoffe für die Atemwege; Ausgabe Juni 2008, korrigiert März 2009
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 410
      Expositionsverzeichnis bei Gefährdung gegenüber krebserzeugenden oder keimzellmutagenen Gefahrstoffen der Kategorien 1A oder 1B; Ausgabe Juni 2015, zuletzt berichtigt Februar 2021
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 500
      Schutzmaßnahmen; Ausgabe September 2019
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 509
      Lagern von flüssigen und festen Gefahrstoffen in ortsfesten Behältern sowie Füll- und Entleerstellen für ortsbewegliche Behälter; Ausgabe September 2014, zuletzt berichtigt, geändert und ergänzt Oktober 2020
      \n
      TRGS 510
      Lagerung von Gefahrstoffen in ortsbeweglichen Behältern; Ausgabe Dezember 2020
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 800
      Brandschutzmaßnahmen; Ausgabe Dezember 2010
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      TRGS 560
      Luftrückführung bei Tätigkeiten mit krebserzeugenden, erbgutverändernden und fruchtbarkeitsgefährdenden Stäuben; Ausgabe Januar 2012
      \n "}, {"drnr": "1210", "text": "\n VORSCHRIFTEN DER UNFALLVERSICHERUNGSTRÄGER\n \n \n
      \n
      \n \n \n \n \n \n \n \n
      DGUV Grundsatz 350-001 (BGG 904): DGUV Grundsätze für arbeitsmedizinische Untersuchungen
      G 40 : Krebserzeugende und erbgutverändernde Gefahrstoffe - allgemein
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      DGUV Regel 112-190
      Benutzung von Atemschutzgeräten, Ausgabe Dezember 2011
      http://publikationen.dguv.de/dguv/pdf/10002/r-190.pdf
      \n \n
      \n
      \n \n \n \n \n \n \n \n
      DGUV Regel 112-195
      Benutzung von Schutzhandschuhen, Aktualisierte Nachdruckfassung Oktober 2007
      http://publikationen.dguv.de/dguv/pdf/10002/bgr195.pdf
      \n "}], "links": "\n \n \n \n
      \n \n GHS-Einstufung/Kennzeichnung\n | \n Arbeitsplatzkennzeichnung\n | \n Wassergefährdungsklasse\n | \n TA Luft\n | \n Transportvorschriften\n | \n REACH-Kandidaten\n | \n Empfehlung MAK\n | \n Störfallverordnung\n | \n Verwendungsbeschränkungen\n | \n TRGS\n | \n Vorschriften UV-Träger\n | \n Arbeitsmedizinische Vorsorge\n \n
      \n "}, {"drnr": "1400", "ueberschrift": "LINKS\n ", "unterkapitel": [{"drnr": "1400", "text": "\n
      \n
      \n \n \n \n \n \n \n \n
      \n Begründung zur Bewertung als krebserzeugend, erbgutverändernd oder fortpflanzungsgefährdend (Quelle BAuA)\n
      \n Begründungen zu Exposition-Risiko-Beziehungen\n
      \n
      \n \n \n \n \n \n \n \n
      \n Internationale Grenzwerte (nur auf Englisch)\n
      \n
      \n \n \n \n \n \n \n \n
      \n OECD Screening Information DataSet (SIDS) (nur auf Englisch)\n
      \n
      \n \n \n \n \n \n \n \n
      \n ECHA - Kandidatenliste von Stoffen mit sehr hohen Bedenken für Zulassung (nur auf Englisch)\n
      \n
      \n \n \n \n \n \n \n \n
      \n DGUV Information 213-098: Stoffliste - Unterricht in Schulen\n
      \n
      \n "}], "links": null}, {"drnr": "0900", "ueberschrift": "LITERATURVERZEICHNIS\n ", "unterkapitel": [], "tables": "\n \n \n \n
      \n

      Quelle: 00001\n
      IFA: Erfassungs- und Pflegehandbuch der GESTIS-Stoffdatenbank (nicht öffentlich)
      Data acquisition and maintenance manual of the GESTIS substance database (non-public)

      \n

      Quelle: 00131\n
      The Merck-Index; 14th Edition 2006

      \n

      Quelle: 00438\n
      Registry of Toxic Effects of Chemical Substances (RTECS)

      \n

      Quelle: 00450\n
      HSDB-Datenbankrecherche 2003

      \n

      Quelle: 01211\n
      GHS-Sicherheitsdatenblatt, Merck
      GHS Material Safety Data Sheet, Merck

      \n

      Quelle: 01221\n
      GHS-Sicherheitsdatenblatt, Sigma-Aldrich
      GHS Material Safety Data Sheet, Sigma-Aldrich

      \n

      Quelle: 01231\n
      GHS-Sicherheitsdatenblatt, Thermo Fisher Scientific
      GHS Material Safety Data Sheet, Thermo Fisher Scientific

      \n

      Quelle: 02071\n
      Toxicological Data, compiled by the National Institute of Health (NIH), USA, selected and distributed by Technical Database Services (TDS), New York, 2009

      \n

      Quelle: 02072\n
      Ecotoxicological Data, compiled by the US Environmental Protection Agency (EPA), selected and distributed by Technical Database Services (TDS), New York, 2009

      \n

      Quelle: 05300\n
      TRGS 510 \"Lagerung von Gefahrstoffen in ortsbeweglichen Behältern\" Ausgabe Dezember 2020

      \n

      Quelle: 05323\n
      Begründungen zur Bewertung von Stoffen als krebserzeugend, erbgutverändernd oder fortpflanzungsgefährdend (s. Kapitel LINKS)

      \n

      Quelle: 05326\n
      TRGS 910 \"Risikobezogenes Maßnahmenkonzept für Tätigkeiten mit krebserzeugenden Gefahrstoffen \" Ausgabe Februar 2014, zuletzt geändert und ergänzt Februar 2021

      \n

      Quelle: 06002\n
      L. Roth, U. Weller
      \"Gefährliche Chemische Reaktionen\" Loseblattsammlung mit Ergänzungslieferungen
      \"Dangerous chemical reactions\" loose-leaf collection with supplement deliveries
      ecomed-Verlag

      \n

      Quelle: 07501\n
      Verordnung (EG) Nr. 790/2009 der Kommission vom 10. August 2009 zur Änderung der Verordnung (EG) Nr. 1272/2008 des Europäischen Parlaments und des Rates über die Einstufung, Kennzeichnung und Verpackung von Stoffen und Gemischen zwecks Anpassung an den technischen und wissenschaftlichen Fortschritt (EG-GHS-Verordnung, 1. Änderung)

      \n

      Quelle: 07505\n
      Verordnung (EU) Nr. 758/2013 der Kommission vom 7. August 2013 zur Berichtigung von Anhang VI der Verordnung (EG) Nr. 1272/2008 des Europäischen Parlaments und des Rates über die Einstufung, Kennzeichnung und Verpackung von Stoffen und Gemischen (EG-GHS-Verordnung, 2. Berichtigung)

      \n

      Quelle: 07580\n
      Bekanntmachung der Liste der wassergefährdenden Stoffe im Bundesanzeiger vom 10.08.2017, zuletzt geändert 17.12.2020

      \n

      Quelle: 07596\n
      REACH Kandidatenliste; Stand 19.01.2021

      \n

      Quelle: 07606\n
      Wirth, Gloxhuber \"Toxikologie\" 4.Auflage, Thieme Verlag 1985

      \n

      Quelle: 07619\n
      DFG: Toxikologisch-arbeitsmedizinische Begründungen von MAK-Werten; Verlag Chemie

      \n

      Quelle: 07620\n
      DFG: Arbeitsmedizinisch-toxikologische Begründungen von BAT-Werten; Verlag Chemie

      \n

      Quelle: 07635\n
      AUERDATA 98

      \n

      Quelle: 07748\n
      American Conference of Governmental Industrial Hygienists \"Documentation of the threshold limit values and biological exposure indices Loseblattsammlung mit Ergänzungslieferungen

      \n

      Quelle: 07750\n
      R. E. Lenga \"The Sigma-Aldrich Library of Chemical Safety Data\" 2nd edition, Sigma-Aldrich, Milwaukee 1988

      \n

      Quelle: 07783\n
      E. Merian (Edt.): Metals and their Compounds in the
      Environment; VCH Verlagsgellschaft mbH, Weinheim 1991

      \n

      Quelle: 07795\n
      H. Geerißen \"GloSaDa 2000 Plus - Glove Safety Data\"

      \n

      Quelle: 07866\n
      G.D. Clayton, F.E. Clayton (edt.) \"Patty's Industrial Hygiene and Toxicology\" Volume II \"Toxicology\" Fourth Edition, John Wiley & Sons, New York 1993

      \n

      Quelle: 07890\n
      F. Klaschka; D. Vossmann: Kontaktallergene: Chemische, klinische und experimentelle Daten; (Allergen-Liste), Erich Schmidt Verlag, Berlin 1994

      \n

      Quelle: 07906\n
      G. Heinemeyer, U. Fabian (Hrsg.) \"Der Vergiftungs- und Drogennotfall. Allgemeine und spezielle Maßnahmen im ärztlichen Not- und Rettungsdienst\" 3. Auflage, Ullstein Mosby, Berlin/Wiesbaden 1997

      \n

      Quelle: 08013\n
      Ludewig \"Akute Vergiftungen\" 9. Auflage, Wissenschaftliche Verlagsgesellschaft, Stuttgart 1999

      \n

      Quelle: 08112\n
      DFG Deutsche Forschungsgemeinschaft: MAK- und BAT-Werte-Liste 2020, Senatskommission zur Prüfung gesundheitsschädlicher Arbeitsstoffe, Mitteilung 56; GMS PUBLISSO

      \n

      Quelle: 99983\n
      Liste arbeitsmedizinisch-toxikologischer Standardwerke (2)
      List of standard references regarding occupational health and toxikology (2)

      \n

      Quelle: 99996\n
      Projektgebundene arbeitsmedizinisch-toxikologische Literatur (2)
      Project related bibliographical references regarding occupational health and toxikology (2)

      \n

      Quelle: 99999\n
      Angabe des Bearbeiters
      Indication of the editor

      \n
      \n \n \n \n \n
      \n \n Identifikation\n | \n Charakterisierung\n | \n Formel\n | \n Phys.-chem. Eigenschaften\n | \n Toxikologie / Ökotoxikologie\n | \n Arbeitsmedizin Erste Hilfe\n | \n Sicherer Umgang\n | \n Vorschriften\n | \n Links\n | \n Literaturverzeichnis\n \n
      \n \n \n \n \n \n \n \n
      Dieses Stoffdatenblatt wurde sorgfältig erstellt. Dennoch kann für den Inhalt keine Haftung, gleich aus welchem Rechtsgrund, übernommen werden.
      \n "}]} \ No newline at end of file diff --git a/src-tauri/src/build.rs b/src-tauri/src/build.rs deleted file mode 100644 index 00bad02b1..000000000 --- a/src-tauri/src/build.rs +++ /dev/null @@ -1,7 +0,0 @@ -#[cfg(feature = "tauri_app")] -fn main() { - tauri_build::build() -} - -#[cfg(not(feature = "tauri_app"))] -fn main() {} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs deleted file mode 100644 index eee6267cb..000000000 --- a/src-tauri/src/main.rs +++ /dev/null @@ -1,22 +0,0 @@ -#![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")] - -#[cfg(feature = "tauri_app")] -mod tauri_app; -#[cfg(feature = "webserver")] -mod webserver; - -fn main() { - #[cfg(feature = "tauri_app")] - tauri_app::main(); - - #[cfg(feature = "webserver")] - webserver::main(); -} - -// Validity checks for features - -#[cfg(not(any(feature = "tauri_app", feature = "webserver")))] -compile_error!("you must specify one of these features: 'tauri_app', 'webserver'!"); - -#[cfg(all(feature = "tauri_app", feature = "webserver"))] -compile_error!("you can only use one of these features: 'tauri_app', 'webserver'!"); diff --git a/src-tauri/src/tauri_app.rs b/src-tauri/src/tauri_app.rs deleted file mode 100644 index 1e526eb6c..000000000 --- a/src-tauri/src/tauri_app.rs +++ /dev/null @@ -1,26 +0,0 @@ -use tauri::async_runtime; - -pub fn main() { - // must be initialized first - let logger = cabr2_logger::plugin::Logger::new(); - - let config = cabr2_config::plugin::Config::default(); - let search = async_runtime::block_on(cabr2_search::plugin::Search::new()); - - let provider_mapping = async_runtime::block_on(cabr2_search::plugin::get_provider_mapping()); - let load_save = async_runtime::block_on(cabr2_load_save::plugin::LoadSave::new(provider_mapping)); - - log::debug!("initializing tauri application..."); - - tauri::Builder::default() - .plugin(logger) - .plugin(config) - .plugin(search) - .plugin(load_save) - .setup(|_| { - log::debug!("tauri setup complete"); - Ok(()) - }) - .run(tauri::generate_context!()) - .unwrap(); -} diff --git a/src-wasm/Cargo.toml b/src-wasm/Cargo.toml deleted file mode 100644 index 232a395b3..000000000 --- a/src-wasm/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "cabr2_wasm_lib" -version = "0.4.1" -authors = [ - "crapStone ", -] -edition = "2018" - -[lib] -crate-type = ["cdylib", "rlib"] - -[dependencies] -base64 = "0.13.0" -cabr2_load_save = { path = "../src-tauri/cabr2_load_save/", features = ["wasm"] } -cabr2_search = { path = "../src-tauri/cabr2_search/", features = ["wasm"] } -cabr2_types = { path = "../src-tauri/cabr2_types/" } -cfg-if = "1.0.0" -console_error_panic_hook = { version = "0.1.7", optional = true } -console_log = { version = "0.2.0", features = ["color"] } -log = "0.4.14" -serde = "1.0.133" -serde_json = "1.0.74" -wasm-bindgen = { version = "0.2.78", features = ["serde-serialize"] } -wasm-bindgen-futures = "0.4.28" - -[features] -default = ["cabr2_load_save/beryllium", "cabr2_search/gestis"] -debug_build = ["console_error_panic_hook"] - -[profile.release] -panic = "abort" -opt-level = "s" -codegen-units = 1 -lto = true diff --git a/src/app/@core/interfaces/Header.ts b/src/app/@core/interfaces/Header.ts deleted file mode 100644 index 1063a67a0..000000000 --- a/src/app/@core/interfaces/Header.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface Header { - documentTitle: string; - organisation: string; - labCourse: string; - name: string; - place: string; - assistant: string; - preparation: string; -} diff --git a/src/app/@core/models/config.model.ts b/src/app/@core/models/config.model.ts deleted file mode 100644 index e34efe6aa..000000000 --- a/src/app/@core/models/config.model.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { filter, map } from 'rxjs/operators'; -import { BehaviorSubject } from 'rxjs'; - -import Logger from '../utils/logger'; - -const logger = new Logger('config.model'); - -export class ConfigModel { - private global: Global; - - constructor(global?: Global) { - if (global) { - this.global = global; - } else { - logger.debug('returning default config'); - this.global = { darkTheme: false, language: 'de_de', acceptedConsent: false }; - } - } - - get globalSection(): Global { - return this.global; - } - - static setLoadedConfig(config: ConfigModel): void { - // this must be config.global because this is mostly a deserialized JSON from the backend - configSubject.next([new ConfigModel(config.global), ConfigState.LOADED]); - } - - static setConfig(config: ConfigModel): void { - // this must be config.global because this is mostly a deserialized JSON from the backend - configSubject.next([new ConfigModel(config.global), ConfigState.CHANGED]); - } - - setDarkMode(darkTheme: boolean): void { - if (this.global.darkTheme !== darkTheme) { - setConfig(new ConfigModel({ ...this.global, darkTheme })); - } - } - - setLanguage(language: string): void { - if (this.global.language !== language) { - setConfig(new ConfigModel({ ...this.global, language })); - } - } - - setAcceptedConsent(acceptedConsent: boolean): void { - if (this.global.acceptedConsent !== acceptedConsent) { - setConfig(new ConfigModel({ ...this.global, acceptedConsent })); - } - } -} - -const setConfig = (config: ConfigModel): void => { - configSubject.next([config, ConfigState.CHANGED]); -}; - -export interface Global { - readonly darkTheme: boolean; - readonly language: string; - readonly acceptedConsent: boolean; -} - -enum ConfigState { - INITIAL, - LOADED, - CHANGED, -} - -const configSubject = new BehaviorSubject<[ConfigModel, ConfigState]>([new ConfigModel(), ConfigState.INITIAL]); -const privConfigObservable = configSubject.asObservable(); -/** all config changes */ -export const configObservable = privConfigObservable.pipe(map(([config, _]) => config)); -/** only if config is loaded from storage */ -export const configLoadObservable = privConfigObservable.pipe( - filter(([_, state]) => state === ConfigState.LOADED), - map(([config, _]) => config), -); -/** only if config was changed but not loaded */ -export const configChangeObservable = privConfigObservable.pipe( - filter(([_, state]) => state === ConfigState.CHANGED), - map(([config, _]) => config), -); diff --git a/src/app/@core/models/global.model.ts b/src/app/@core/models/global.model.ts deleted file mode 100644 index 21de1a77b..000000000 --- a/src/app/@core/models/global.model.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'; -import { BehaviorSubject } from 'rxjs'; -import { Injectable } from '@angular/core'; - -import DocsTemplate from '../interfaces/DocTemplate'; -import { Header } from '../interfaces/Header'; -import { SearchResult } from '../services/provider/provider.model'; -import { SubstanceData } from './substances.model'; - -@Injectable() -export class GlobalModel { - ghsSymbols: GHSSymbols = new Map(); - ghsSymbolKeys: string[] = []; - - headerSubject = new BehaviorSubject
      ({ - assistant: '', - documentTitle: '', - labCourse: '', - name: '', - organisation: '', - place: '', - preparation: '', - }); - headerObservable = this.headerSubject.asObservable(); - - searchResultSubject = new BehaviorSubject([]); - searchResultObservable = this.searchResultSubject.asObservable(); - - substanceDataSubject = new BehaviorSubject([]); - substanceDataObservable = this.substanceDataSubject.asObservable(); - - humanAndEnvironmentDangerSubject = new BehaviorSubject([]); - humanAndEnvironmentDangerObservable = this.humanAndEnvironmentDangerSubject.asObservable(); - - rulesOfConductSubject = new BehaviorSubject([]); - rulesOfConductObservable = this.rulesOfConductSubject.asObservable(); - - inCaseOfDangerSubject = new BehaviorSubject([]); - inCaseOfDangerObservable = this.inCaseOfDangerSubject.asObservable(); - - disposalSubject = new BehaviorSubject([]); - disposalObservable = this.disposalSubject.asObservable(); - - ghsSymbolsSubject = new BehaviorSubject(new Map()); - ghsSymbolsObservable = this.ghsSymbolsSubject.asObservable(); - - constructor(private sanitizer: DomSanitizer) {} - - setGHSSymbols(newSymbols: GHSSymbols) { - this.ghsSymbols = newSymbols; - this.ghsSymbolKeys = Array.from(newSymbols.keys()); - - this.ghsSymbolKeys.sort(); - } - - loadTemplate(docsTemplate: DocsTemplate): void { - this.headerSubject.next({ ...docsTemplate.header }); - this.humanAndEnvironmentDangerSubject.next(docsTemplate.humanAndEnvironmentDanger); - this.rulesOfConductSubject.next(docsTemplate.rulesOfConduct); - this.inCaseOfDangerSubject.next(docsTemplate.inCaseOfDanger); - this.disposalSubject.next(docsTemplate.disposal); - - this.substanceDataSubject.next([]); - } -} - -export type GHSSymbols = Map; diff --git a/src/app/app.component.ts b/src/app/app.component.ts deleted file mode 100644 index 8d41265a9..000000000 --- a/src/app/app.component.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { Component, HostBinding, Inject, OnDestroy, OnInit, Renderer2 } from '@angular/core'; -import { first, switchMap } from 'rxjs/operators'; -import { translate, TranslocoService } from '@ngneat/transloco'; -import { DOCUMENT } from '@angular/common'; -import { MatDialog } from '@angular/material/dialog'; -import { Subscription } from 'rxjs'; - -import { - configChangeObservable, - configLoadObservable, - ConfigModel, - configObservable, -} from './@core/models/config.model'; -import { AlertService } from './@core/services/alertsnackbar/altersnackbar.service'; -import { ConsentComponent } from './components/consent/consent.component'; -import { GlobalModel } from './@core/models/global.model'; -import { IConfigService } from './@core/services/config/config.interface'; -import Logger from './@core/utils/logger'; -import packageInfo from '../../package.json'; - -const logger = new Logger('main'); - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'], -}) -export class AppComponent implements OnInit, OnDestroy { - name = packageInfo.name; - version = packageInfo.version; - - private config!: ConfigModel; - private subscriptions: Subscription[] = []; - - constructor( - @Inject(DOCUMENT) private document: Document, - private renderer: Renderer2, - private dialog: MatDialog, - - private global: GlobalModel, - private configService: IConfigService, - private alertService: AlertService, - private translocoService: TranslocoService, - ) {} - - ngOnDestroy(): void { - this.subscriptions.forEach((subscription) => subscription.unsubscribe()); - } - - ngOnInit(): void { - this.configService - .getConfig() - .pipe(first()) - .subscribe( - (newConfig) => ConfigModel.setLoadedConfig(newConfig), - (err) => { - logger.error('loading config failed:', err); - this.alertService.error(translate('error.configLoad')); - }, - ); - - this.subscriptions.push( - configChangeObservable.pipe(switchMap((config) => this.configService.saveConfig(config).pipe(first()))).subscribe( - () => logger.info('config saved'), - (err) => { - logger.error('saving config failed:', err); - this.alertService.error(translate('error.configSave')); - }, - ), - - configObservable.subscribe((config) => { - // config is undefined before first call of this function - if (!(this.config?.globalSection.language === config.globalSection.language)) { - this.translocoService.setActiveLang(config.globalSection.language); - } - - this.switchMode(config.globalSection.darkTheme); - - this.config = config; - }), - - this.configService.getHazardSymbols().subscribe( - (symbols) => this.global.setGHSSymbols(symbols), - (err) => { - logger.error('loading ghs-symbols failed:', err); - this.alertService.error(translate('error.getHazardSymbols')); - }, - ), - ); - - configLoadObservable.pipe(first()).subscribe((config) => { - if (!config.globalSection.acceptedConsent) { - this.dialog - .open(ConsentComponent, { - data: { - duration: 5, - }, - disableClose: true, - }) - .afterClosed() - .subscribe(() => { - this.config.setAcceptedConsent(true); - this.configService - .saveConfig(this.config) - .pipe(first()) - .subscribe( - () => logger.info('config saved'), - (err) => { - logger.error('saving config failed:', err); - this.alertService.error(translate('error.configSave')); - }, - ); - }); - } - }); - } - - @HostBinding('class') - get themeMode(): string { - return this.config?.globalSection.darkTheme ? 'theme-dark' : 'theme-light'; - } - - switchMode(isDarkMode: boolean): void { - const hostClass = isDarkMode ? 'theme-dark' : 'theme-light'; - this.renderer.setAttribute(this.document.body, 'class', hostClass); - } - - switchModeSink(isDarkMode: boolean): void { - this.switchMode(isDarkMode); - this.config.setDarkMode(isDarkMode); - } -} diff --git a/src/app/components/header/header.component.ts b/src/app/components/header/header.component.ts deleted file mode 100644 index cbb6b9809..000000000 --- a/src/app/components/header/header.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -import { GlobalModel } from '../../@core/models/global.model'; -import { Header } from '../../@core/interfaces/Header'; - -@Component({ - selector: 'app-header', - templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'], -}) -export class HeaderComponent implements OnInit { - header!: Header; - - constructor(public globals: GlobalModel) {} - - ngOnInit(): void { - this.globals.headerObservable.subscribe((data) => (this.header = data)); - } -} diff --git a/src/app/components/modifiable-string-list/modifiable-string-list.component.html b/src/app/components/modifiable-string-list/modifiable-string-list.component.html deleted file mode 100644 index 7f35f2782..000000000 --- a/src/app/components/modifiable-string-list/modifiable-string-list.component.html +++ /dev/null @@ -1,52 +0,0 @@ - - -

      {{ title }}

      -
      -
        -
      • - - - - - - - -
      • -
      -
      - -
      -
      diff --git a/src/app/components/modifiable-string-list/modifiable-string-list.component.ts b/src/app/components/modifiable-string-list/modifiable-string-list.component.ts deleted file mode 100644 index 9e98a8264..000000000 --- a/src/app/components/modifiable-string-list/modifiable-string-list.component.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; -import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { FormArray, FormBuilder, FormGroup } from '@angular/forms'; -import { Observable } from 'rxjs'; - -@Component({ - selector: 'app-modifiable-string-list', - templateUrl: './modifiable-string-list.component.html', - styleUrls: ['./modifiable-string-list.component.scss'], -}) -export class ModifiableStringListComponent implements OnInit { - @Output() - elementEmitter = new EventEmitter(); - - @Input() - title = ''; - - @Input() - elements!: Observable; - - form: FormGroup; - - addHover = false; - - constructor(private formBuilder: FormBuilder) { - this.form = this.formBuilder.group({}); - } - - ngOnInit(): void { - this.elements.subscribe( - (elements) => - (this.form = this.formBuilder.group({ - elements: this.formBuilder.array(elements.map((value) => this.initForm(value)) ?? []), - })), - ); - } - - get controlElements(): FormArray { - return this.form.get('elements') as FormArray; - } - - initForm(value: string): FormGroup { - return this.formBuilder.group({ - value, - hover: false, - }); - } - - addElement(): void { - this.controlElements.push(this.initForm('')); - this.emitChange(); - } - - removeElement(index: number): void { - this.controlElements.removeAt(index); - this.emitChange(); - } - - emitChange(): void { - this.elementEmitter.emit(this.controlElements.controls.map((control) => control.get('value')?.value)); - } - - drop(event: CdkDragDrop): void { - moveItemInArray(this.controlElements.controls, event.previousIndex, event.currentIndex); - this.emitChange(); - } -} diff --git a/src/app/components/preview/preview.component.ts b/src/app/components/preview/preview.component.ts deleted file mode 100644 index 9c99c9763..000000000 --- a/src/app/components/preview/preview.component.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { map } from 'rxjs/operators'; - -import { Amount, getViewValue } from '../../@core/models/substances.model'; -import { GlobalModel } from '../../@core/models/global.model'; -import { Header } from '../../@core/interfaces/Header'; -import { IProviderService } from '../../@core/services/provider/provider.interface'; -import { ProviderMapping } from '../../@core/services/provider/provider.model'; - -// TODO ViewSubstanceData and move -interface SimpleSubstanceData { - name: string; - cas?: string; - molecularFormula?: string; - molarMass?: string; - meltingPoint?: string; - boilingPoint?: string; - waterHazardClass?: string; - hPhrases: [string, string][]; - pPhrases: [string, string][]; - signalWord?: string; - symbols: string[]; - lethalDose?: string; - mak?: string; - amount?: Amount; -} - -@Component({ - selector: 'app-preview', - templateUrl: './preview.component.html', - styleUrls: ['./preview.component.scss'], -}) -export class PreviewComponent implements OnInit { - header!: Header; - - substanceData!: SimpleSubstanceData[]; - providerMapping!: ProviderMapping; - - sources: Set = new Set(); - - getViewValue = getViewValue; - - constructor(public globals: GlobalModel, private providerService: IProviderService) { - this.providerService.providerMappingsObservable.subscribe((providers) => (this.providerMapping = providers)); - } - - ngOnInit(): void { - this.globals.headerObservable.subscribe((value) => (this.header = value)); - - this.globals.substanceDataObservable - .pipe( - map((data) => - data.map((value) => { - const provider = this.providerMapping.get(value.source.provider); - if (provider && provider.identifier !== 'custom') { - this.sources.add(provider.name); - } - - return { - name: value.name.modifiedData ?? value.name.originalData, - cas: value.cas.modifiedData ?? value.cas.originalData, - molecularFormula: value.molecularFormula.modifiedData ?? value.molecularFormula.originalData, - molarMass: value.molarMass.modifiedData ?? value.molarMass.originalData, - meltingPoint: value.meltingPoint.modifiedData ?? value.meltingPoint.originalData, - boilingPoint: value.boilingPoint.modifiedData ?? value.boilingPoint.originalData, - waterHazardClass: value.waterHazardClass.modifiedData ?? value.waterHazardClass.originalData, - hPhrases: value.hPhrases.modifiedData ?? value.hPhrases.originalData, - pPhrases: value.pPhrases.modifiedData ?? value.pPhrases.originalData, - signalWord: value.signalWord.modifiedData ?? value.signalWord.originalData, - symbols: value.symbols.modifiedData ?? value.symbols.originalData, - lethalDose: value.lethalDose.modifiedData ?? value.lethalDose.originalData, - mak: value.mak.modifiedData ?? value.mak.originalData, - amount: value.amount, - }; - }), - ), - map((substances) => { - for (let i = substances.length; i < 5; i++) { - substances.push({ - name: '', - cas: '', - molecularFormula: '', - molarMass: '', - meltingPoint: '', - boilingPoint: '', - waterHazardClass: '', - hPhrases: [], - pPhrases: [], - signalWord: '', - symbols: [], - lethalDose: '', - mak: '', - }); - } - return substances; - }), - ) - .subscribe((data) => (this.substanceData = data)); - } - - getPhraseNumber(phrases: [string, string][]): string[] { - return phrases.map((p) => p[0]); - } - - getHPhrases(): Set { - const phraseSet = new Set(); - this.substanceData.flatMap((data) => data.hPhrases).forEach((phrase) => phraseSet.add(phrase.join(':\u00A0'))); - return phraseSet; - } - - getPPhrases(): Set { - const phraseSet = new Set(); - this.substanceData.flatMap((data) => data.pPhrases).forEach((phrase) => phraseSet.add(phrase.join(':\u00A0'))); - return phraseSet; - } - - getProviders(): string { - return Array.from(this.sources.values()).join(', '); - } -} diff --git a/src/app/components/security-things/security-things.component.html b/src/app/components/security-things/security-things.component.html deleted file mode 100644 index a0c3f8ea5..000000000 --- a/src/app/components/security-things/security-things.component.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - diff --git a/src/app/components/security-things/security-things.component.ts b/src/app/components/security-things/security-things.component.ts deleted file mode 100644 index 97178eb82..000000000 --- a/src/app/components/security-things/security-things.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; - -import { GlobalModel } from 'src/app/@core/models/global.model'; - -@Component({ - selector: 'app-security-things', - templateUrl: './security-things.component.html', - styleUrls: ['./security-things.component.scss'], -}) -export class SecurityThingsComponent { - constructor(public globals: GlobalModel) {} -} diff --git a/webserver/.gitignore b/webserver/.gitignore new file mode 100644 index 000000000..2f7896d1d --- /dev/null +++ b/webserver/.gitignore @@ -0,0 +1 @@ +target/ diff --git a/webserver/Cargo.lock b/webserver/Cargo.lock new file mode 100644 index 000000000..04cbcd5ae --- /dev/null +++ b/webserver/Cargo.lock @@ -0,0 +1,2018 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "0.7.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +dependencies = [ + "memchr", +] + +[[package]] +name = "async-trait" +version = "0.1.52" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "base-x" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" +dependencies = [ + "block-padding", + "byte-tools", + "byteorder", + "generic-array 0.12.4", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "block-padding" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" +dependencies = [ + "byte-tools", +] + +[[package]] +name = "buf_redux" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" +dependencies = [ + "memchr", + "safemem", +] + +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "byte-tools" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "time 0.1.44", + "winapi", +] + +[[package]] +name = "config" +version = "0.0.0" +dependencies = [ + "base64", + "directories-next", + "lazy_static", + "log", + "serde", + "serde_json", + "thiserror", + "tokio", + "toml", + "types", +] + +[[package]] +name = "const_fn" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" + +[[package]] +name = "core-foundation" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "738c290dfaea84fc1ca15ad9c168d083b05a714e1efddd8edaab678dc28d2836" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "digest" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" +dependencies = [ + "generic-array 0.12.4", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array 0.14.5", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" + +[[package]] +name = "dtoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" + +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +dependencies = [ + "encoding-index-japanese", + "encoding-index-korean", + "encoding-index-simpchinese", + "encoding-index-singlebyte", + "encoding-index-tradchinese", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +dependencies = [ + "encoding_index_tests", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" + +[[package]] +name = "encoding_rs" +version = "0.8.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "error-ser" +version = "0.0.0" +dependencies = [ + "serde", +] + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" + +[[package]] +name = "fastrand" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779d043b6a0b90cc4c0ed7ee380a6504394cee7efd7db050e3774eee387324b2" +dependencies = [ + "instant", +] + +[[package]] +name = "fern" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c9a4820f0ccc8a7afd67c39a0f1a0f4b07ca1725164271a64939d7aeb9af065" +dependencies = [ + "log", +] + +[[package]] +name = "flate2" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3dda0b6588335f360afc675d0564c17a77a2bda81ca178a4b6081bd86c7f0b" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c8ff0461b82559810cdccfde3215c3f373807f5e5232b71479bff7bb2583d7" + +[[package]] +name = "futures-sink" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3055baccb68d74ff6480350f8d6eb8fcfa3aa11bdc1a1ae3afdd0514617d508" + +[[package]] +name = "futures-task" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ee7c6485c30167ce4dfb83ac568a849fe53274c831081476ee13e0dce1aad72" + +[[package]] +name = "futures-util" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5cf40b47a271f77a8b1bec03ca09044d99d2372c0de244e66430761127164" +dependencies = [ + "futures-core", + "futures-sink", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" +dependencies = [ + "typenum", +] + +[[package]] +name = "generic-array" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418d37c8b1d42553c93648be529cb70f920d3baf8ef469b74b9638df426e0b4c" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "h2" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9de88456263e249e241fcd211d3954e2c9b0ef7ccfc235a444eb367cae3689" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "handlebars" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2483bce82dd3ed52509d0117e4a30a488bd608be250ed7a0185301314239ed31" +dependencies = [ + "log", + "pest", + "pest_derive", + "quick-error 2.0.1", + "serde", + "serde_json", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "headers" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c4eb0471fcb85846d8b0690695ef354f9afb11cb03cac2e1d7c9253351afb0" +dependencies = [ + "base64", + "bitflags", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha-1 0.9.8", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f4c6746584866f0feabcc69893c5b51beef3831656a968ed7ae254cdc4fd03" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.1", +] + +[[package]] +name = "http-body" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 0.4.8", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "js-sys" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.112" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" + +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + +[[package]] +name = "load_save" +version = "0.0.0" +dependencies = [ + "async-trait", + "chrono", + "config", + "error-ser", + "handlebars", + "lazy_static", + "log", + "lopdf", + "quick-xml 0.22.0", + "regex", + "serde", + "serde_json", + "thiserror", + "tokio", + "types", + "wkhtmltopdf", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "logger" +version = "0.0.0" +dependencies = [ + "chrono", + "config", + "fern", + "log", + "tokio", + "types", +] + +[[package]] +name = "lopdf" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8146695b97752d9c66da0092c6364f8f3ca683f5ea34341db21e5550c3b8c4f4" +dependencies = [ + "chrono", + "dtoa", + "encoding", + "flate2", + "itoa 0.4.8", + "lazy_static", + "linked-hash-map", + "log", + "pom", + "time 0.2.27", + "weezl", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "multipart" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00dec633863867f29cb39df64a397cdf4a6354708ddd7759f70c7fb51c5f9182" +dependencies = [ + "buf_redux", + "httparse", + "log", + "mime", + "mime_guess", + "quick-error 1.2.3", + "rand", + "safemem", + "tempfile", + "twoway", +] + +[[package]] +name = "native-tls" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" + +[[package]] +name = "opaque-debug" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7ae222234c30df141154f159066c5093ff73b63204dcda7121eb082fc56a95" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e46109c383602735fa0a2e48dd2b7c892b048e1bf69e5c3b1d804b7d9c203cb" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pest" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" +dependencies = [ + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pest_meta" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" +dependencies = [ + "maplit", + "pest", + "sha-1 0.8.2", +] + +[[package]] +name = "pin-project" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" + +[[package]] +name = "pom" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e2192780e9f8e282049ff9bffcaa28171e1cb0844f49ed5374e518ae6024ec" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8533f14c8382aaad0d592c812ac3b826162128b65662331e1127b45c3d18536b" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.23.0-alpha3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c002cfafa1de674ef8557e3dbf2ad8c03ac8eb3d162672411b1b7fb4d272ef" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom", + "redox_syscall 0.2.10", +] + +[[package]] +name = "regex" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f242f1488a539a79bac6dbe7c8609ae43b7914b7736210f239a37cccb32525" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "search" +version = "0.0.0" +dependencies = [ + "async-trait", + "cfg-if", + "chrono", + "error-ser", + "lazy_static", + "log", + "quick-xml 0.23.0-alpha3", + "regex", + "reqwest", + "serde", + "serde_json", + "thiserror", + "types", +] + +[[package]] +name = "security-framework" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c059c05b48c5c0067d4b4b2b4f0732dd65feb52daf7e0ea09cd87e7dadc1af79" +dependencies = [ + "itoa 1.0.1", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +dependencies = [ + "form_urlencoded", + "itoa 0.4.8", + "ryu", + "serde", +] + +[[package]] +name = "sha-1" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" +dependencies = [ + "block-buffer 0.7.3", + "digest 0.8.1", + "fake-simd", + "opaque-debug 0.2.3", +] + +[[package]] +name = "sha-1" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug 0.3.0", +] + +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" + +[[package]] +name = "slab" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" + +[[package]] +name = "socket2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "standback" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" +dependencies = [ + "version_check", +] + +[[package]] +name = "stdweb" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" +dependencies = [ + "discard", + "rustc_version", + "stdweb-derive", + "stdweb-internal-macros", + "stdweb-internal-runtime", + "wasm-bindgen", +] + +[[package]] +name = "stdweb-derive" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "stdweb-internal-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" +dependencies = [ + "base-x", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "serde_json", + "sha1", + "syn", +] + +[[package]] +name = "stdweb-internal-runtime" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" + +[[package]] +name = "syn" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tempfile" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +dependencies = [ + "cfg-if", + "fastrand", + "libc", + "redox_syscall 0.2.10", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread-id" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7fbf4c9d56b320106cd64fd024dadfa0be7cb4706725fc44a7d7ce952d820c1" +dependencies = [ + "libc", + "redox_syscall 0.1.57", + "winapi", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + +[[package]] +name = "time" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" +dependencies = [ + "const_fn", + "libc", + "standback", + "stdweb", + "time-macros", + "version_check", + "winapi", +] + +[[package]] +name = "time-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" +dependencies = [ + "proc-macro-hack", + "time-macros-impl", +] + +[[package]] +name = "time-macros-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "standback", + "syn", +] + +[[package]] +name = "tinyvec" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c27a64b625de6d309e8c57716ba93021dccf1b3b5c97edd6d3dd2d2135afc0a" +dependencies = [ + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "pin-project-lite", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511de3f85caf1c98983545490c3d09685fa8eb634e57eec22bb4db271f46cbd8" +dependencies = [ + "futures-util", + "log", + "pin-project", + "tokio", + "tungstenite", +] + +[[package]] +name = "tokio-util" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "indexmap", + "serde", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "tungstenite" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0b2d8558abd2e276b0a8df5c05a2ec762609344191e5fd23e292c910e9165b5" +dependencies = [ + "base64", + "byteorder", + "bytes", + "http", + "httparse", + "log", + "rand", + "sha-1 0.9.8", + "thiserror", + "url", + "utf-8", +] + +[[package]] +name = "twoway" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" +dependencies = [ + "memchr", +] + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "types" +version = "0.0.0" +dependencies = [ + "cfg-if", + "chrono", + "log", + "serde", + "tokio", +] + +[[package]] +name = "ucd-trie" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "warp" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cef4e1e9114a4b7f1ac799f16ce71c14de5778500c5450ec6b7b920c55b587e" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "headers", + "http", + "hyper", + "log", + "mime", + "mime_guess", + "multipart", + "percent-encoding", + "pin-project", + "scoped-tls", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tokio-util", + "tower-service", + "tracing", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasm-bindgen" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" + +[[package]] +name = "web-sys" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webserver" +version = "0.5.0" +dependencies = [ + "config", + "load_save", + "log", + "logger", + "search", + "serde", + "tokio", + "types", + "uuid", + "warp", +] + +[[package]] +name = "weezl" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b77fdfd5a253be4ab714e4ffa3c49caf146b4de743e97510c0656cf90f1e8e" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "wkhtmltopdf" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a238dfc65ae5e3f766f1cbf6d97ddc7d57e68524178739aa535caecc1f6365eb" +dependencies = [ + "lazy_static", + "log", + "quick-error 1.2.3", + "thread-id", + "url", + "wkhtmltox-sys", +] + +[[package]] +name = "wkhtmltox-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab0405f2aa72bed0966b1bf52964ab82035ff4d420bda535f162461875ab1b1d" diff --git a/webserver/Cargo.toml b/webserver/Cargo.toml new file mode 100644 index 000000000..81fc22dc7 --- /dev/null +++ b/webserver/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "webserver" +version = "0.5.0" +edition = "2021" +description = 'CaBr2 backend as webserver.' +authors = [ + "crapStone ", + "6543 <6543@obermui.de>", +] +license = "GPLv3+" +repository = "https://github.com/Calciumdibromid/CaBr2/" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +config = { path = "../crates/config/", features = [ "webserver" ]} +load_save = { path = "../crates/load_save/" } +log = "0.4.14" +logger = { path = "../crates/logger/" } +search = { path = "../crates/search/" } +serde = { version = "1.0.136", features = ["derive"] } +tokio = { version = "1.16.1", features = ["macros", "rt-multi-thread"] } +types = { path = "../crates/types/" } +uuid = { version = "0.8.2", features = ["serde", "v4"] } +warp = "0.3.2" + +[features] +portable = [ "config/portable" ] + +# load_save file types +beryllium = [ "load_save/beryllium" ] +cabr2 = [ "load_save/cabr2" ] +pdf = [ "load_save/pdf" ] + +# search providers +gestis = [ "search/gestis" ] + +default = [ "beryllium", "cabr2", "pdf", "gestis" ] + +[profile.release] +panic = "abort" +codegen-units = 1 +lto = true diff --git a/webserver/README.md b/webserver/README.md new file mode 100644 index 000000000..66428a392 --- /dev/null +++ b/webserver/README.md @@ -0,0 +1,47 @@ +# CaBr2 Webserver + +This is the CaBr2 REST webserver. +It is a complete implementation of the CaBr2 logic as REST API for use in the web app and possible mobile apps. + +In the `src/impl` folder there is the glue code for the CaBr2 logic. + +The webserver is written in rust with [`warp`](https://lib.rs/crates/warp). + +## Build + +In order to build the webserver you must first install [rust](https://www.rust-lang.org/tools/install). + +If you want to generate PDFs hava a look at the +[wkhtmltopdf section in the frontend README](../frontend/README.md#wkhtmltopdf) + +The webserver will be built with all features enabled by default with the following command: + +```bash +cargo build --release +``` + +If you only want specific features use the following command and add a space separated list of the features you want +after `--features`: + +```bash +cargo build --no-default-features --features "portable pdf" +``` + +These features are available: + +| Name | Explanation | +|--------------|---------------------------------------------------------------------------------| +| `portable` | the config and all required assets are located in the same folder as the binary | +| `beryllium` | the Beryllium10 file reader | +| `cabr2` | load and save CaBr2 files | +| `pdf` | export the safety datasheet as PDF | +| `gestis` | search for substances in the Gestis database | + +## Code Checking + +We use `clippy` for linting and `cargo fmt` to check the formatting of the code: + +```bash +cargo clippy --all-features -- --deny clippy::all +cargo fmt +``` diff --git a/webserver/rustfmt.toml b/webserver/rustfmt.toml new file mode 100644 index 000000000..93db0f0ab --- /dev/null +++ b/webserver/rustfmt.toml @@ -0,0 +1,13 @@ +max_width = 120 +hard_tabs = false +tab_spaces = 2 +newline_style = "Unix" +use_small_heuristics = "Default" +reorder_imports = true +reorder_modules = true +remove_nested_parens = true +edition = "2021" +merge_derives = true +use_try_shorthand = false +use_field_init_shorthand = false +force_explicit_abi = true diff --git a/src-tauri/cabr2_config/src/webserver.rs b/webserver/src/impls/config.rs similarity index 95% rename from src-tauri/cabr2_config/src/webserver.rs rename to webserver/src/impls/config.rs index 33127cb74..e6a6c6091 100644 --- a/src-tauri/cabr2_config/src/webserver.rs +++ b/webserver/src/impls/config.rs @@ -3,9 +3,9 @@ use std::convert::Infallible; use serde::Deserialize; use warp::{hyper::StatusCode, Reply}; -use cabr2_types::webserver::generate_error_reply; +use config::handler; -use crate::handler; +use super::types::generate_error_reply; pub async fn handle_hazard_symbols() -> Result { match handler::get_hazard_symbols().await { diff --git a/src-tauri/cabr2_load_save/src/webserver.rs b/webserver/src/impls/load_save.rs similarity index 94% rename from src-tauri/cabr2_load_save/src/webserver.rs rename to webserver/src/impls/load_save.rs index 9797527d4..6576c5222 100644 --- a/src-tauri/cabr2_load_save/src/webserver.rs +++ b/webserver/src/impls/load_save.rs @@ -1,14 +1,14 @@ use std::{convert::Infallible, path::PathBuf, time::Duration}; -use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use tokio::fs; use uuid::Uuid; use warp::{hyper::StatusCode, Reply}; -use cabr2_types::{webserver::generate_error_reply, ProviderMapping}; +use load_save::{error::LoadSaveError, handler, types::CaBr2Document}; +use types::ProviderMapping; -use crate::{error::LoadSaveError, handler, types::CaBr2Document}; +use super::types::generate_error_reply; pub const DOWNLOAD_FOLDER: &str = "/tmp/cabr2_server/created"; pub const CACHE_FOLDER: &str = "/tmp/cabr2_server/cache"; @@ -68,14 +68,10 @@ struct SaveDocumentResponse { } pub async fn handle_save_document(body: SaveDocumentBody) -> Result { - lazy_static! { - static ref TMP: PathBuf = PathBuf::from(DOWNLOAD_FOLDER); - } - let mut path; let mut uuid_str; loop { - path = TMP.clone(); + path = PathBuf::from(DOWNLOAD_FOLDER); uuid_str = Uuid::new_v4().to_hyphenated().to_string(); path.push(format!("{}.{}", uuid_str, body.file_type)); diff --git a/webserver/src/impls/mod.rs b/webserver/src/impls/mod.rs new file mode 100644 index 000000000..e33dfa75c --- /dev/null +++ b/webserver/src/impls/mod.rs @@ -0,0 +1,4 @@ +pub(crate) mod config; +pub(crate) mod load_save; +pub(crate) mod search; +pub(crate) mod types; diff --git a/src-tauri/cabr2_search/src/webserver.rs b/webserver/src/impls/search.rs similarity index 96% rename from src-tauri/cabr2_search/src/webserver.rs rename to webserver/src/impls/search.rs index c3e8491aa..af939e63a 100644 --- a/src-tauri/cabr2_search/src/webserver.rs +++ b/webserver/src/impls/search.rs @@ -3,16 +3,16 @@ use std::{collections::HashMap, convert::Infallible}; use serde::Deserialize; use warp::{hyper::StatusCode, Reply}; -use cabr2_types::webserver::generate_error_reply; - -use crate::{ +use search::{ error::SearchError, handler, types::{SearchArgument, SearchArguments}, }; +use super::types::generate_error_reply; + pub async fn init() { - handler::init_providers().await.unwrap(); + handler::init_providers(env!("CARGO_PKG_VERSION")).await.unwrap(); } pub async fn get_provider_mapping() -> HashMap { diff --git a/src-tauri/cabr2_types/src/webserver.rs b/webserver/src/impls/types.rs similarity index 100% rename from src-tauri/cabr2_types/src/webserver.rs rename to webserver/src/impls/types.rs diff --git a/src-tauri/src/webserver.rs b/webserver/src/main.rs similarity index 79% rename from src-tauri/src/webserver.rs rename to webserver/src/main.rs index 8696ed6d8..35c95d3dc 100644 --- a/src-tauri/src/webserver.rs +++ b/webserver/src/main.rs @@ -1,16 +1,22 @@ +mod impls; + use std::fs; use warp::Filter; -use cabr2_load_save::webserver::{CACHE_FOLDER, DOWNLOAD_FOLDER}; +use crate::impls::{ + config, + load_save::{self, CACHE_FOLDER, DOWNLOAD_FOLDER}, + search, +}; #[tokio::main] pub async fn main() { // must be initialized first - cabr2_logger::setup_logger().await.unwrap(); + logger::setup_logger().await.unwrap(); - cabr2_search::webserver::init().await; - cabr2_load_save::webserver::init(cabr2_search::webserver::get_provider_mapping().await).await; + search::init().await; + load_save::init(search::get_provider_mapping().await).await; // create tmp folders handle_result(fs::create_dir_all(DOWNLOAD_FOLDER)); @@ -19,24 +25,24 @@ pub async fn main() { let search_available_providers = warp::path("availableProviders") .and(warp::path::end()) .and(warp::get()) - .and_then(cabr2_search::webserver::handle_available_providers); + .and_then(search::handle_available_providers); let search_suggestions = warp::path("suggestions") .and(warp::post()) .and(warp::body::json()) - .and_then(cabr2_search::webserver::handle_suggestions); + .and_then(search::handle_suggestions); let search_results = warp::path("results") .and(warp::path::end()) .and(warp::post()) .and(warp::body::json()) - .and_then(cabr2_search::webserver::handle_results); + .and_then(search::handle_results); let search_substances = warp::path("substances") .and(warp::path::end()) .and(warp::post()) .and(warp::body::json()) - .and_then(cabr2_search::webserver::handle_substances); + .and_then(search::handle_substances); let search = warp::path("search") .and(search_available_providers.or(search_suggestions.or(search_results.or(search_substances)))); @@ -44,23 +50,23 @@ pub async fn main() { let config_programversion = warp::path("programVersion") .and(warp::path::end()) .and(warp::get()) - .and_then(cabr2_config::webserver::handle_program_version); + .and_then(config::handle_program_version); let config_hazard_symbols = warp::path("hazardSymbols") .and(warp::path::end()) .and(warp::get()) - .and_then(cabr2_config::webserver::handle_hazard_symbols); + .and_then(config::handle_hazard_symbols); let config_available_languages = warp::path("availableLanguages") .and(warp::path::end()) .and(warp::get()) - .and_then(cabr2_config::webserver::handle_available_languages); + .and_then(config::handle_available_languages); let config_localized_strings = warp::path("localizedStrings") .and(warp::path::end()) .and(warp::post()) .and(warp::body::json()) - .and_then(cabr2_config::webserver::handle_localized_strings); + .and_then(config::handle_localized_strings); let config = warp::path("config") .and(config_programversion.or(config_hazard_symbols.or(config_available_languages.or(config_localized_strings)))); @@ -68,19 +74,19 @@ pub async fn main() { let load_save_available_document_types = warp::path("availableDocumentTypes") .and(warp::path::end()) .and(warp::get()) - .and_then(cabr2_load_save::webserver::handle_available_document_types); + .and_then(load_save::handle_available_document_types); let load_save_load_document = warp::path("loadDocument") .and(warp::path::end()) .and(warp::post()) .and(warp::body::json()) - .and_then(cabr2_load_save::webserver::handle_load_document); + .and_then(load_save::handle_load_document); let load_save_save_document = warp::path("saveDocument") .and(warp::path::end()) .and(warp::post()) .and(warp::body::json()) - .and_then(cabr2_load_save::webserver::handle_save_document); + .and_then(load_save::handle_save_document); let load_save = warp::path("loadSave").and( load_save_available_document_types @@ -132,7 +138,7 @@ pub async fn main() { */ log::info!("Starting cleanup thread..."); - tokio::spawn(cabr2_load_save::webserver::cleanup_thread()); + tokio::spawn(load_save::cleanup_thread()); log::info!("server starting..."); // On debug builds it runs on `http://localhost:3030`,