diff --git a/apiferia/.editorconfig b/apiferia/.editorconfig
new file mode 100644
index 00000000..59d9a3a3
--- /dev/null
+++ b/apiferia/.editorconfig
@@ -0,0 +1,16 @@
+# Editor configuration, see https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.ts]
+quote_type = single
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false
diff --git a/apiferia/.gitignore b/apiferia/.gitignore
new file mode 100644
index 00000000..0711527e
--- /dev/null
+++ b/apiferia/.gitignore
@@ -0,0 +1,42 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# Compiled output
+/dist
+/tmp
+/out-tsc
+/bazel-out
+
+# Node
+/node_modules
+npm-debug.log
+yarn-error.log
+
+# IDEs and editors
+.idea/
+.project
+.classpath
+.c9/
+*.launch
+.settings/
+*.sublime-workspace
+
+# Visual Studio Code
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+.history/*
+
+# Miscellaneous
+/.angular/cache
+.sass-cache/
+/connect.lock
+/coverage
+/libpeerconnection.log
+testem.log
+/typings
+
+# System files
+.DS_Store
+Thumbs.db
diff --git a/apiferia/.prettierrc b/apiferia/.prettierrc
new file mode 100644
index 00000000..3fa77edf
--- /dev/null
+++ b/apiferia/.prettierrc
@@ -0,0 +1,9 @@
+{
+ "bracketSpacing": true,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "es5",
+ "useTabs": false,
+ "tabWidth": 2,
+ "arrowParens": "always"
+}
diff --git a/apiferia/README.md b/apiferia/README.md
new file mode 100644
index 00000000..ac507c51
--- /dev/null
+++ b/apiferia/README.md
@@ -0,0 +1,27 @@
+# Reback
+
+This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.0.3.
+
+## Development server
+
+Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
+
+## Code scaffolding
+
+Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
+
+## Build
+
+Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
+
+## Running unit tests
+
+Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
+
+## Running end-to-end tests
+
+Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
+
+## Further help
+
+To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
diff --git a/apiferia/angular.json b/apiferia/angular.json
new file mode 100644
index 00000000..74a1e2c5
--- /dev/null
+++ b/apiferia/angular.json
@@ -0,0 +1,167 @@
+{
+ "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+ "version": 1,
+ "newProjectRoot": "projects",
+ "projects": {
+ "Reback": {
+ "projectType": "application",
+ "schematics": {
+ "@schematics/angular:component": {
+ "style": "scss"
+ }
+ },
+ "root": "",
+ "sourceRoot": "src",
+ "prefix": "app",
+ "architect": {
+ "build": {
+ "builder": "@angular-devkit/build-angular:application",
+ "options": {
+ "outputPath": "dist/reback",
+ "index": "src/index.html",
+ "browser": "src/main.ts",
+ "polyfills": [
+ "zone.js",
+ "src/polyfills.ts",
+ "@angular/localize/init"
+ ],
+ "tsConfig": "tsconfig.app.json",
+ "inlineStyleLanguage": "scss",
+ "assets": [
+ "src/favicon.ico",
+ "src/assets"
+ ],
+ "styles": [
+ "node_modules/swiper/swiper-bundle.min.css",
+ "node_modules/flatpickr/dist/flatpickr.css",
+ "src/assets/scss/icons.scss",
+ "node_modules/ngx-toastr/toastr.css",
+ "src/assets/scss/app.scss",
+ "src/assets/css/bootstrap.css",
+ "src/assets/css/swiper-bundle.min.css",
+ "src/assets/css/animate.css",
+ "src/assets/css/jquery.fancybox.min.css",
+ "src/assets/css/magnific-popup.css",
+ "src/assets/css/nice-select.css",
+ "src/assets/css/font-awesome.css",
+ "src/assets/css/styles.css",
+ "src/styles.scss"
+ ],
+ "scripts": [
+ "node_modules/gumshoejs/dist/gumshoe.polyfills.js",
+ "node_modules/jsvectormap/dist/js/jsvectormap.min.js",
+ "src/assets/js/jquery.min.js",
+ "src/assets/js/bootstrap.min.js",
+ "src/assets/js/swiper-bundle.min.js",
+ "src/assets/js/jquery.fancybox.js",
+ "src/assets/js/jquery.nice-select.min.js",
+ "src/assets/js/lazysize.min.js",
+ "src/assets/js/main.js"
+ ],
+ "allowedCommonJsDependencies": [
+ "jsvectormap",
+ "jsvectormap/dist/maps/world.js",
+ "jsvectormap/dist/maps/russia.js",
+ "jsvectormap/dist/maps/canada.js",
+ "jsvectormap/dist/maps/iraq.js",
+ "jsvectormap/dist/maps/spain.js",
+ "dropzone",
+ "deepmerge",
+ "can-use-dom",
+ "choices.js",
+ "gumshoejs",
+ "quill-delta",
+ "apexcharts",
+ "dayjs",
+ "moment",
+ "sweetalert2",
+ "jquery",
+ "bootstrap",
+ "swiper"
+ ],
+ "stylePreprocessorOptions": {
+ "sass": {
+ "silenceDeprecations": [
+ "color-functions",
+ "global-builtin",
+ "import",
+ "mixed-decls"
+ ]
+ }
+ }
+ },
+ "configurations": {
+ "production": {
+ "budgets": [
+ {
+ "type": "initial",
+ "maximumWarning": "8mb",
+ "maximumError": "8mb"
+ },
+ {
+ "type": "anyComponentStyle",
+ "maximumWarning": "2kb",
+ "maximumError": "4kb"
+ }
+ ],
+ "outputHashing": "all",
+ "optimization": {
+ "scripts": true,
+ "styles": {
+ "minify": true,
+ "inlineCritical": false
+ }
+ }
+ },
+ "development": {
+ "optimization": false,
+ "extractLicenses": false,
+ "sourceMap": true
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "serve": {
+ "builder": "@angular-devkit/build-angular:dev-server",
+ "configurations": {
+ "production": {
+ "buildTarget": "Reback:build:production"
+ },
+ "development": {
+ "buildTarget": "Reback:build:development"
+ }
+ },
+ "defaultConfiguration": "development"
+ },
+ "extract-i18n": {
+ "builder": "@angular-devkit/build-angular:extract-i18n",
+ "options": {
+ "buildTarget": "hyper:build"
+ }
+ },
+ "test": {
+ "builder": "@angular-devkit/build-angular:karma",
+ "options": {
+ "polyfills": [
+ "zone.js",
+ "zone.js/testing"
+ ],
+ "tsConfig": "tsconfig.spec.json",
+ "inlineStyleLanguage": "scss",
+ "assets": [
+ "src/favicon.ico",
+ "src/assets"
+ ],
+ "styles": [
+ "src/styles.scss"
+ ],
+ "scripts": []
+ }
+ }
+ }
+ }
+ },
+ "cli": {
+ "analytics": false
+ }
+}
\ No newline at end of file
diff --git a/apiferia/package-lock.json b/apiferia/package-lock.json
new file mode 100644
index 00000000..e2794359
--- /dev/null
+++ b/apiferia/package-lock.json
@@ -0,0 +1,17957 @@
+{
+ "name": "reback",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "reback",
+ "version": "0.0.0",
+ "dependencies": {
+ "@angular/animations": "^19.0.6",
+ "@angular/cdk": "^19.0.5",
+ "@angular/common": "^19.0.6",
+ "@angular/compiler": "^19.0.6",
+ "@angular/core": "^19.0.6",
+ "@angular/forms": "^19.0.6",
+ "@angular/google-maps": "^19.0.2",
+ "@angular/platform-browser": "^19.0.6",
+ "@angular/platform-browser-dynamic": "^19.0.6",
+ "@angular/router": "^19.0.6",
+ "@ckeditor/ckeditor5-angular": "^9.1.0",
+ "@ckeditor/ckeditor5-build-classic": "^44.3.0",
+ "@ctrl/ngx-emoji-mart": "^9.2.0",
+ "@fullcalendar/angular": "^6.1.17",
+ "@fullcalendar/bootstrap": "^6.1.17",
+ "@fullcalendar/core": "^6.1.17",
+ "@fullcalendar/daygrid": "^6.1.17",
+ "@fullcalendar/interaction": "^6.1.17",
+ "@fullcalendar/list": "^6.1.17",
+ "@fullcalendar/timegrid": "^6.1.17",
+ "@iconify-json/iconamoon": "^1.2.2",
+ "@iconify/utils": "^2.3.0",
+ "@ng-bootstrap/ng-bootstrap": "^18.0.0",
+ "@ngrx/effects": "^19.1.0",
+ "@ngrx/store": "^19.1.0",
+ "@ngrx/store-devtools": "^19.1.0",
+ "@popperjs/core": "^2.11.8",
+ "angularx-flatpickr": "^8.1.0",
+ "apexcharts": "^4.5.0",
+ "bootstrap": "^5.3.5",
+ "choices.js": "^11.1.0",
+ "ckeditor5": "^44.3.0",
+ "dayjs": "^1.11.13",
+ "flatpickr": "^4.6.13",
+ "gumshoejs": "^5.1.2",
+ "iconify-icon": "^2.3.0",
+ "jsvectormap": "1.3.3",
+ "moment": "^2.30.1",
+ "ng-apexcharts": "^1.15.0",
+ "ng2-nouislider": "^2.0.0",
+ "ngrx-store-localstorage": "^19.0.0",
+ "ngx-clipboard": "^16.0.0",
+ "ngx-cookie-service": "^19.1.2",
+ "ngx-dropzone-wrapper": "^17.0.0",
+ "ngx-mask": "^19.0.6",
+ "ngx-progressbar": "^14.0.0",
+ "ngx-quill": "^27.0.1",
+ "ngx-toastr": "^19.0.0",
+ "nouislider": "^15.8.1",
+ "npm": "^11.2.0",
+ "prettier": "^3.5.3",
+ "quill": "^2.0.3",
+ "quill-delta": "^5.1.0",
+ "rxjs": "~7.8.2",
+ "simplebar-angular": "3.2.4",
+ "sweetalert2": "^11.17.2",
+ "swiper": "^11.2.6",
+ "tslib": "^2.8.1",
+ "zone.js": "~0.15.0"
+ },
+ "devDependencies": {
+ "@angular-devkit/build-angular": "^19.0.7",
+ "@angular/cli": "^19.0.7",
+ "@angular/compiler-cli": "^19.0.0",
+ "@angular/localize": "^19.0.0",
+ "@types/jasmine": "~5.1.0",
+ "jasmine-core": "~5.1.0",
+ "karma": "~6.4.0",
+ "karma-chrome-launcher": "~3.2.0",
+ "karma-coverage": "~2.2.0",
+ "karma-jasmine": "~5.1.0",
+ "karma-jasmine-html-reporter": "~2.1.0",
+ "typescript": "~5.8.3",
+ "vite": "^6.2.5"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@angular-devkit/architect": {
+ "version": "0.1902.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.6.tgz",
+ "integrity": "sha512-Dx6yPxpaE5AhP6UtrVRDCc9Ihq9B65LAbmIh3dNOyeehratuaQS0TYNKjbpaevevJojW840DTg80N+CrlfYp9g==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.6",
+ "rxjs": "7.8.1"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+ },
+ "node_modules/@angular-devkit/architect/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@angular-devkit/build-angular": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.2.6.tgz",
+ "integrity": "sha512-alYn3PSsiQML9PzU1VKbmYnIP2ULK/AqfjdeJFh8r6m8ZjUvX1zDy9TdAfC6fykQ2mGHyChteRckbx9uVOyhwQ==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "2.3.0",
+ "@angular-devkit/architect": "0.1902.6",
+ "@angular-devkit/build-webpack": "0.1902.6",
+ "@angular-devkit/core": "19.2.6",
+ "@angular/build": "19.2.6",
+ "@babel/core": "7.26.10",
+ "@babel/generator": "7.26.10",
+ "@babel/helper-annotate-as-pure": "7.25.9",
+ "@babel/helper-split-export-declaration": "7.24.7",
+ "@babel/plugin-transform-async-generator-functions": "7.26.8",
+ "@babel/plugin-transform-async-to-generator": "7.25.9",
+ "@babel/plugin-transform-runtime": "7.26.10",
+ "@babel/preset-env": "7.26.9",
+ "@babel/runtime": "7.26.10",
+ "@discoveryjs/json-ext": "0.6.3",
+ "@ngtools/webpack": "19.2.6",
+ "@vitejs/plugin-basic-ssl": "1.2.0",
+ "ansi-colors": "4.1.3",
+ "autoprefixer": "10.4.20",
+ "babel-loader": "9.2.1",
+ "browserslist": "^4.21.5",
+ "copy-webpack-plugin": "12.0.2",
+ "css-loader": "7.1.2",
+ "esbuild-wasm": "0.25.1",
+ "fast-glob": "3.3.3",
+ "http-proxy-middleware": "3.0.3",
+ "istanbul-lib-instrument": "6.0.3",
+ "jsonc-parser": "3.3.1",
+ "karma-source-map-support": "1.4.0",
+ "less": "4.2.2",
+ "less-loader": "12.2.0",
+ "license-webpack-plugin": "4.0.2",
+ "loader-utils": "3.3.1",
+ "mini-css-extract-plugin": "2.9.2",
+ "open": "10.1.0",
+ "ora": "5.4.1",
+ "picomatch": "4.0.2",
+ "piscina": "4.8.0",
+ "postcss": "8.5.2",
+ "postcss-loader": "8.1.1",
+ "resolve-url-loader": "5.0.0",
+ "rxjs": "7.8.1",
+ "sass": "1.85.0",
+ "sass-loader": "16.0.5",
+ "semver": "7.7.1",
+ "source-map-loader": "5.0.0",
+ "source-map-support": "0.5.21",
+ "terser": "5.39.0",
+ "tree-kill": "1.2.2",
+ "tslib": "2.8.1",
+ "webpack": "5.98.0",
+ "webpack-dev-middleware": "7.4.2",
+ "webpack-dev-server": "5.2.0",
+ "webpack-merge": "6.0.1",
+ "webpack-subresource-integrity": "5.1.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "optionalDependencies": {
+ "esbuild": "0.25.1"
+ },
+ "peerDependencies": {
+ "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/localize": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/ssr": "^19.2.6",
+ "@web/test-runner": "^0.20.0",
+ "browser-sync": "^3.0.2",
+ "jest": "^29.5.0",
+ "jest-environment-jsdom": "^29.5.0",
+ "karma": "^6.3.0",
+ "ng-packagr": "^19.0.0 || ^19.2.0-next.0",
+ "protractor": "^7.0.0",
+ "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0",
+ "typescript": ">=5.5 <5.9"
+ },
+ "peerDependenciesMeta": {
+ "@angular/localize": {
+ "optional": true
+ },
+ "@angular/platform-server": {
+ "optional": true
+ },
+ "@angular/service-worker": {
+ "optional": true
+ },
+ "@angular/ssr": {
+ "optional": true
+ },
+ "@web/test-runner": {
+ "optional": true
+ },
+ "browser-sync": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ },
+ "jest-environment-jsdom": {
+ "optional": true
+ },
+ "karma": {
+ "optional": true
+ },
+ "ng-packagr": {
+ "optional": true
+ },
+ "protractor": {
+ "optional": true
+ },
+ "tailwindcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular-devkit/build-angular/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@angular-devkit/build-webpack": {
+ "version": "0.1902.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1902.6.tgz",
+ "integrity": "sha512-SZe2Nk39lJIJmtXWU+zhKaFy0xoU8N7387bvjhO0AoNQeRBaaJ5SrRLXX2jUzGUuVgGVF+plaVooKrmEOeM6ug==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/architect": "0.1902.6",
+ "rxjs": "7.8.1"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.30.0",
+ "webpack-dev-server": "^5.0.2"
+ }
+ },
+ "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@angular-devkit/core": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.6.tgz",
+ "integrity": "sha512-WFgiYhrDMq83UNaGRAneIM7CYYdBozD+yYA9BjoU8AgBLKtrvn6S8ZcjKAk5heoHtY/u8pEb0mwDTz9gxFmJZQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "8.17.1",
+ "ajv-formats": "3.0.1",
+ "jsonc-parser": "3.3.1",
+ "picomatch": "4.0.2",
+ "rxjs": "7.8.1",
+ "source-map": "0.7.4"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "peerDependencies": {
+ "chokidar": "^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular-devkit/core/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@angular-devkit/schematics": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.6.tgz",
+ "integrity": "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.6",
+ "jsonc-parser": "3.3.1",
+ "magic-string": "0.30.17",
+ "ora": "5.4.1",
+ "rxjs": "7.8.1"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+ },
+ "node_modules/@angular-devkit/schematics/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/@angular/animations": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.5.tgz",
+ "integrity": "sha512-m4RtY3z1JuHFCh6OrOHxo25oKEigBDdR/XmdCfXIwfTiObZzNA7VQhysgdrb9IISO99kXbjZUYKDtLzgWT8Klg==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "19.2.5",
+ "@angular/core": "19.2.5"
+ }
+ },
+ "node_modules/@angular/build": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.2.6.tgz",
+ "integrity": "sha512-+VBLb4ZPLswwJmgfsTFzGex+Sq/WveNc+uaIWyHYjwnuI17NXe1qAAg1rlp72CqGn0cirisfOyAUwPc/xZAgTg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "2.3.0",
+ "@angular-devkit/architect": "0.1902.6",
+ "@babel/core": "7.26.10",
+ "@babel/helper-annotate-as-pure": "7.25.9",
+ "@babel/helper-split-export-declaration": "7.24.7",
+ "@babel/plugin-syntax-import-attributes": "7.26.0",
+ "@inquirer/confirm": "5.1.6",
+ "@vitejs/plugin-basic-ssl": "1.2.0",
+ "beasties": "0.2.0",
+ "browserslist": "^4.23.0",
+ "esbuild": "0.25.1",
+ "fast-glob": "3.3.3",
+ "https-proxy-agent": "7.0.6",
+ "istanbul-lib-instrument": "6.0.3",
+ "listr2": "8.2.5",
+ "magic-string": "0.30.17",
+ "mrmime": "2.0.1",
+ "parse5-html-rewriting-stream": "7.0.0",
+ "picomatch": "4.0.2",
+ "piscina": "4.8.0",
+ "rollup": "4.34.8",
+ "sass": "1.85.0",
+ "semver": "7.7.1",
+ "source-map-support": "0.5.21",
+ "vite": "6.2.4",
+ "watchpack": "2.4.2"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "optionalDependencies": {
+ "lmdb": "3.2.6"
+ },
+ "peerDependencies": {
+ "@angular/compiler": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/localize": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/platform-server": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/service-worker": "^19.0.0 || ^19.2.0-next.0",
+ "@angular/ssr": "^19.2.6",
+ "karma": "^6.4.0",
+ "less": "^4.2.0",
+ "ng-packagr": "^19.0.0 || ^19.2.0-next.0",
+ "postcss": "^8.4.0",
+ "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0",
+ "typescript": ">=5.5 <5.9"
+ },
+ "peerDependenciesMeta": {
+ "@angular/localize": {
+ "optional": true
+ },
+ "@angular/platform-server": {
+ "optional": true
+ },
+ "@angular/service-worker": {
+ "optional": true
+ },
+ "@angular/ssr": {
+ "optional": true
+ },
+ "karma": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "ng-packagr": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tailwindcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular/build/node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/@angular/build/node_modules/vite": {
+ "version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz",
+ "integrity": "sha512-veHMSew8CcRzhL5o8ONjy8gkfmFJAd5Ac16oxBUjlwgX3Gq2Wqr+qNC3TjPIpy7TPV/KporLga5GT9HqdrCizw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "postcss": "^8.5.3",
+ "rollup": "^4.30.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular/cdk": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.8.tgz",
+ "integrity": "sha512-ZZqWVYFF80TdjWkk2sc9Pn2luhiYeC78VH3Yjeln4wXMsTGDsvKPBcuOxSxxpJ31saaVBehDjBUuXMqGRj8KuA==",
+ "dependencies": {
+ "parse5": "^7.1.2",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^19.0.0 || ^20.0.0",
+ "@angular/core": "^19.0.0 || ^20.0.0",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
+ "node_modules/@angular/cli": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.2.6.tgz",
+ "integrity": "sha512-eZhFOSsDUHKaciwcWdU5C54ViAvPPdZJf42So93G2vZWDtEq6Uk47huocn1FY9cMhDvURfYLNrrLMpUDtUSsSA==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/architect": "0.1902.6",
+ "@angular-devkit/core": "19.2.6",
+ "@angular-devkit/schematics": "19.2.6",
+ "@inquirer/prompts": "7.3.2",
+ "@listr2/prompt-adapter-inquirer": "2.0.18",
+ "@schematics/angular": "19.2.6",
+ "@yarnpkg/lockfile": "1.1.0",
+ "ini": "5.0.0",
+ "jsonc-parser": "3.3.1",
+ "listr2": "8.2.5",
+ "npm-package-arg": "12.0.2",
+ "npm-pick-manifest": "10.0.0",
+ "pacote": "20.0.0",
+ "resolve": "1.22.10",
+ "semver": "7.7.1",
+ "symbol-observable": "4.0.0",
+ "yargs": "17.7.2"
+ },
+ "bin": {
+ "ng": "bin/ng.js"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+ },
+ "node_modules/@angular/common": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.5.tgz",
+ "integrity": "sha512-vFCBdas4C5PxP6ts/4TlRddWD3DUmI3aaO0QZdZvqyLHy428t84ruYdsJXKaeD8ie2U4/9F3a1tsklclRG/BBA==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/core": "19.2.5",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
+ "node_modules/@angular/compiler": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.5.tgz",
+ "integrity": "sha512-34J+HubQjwkbZ0AUtU5sa4Zouws9XtP/fKaysMQecoYJTZ3jewzLSRu3aAEZX1Y4gIrcVVKKIxM6oWoXKwYMOA==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ }
+ },
+ "node_modules/@angular/compiler-cli": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.2.5.tgz",
+ "integrity": "sha512-b2cG41r6lilApXLlvja1Ra2D00dM3BxmQhoElKC1tOnpD6S3/krlH1DOnBB2I55RBn9iv4zdmPz1l8zPUSh7DQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "7.26.9",
+ "@jridgewell/sourcemap-codec": "^1.4.14",
+ "chokidar": "^4.0.0",
+ "convert-source-map": "^1.5.1",
+ "reflect-metadata": "^0.2.0",
+ "semver": "^7.0.0",
+ "tslib": "^2.3.0",
+ "yargs": "^17.2.1"
+ },
+ "bin": {
+ "ng-xi18n": "bundles/src/bin/ng_xi18n.js",
+ "ngc": "bundles/src/bin/ngc.js",
+ "ngcc": "bundles/ngcc/index.js"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/compiler": "19.2.5",
+ "typescript": ">=5.5 <5.9"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
+ "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.9",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.9",
+ "@babel/parser": "^7.26.9",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.9",
+ "@babel/types": "^7.26.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@angular/core": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.5.tgz",
+ "integrity": "sha512-NNEz1sEZz1mBpgf6Tz3aJ9b8KjqpTiMYhHfCYA9h9Ipe4D8gUmOsvPHPK2M755OX7p7PmUmzp1XCUHYrZMVHRw==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "rxjs": "^6.5.3 || ^7.4.0",
+ "zone.js": "~0.15.0"
+ }
+ },
+ "node_modules/@angular/forms": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.5.tgz",
+ "integrity": "sha512-2Zvy3qK1kOxiAX9fdSaeG48q7oyO/4RlMYlg1w+ra9qX1SrgwF3OQ2P2Vs+ojg1AxN3z9xFp4aYaaID/G2LZAw==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "19.2.5",
+ "@angular/core": "19.2.5",
+ "@angular/platform-browser": "19.2.5",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
+ "node_modules/@angular/google-maps": {
+ "version": "19.2.8",
+ "resolved": "https://registry.npmjs.org/@angular/google-maps/-/google-maps-19.2.8.tgz",
+ "integrity": "sha512-kCTezzgmilDsQD+kIqQovTPC0v9mMEKsg0L6+x9rFqh4anwvB50c2s56mIf7t6p0Ox3Lwf4ZAK9K1UVwAXRRYw==",
+ "dependencies": {
+ "@types/google.maps": "^3.54.10",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^19.0.0 || ^20.0.0",
+ "@angular/core": "^19.0.0 || ^20.0.0",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
+ "node_modules/@angular/localize": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-19.2.5.tgz",
+ "integrity": "sha512-oAc19bubk6Z/2Vv6OkV0MsjdgC8cUaUwBmwdc6blFVe1NCX1KjdaqDyC2EQAO3nWfcdV4uvOOuu8myxB64bamw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "7.26.9",
+ "@types/babel__core": "7.20.5",
+ "fast-glob": "3.3.3",
+ "yargs": "^17.2.1"
+ },
+ "bin": {
+ "localize-extract": "tools/bundles/src/extract/cli.js",
+ "localize-migrate": "tools/bundles/src/migrate/cli.js",
+ "localize-translate": "tools/bundles/src/translate/cli.js"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/compiler": "19.2.5",
+ "@angular/compiler-cli": "19.2.5"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/@babel/core": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
+ "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.9",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.9",
+ "@babel/parser": "^7.26.9",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.9",
+ "@babel/types": "^7.26.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@angular/localize/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/@angular/localize/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@angular/platform-browser": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.5.tgz",
+ "integrity": "sha512-Lshy++X16cvl6OPvfzMySpsqEaCPKEJmDjz7q7oSt96oxlh6LvOeOUVLjsNyrNaIt9NadpWoqjlu/I9RTPJkpw==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/animations": "19.2.5",
+ "@angular/common": "19.2.5",
+ "@angular/core": "19.2.5"
+ },
+ "peerDependenciesMeta": {
+ "@angular/animations": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@angular/platform-browser-dynamic": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.5.tgz",
+ "integrity": "sha512-15in8u4552EcdWNTXY2h0MKuJbk3AuXwWr0zVTum4CfB/Ss2tNTrDEdWhgAbhnUI0e9jZQee/fhBbA1rleMYrA==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "19.2.5",
+ "@angular/compiler": "19.2.5",
+ "@angular/core": "19.2.5",
+ "@angular/platform-browser": "19.2.5"
+ }
+ },
+ "node_modules/@angular/router": {
+ "version": "19.2.5",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.5.tgz",
+ "integrity": "sha512-9pSfmdNXLjaOKj0kd4UxBC7sFdCFOnRGbftp397G3KWqsLsGSKmNFzqhXNeA5QHkaVxnpmpm8HzXU+zYV5JwSg==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "19.2.5",
+ "@angular/core": "19.2.5",
+ "@angular/platform-browser": "19.2.5",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz",
+ "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==",
+ "dependencies": {
+ "package-manager-detector": "^0.2.8",
+ "tinyexec": "^0.3.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@antfu/utils": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz",
+ "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz",
+ "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.26.10",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.10",
+ "@babel/parser": "^7.26.10",
+ "@babel/template": "^7.26.9",
+ "@babel/traverse": "^7.26.10",
+ "@babel/types": "^7.26.10",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
+ "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.26.10",
+ "@babel/types": "^7.26.10",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz",
+ "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.26.8",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz",
+ "integrity": "sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.27.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz",
+ "integrity": "sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz",
+ "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz",
+ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz",
+ "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+ "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
+ "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.27.0",
+ "@babel/types": "^7.27.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
+ "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.27.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz",
+ "integrity": "sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.26.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.26.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz",
+ "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz",
+ "integrity": "sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
+ "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz",
+ "integrity": "sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.26.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
+ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.26.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz",
+ "integrity": "sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz",
+ "integrity": "sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
+ "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.26.10.tgz",
+ "integrity": "sha512-NWaL2qG6HRpONTnj4JvDU6th4jYeZOJgu3QhmFTCihib0ermtOJqktA5BduGm3suhhVe9EMP9c9+mfJ/I9slqw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.11.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.26.8",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz",
+ "integrity": "sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz",
+ "integrity": "sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.26.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.26.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz",
+ "integrity": "sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.26.8",
+ "@babel/helper-compilation-targets": "^7.26.5",
+ "@babel/helper-plugin-utils": "^7.26.5",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.26.0",
+ "@babel/plugin-syntax-import-attributes": "^7.26.0",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.9",
+ "@babel/plugin-transform-async-generator-functions": "^7.26.8",
+ "@babel/plugin-transform-async-to-generator": "^7.25.9",
+ "@babel/plugin-transform-block-scoped-functions": "^7.26.5",
+ "@babel/plugin-transform-block-scoping": "^7.25.9",
+ "@babel/plugin-transform-class-properties": "^7.25.9",
+ "@babel/plugin-transform-class-static-block": "^7.26.0",
+ "@babel/plugin-transform-classes": "^7.25.9",
+ "@babel/plugin-transform-computed-properties": "^7.25.9",
+ "@babel/plugin-transform-destructuring": "^7.25.9",
+ "@babel/plugin-transform-dotall-regex": "^7.25.9",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.9",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-dynamic-import": "^7.25.9",
+ "@babel/plugin-transform-exponentiation-operator": "^7.26.3",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.9",
+ "@babel/plugin-transform-for-of": "^7.26.9",
+ "@babel/plugin-transform-function-name": "^7.25.9",
+ "@babel/plugin-transform-json-strings": "^7.25.9",
+ "@babel/plugin-transform-literals": "^7.25.9",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.9",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.9",
+ "@babel/plugin-transform-modules-amd": "^7.25.9",
+ "@babel/plugin-transform-modules-commonjs": "^7.26.3",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.9",
+ "@babel/plugin-transform-modules-umd": "^7.25.9",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9",
+ "@babel/plugin-transform-new-target": "^7.25.9",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6",
+ "@babel/plugin-transform-numeric-separator": "^7.25.9",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.9",
+ "@babel/plugin-transform-object-super": "^7.25.9",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9",
+ "@babel/plugin-transform-private-methods": "^7.25.9",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.9",
+ "@babel/plugin-transform-property-literals": "^7.25.9",
+ "@babel/plugin-transform-regenerator": "^7.25.9",
+ "@babel/plugin-transform-regexp-modifiers": "^7.26.0",
+ "@babel/plugin-transform-reserved-words": "^7.25.9",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.9",
+ "@babel/plugin-transform-spread": "^7.25.9",
+ "@babel/plugin-transform-sticky-regex": "^7.25.9",
+ "@babel/plugin-transform-template-literals": "^7.26.8",
+ "@babel/plugin-transform-typeof-symbol": "^7.26.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.9",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-regex": "^7.25.9",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.9",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.11.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.40.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
+ "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
+ "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.27.0",
+ "@babel/types": "^7.27.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz",
+ "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "@babel/generator": "^7.27.0",
+ "@babel/parser": "^7.27.0",
+ "@babel/template": "^7.27.0",
+ "@babel/types": "^7.27.0",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/@babel/generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz",
+ "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.27.0",
+ "@babel/types": "^7.27.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
+ "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-adapter-ckfinder": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-44.3.0.tgz",
+ "integrity": "sha512-+LYQi4DJmK87Mx3FU7q8Ei3Jv/BrXScR7P1rJVw9bYSySLISw1lPPGEuzNaDm+aI/IMwxAw6Laf7kp+bBfZg1A==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-upload": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-alignment": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-44.3.0.tgz",
+ "integrity": "sha512-PJLPQPJTaEs/TxmXovb5gZWHFk04VdyFxwpy+LFiVKTewV4T5Mz2jinXwL6+DYmlHh0oDu66O2joSdYeL6F9xw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-angular": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-angular/-/ckeditor5-angular-9.1.0.tgz",
+ "integrity": "sha512-KJYdlH62CLd6EyaeMbFOfc4hsD+uRy9vsBAEEVY4jyTROROmODje4ZnfBtkz4KthuOVaDd+2ykwDQgAQ3gBIYA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-integrations-common": "^2.2.2",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=16.0.0",
+ "@angular/core": ">=16.0.0",
+ "@angular/forms": ">=16.0.0",
+ "ckeditor5": ">=42.0.0 || ^0.0.0-nightly",
+ "rxjs": ">=6.0.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-autoformat": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-44.3.0.tgz",
+ "integrity": "sha512-cKRN73eWaci0px4RL/pu+uFx+/joJyicXjDogqRCqsrHtFnNziAoDxg1aU9F7eReMp+RJc5dqn9R94fZqxdaKQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-heading": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-autosave": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-autosave/-/ckeditor5-autosave-44.3.0.tgz",
+ "integrity": "sha512-vZS8lMUNwtpUplx1WtiywEmgqy2rXSTrwbCqkENZZ6vIOpYZg9sW0XxWAdCMslBiNZRhAF2et3jT+Es01/aEyg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-basic-styles": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-44.3.0.tgz",
+ "integrity": "sha512-QxwJqzIMYD8Nq7I8utEm2N1wFYve3jR9W1RoxrP005V7F9hXubcG4VFkk1QspVjiPBBtWjYJh7Iq6LjeMnDXgg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-block-quote": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-44.3.0.tgz",
+ "integrity": "sha512-J+t36widj2/f1DCZqZjCssOu4hdKCpX/mDWOAJwp4BNIei0NATmtHoblH4Lb98P0mF5UeneoLqR4XZlwMYD7tw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-enter": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-bookmark": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-bookmark/-/ckeditor5-bookmark-44.3.0.tgz",
+ "integrity": "sha512-e3p6hUYC4LavTSVTDaz9VfpMaXpi35HNXqqCpIGJGtMKq7mYPaGf1ZZqIPEWuZz3UH/h/E445Mrm4KOgRo9hfg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-build-classic": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-build-classic/-/ckeditor5-build-classic-44.3.0.tgz",
+ "integrity": "sha512-tvOwT1dAZlY4v1vZItqR0VFfTzr+OLoEmnOW/Lchl2Y0BUWT99GCfABCvAdakBBYvKdsMLsH0jqZFvnLxJCUmg==",
+ "deprecated": "The predefined builds are no longer maintained. Check the https://ckeditor.com/docs/ckeditor5/latest/updating/nim-migration/predefined-builds.html page for the details.",
+ "dependencies": {
+ "@ckeditor/ckeditor5-adapter-ckfinder": "44.3.0",
+ "@ckeditor/ckeditor5-autoformat": "44.3.0",
+ "@ckeditor/ckeditor5-basic-styles": "44.3.0",
+ "@ckeditor/ckeditor5-block-quote": "44.3.0",
+ "@ckeditor/ckeditor5-ckbox": "44.3.0",
+ "@ckeditor/ckeditor5-ckfinder": "44.3.0",
+ "@ckeditor/ckeditor5-cloud-services": "44.3.0",
+ "@ckeditor/ckeditor5-easy-image": "44.3.0",
+ "@ckeditor/ckeditor5-editor-classic": "44.3.0",
+ "@ckeditor/ckeditor5-essentials": "44.3.0",
+ "@ckeditor/ckeditor5-heading": "44.3.0",
+ "@ckeditor/ckeditor5-image": "44.3.0",
+ "@ckeditor/ckeditor5-indent": "44.3.0",
+ "@ckeditor/ckeditor5-link": "44.3.0",
+ "@ckeditor/ckeditor5-list": "44.3.0",
+ "@ckeditor/ckeditor5-media-embed": "44.3.0",
+ "@ckeditor/ckeditor5-paragraph": "44.3.0",
+ "@ckeditor/ckeditor5-paste-from-office": "44.3.0",
+ "@ckeditor/ckeditor5-table": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-ckbox": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckbox/-/ckeditor5-ckbox-44.3.0.tgz",
+ "integrity": "sha512-R0cHl7aafBU1dvfpFu/dMq+7SMTKa7dAi1wQyu5RqmdN0glCAGXoyffe5h2gujcHGlUqzjGE9oX3207rrPi12A==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-cloud-services": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-image": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-upload": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "blurhash": "2.0.5",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-ckfinder": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-44.3.0.tgz",
+ "integrity": "sha512-h/kQy9nUG2VmxAL28b56xZnVQDrr/N12cu2QE+ODfHIiumMNPPTx2Q+g7s8/eVhKAmNQuZJPXygokjXrirC8TA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-image": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-clipboard": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-44.3.0.tgz",
+ "integrity": "sha512-oCQfsHX0Z7RySzszvkpnsFi/p3pqEjpQs4FVpPXXWasK+3F00kWReYNNQFe+0z0eIw7alo/ZzqYTQG/FQHaQUw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-cloud-services": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-44.3.0.tgz",
+ "integrity": "sha512-c/jLU3lhoqPmwfwEXcU9fGw0ab6dQUcUjQUjamBH1x92p6NnEJTtXJD97trwgKJryZWZ6bk7vJG5nOC4i0XDZA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-code-block": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-code-block/-/ckeditor5-code-block-44.3.0.tgz",
+ "integrity": "sha512-LNFRr7OIdvyZTfkmyNW/m48EXTsYdrQyDS/9hp4fpHrv9cC3rHhnP4/rS3vkmPh9FOv5I2JvXS36nn75BjWRRQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-enter": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-core": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-core/-/ckeditor5-core-44.3.0.tgz",
+ "integrity": "sha512-QYyk00JI2wgE2Lr8/A3roRsms3rSOfwMAF88I6Ff2Qf+c8hT6O11gSX18jdd/bGLhfZ0c4IjWc8v67ohgUdMFg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-watchdog": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-easy-image": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-44.3.0.tgz",
+ "integrity": "sha512-s1Qpf45/31J4rW4RC0ArKLb5QqD0VKTn9LCB83qhyCLfGluk18MOZ2Fc7gfYoxZClzhCwdMQE6mhWOC9bQUmPw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-cloud-services": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-upload": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-editor-balloon": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-balloon/-/ckeditor5-editor-balloon-44.3.0.tgz",
+ "integrity": "sha512-Lw6GIIUW37Pi/ErFqx+ozsqRmbBbvhrJhDJ1zIhILEYcwzADHGP32O2pKGLHDf5Z4QTfwunAyG73jvww/ks3kg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-editor-classic": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-44.3.0.tgz",
+ "integrity": "sha512-Vi1tNQdKUCw6X66X2RPhtJPjXJHw/UqHw1Y0J4Vpmi5rf5UHerEj5Sjn+KrjUwDNbmeHtVO/egibLhwRMjKn8A==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-editor-decoupled": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-decoupled/-/ckeditor5-editor-decoupled-44.3.0.tgz",
+ "integrity": "sha512-sG4KO0pPhfwQpiegtncDyL9G7nlCsjcWqDieZvRfwy2Uig7EaChny3BoIQhacjO4xKV8ZhXw+dTBJgZRtfePdQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-editor-inline": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-inline/-/ckeditor5-editor-inline-44.3.0.tgz",
+ "integrity": "sha512-asa9uWhdTGA6BDda7leJEj57UT3lkDmFAHPFL7fWsvQpL2mszbdf7P6L/rOedGcj2/7a9F8CZfb5aVmENrM3Zw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-editor-multi-root": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-editor-multi-root/-/ckeditor5-editor-multi-root-44.3.0.tgz",
+ "integrity": "sha512-2k13l0m9+UGMDOzz2uGkj706iMFsayvn+wp6D4niGUOoDGtKOZSX6gNUwq+WcHJ2+54fsXAAJ2xVZB9juXSuhg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-emoji": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-emoji/-/ckeditor5-emoji-44.3.0.tgz",
+ "integrity": "sha512-NevoSyV8f9F44oTYFJ8DVaOGmqS1XzCisg/lSW5iwfu2R0+6WXCfU6zlGwp9wVedolznUu5OiYpHK0Emz3dmBw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-mention": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "fuzzysort": "3.1.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-engine": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-44.3.0.tgz",
+ "integrity": "sha512-76nq2oHwQocaGQfRKlaDaYYFSps3yVNfbC4204i4/S0moKtB9fSy9IBKwYm5D9iB+0qjqCYGnsn17wWNuKjCYQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-enter": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-44.3.0.tgz",
+ "integrity": "sha512-M5pv6XC5SIqwa9ZiQQsmmvCAot/uiBN/8ax3KvLz8S78eXDHyHKE6mZMWUd0MJCfZ/0b+CnrFVY/kvZkS+h/7g==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-essentials": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-44.3.0.tgz",
+ "integrity": "sha512-DkE6u0pD3gcFLkyZRNA4IZVvjLQUpgoEeTCaB/QaCQRljSSj9300AtkIFpCdRiWo9RAGw7rs9XmVRoCsTPY4tQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-enter": "44.3.0",
+ "@ckeditor/ckeditor5-select-all": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-undo": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-find-and-replace": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-find-and-replace/-/ckeditor5-find-and-replace-44.3.0.tgz",
+ "integrity": "sha512-d4fLo5IWyxPmfuoIqoaWaekoodgtFurKALc2ZyNvto7H9m+ul+uWwhF4A9buovbETv0N0mertDruGENygiuOCg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-font": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-font/-/ckeditor5-font-44.3.0.tgz",
+ "integrity": "sha512-F1cdHNbtXkM/1nvqbCO4XeSCHahNiMnwkQqCm36njxuBRXbAei/qTwxqrwPAukE6Yb2q9boX1prUbvEBbPAqhw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-heading": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-44.3.0.tgz",
+ "integrity": "sha512-7uCSHN2UMTzn/nZpoACOiUyx2dX4ZlC8bfLbpdgMhDPM9vEaa0Tr/lgSFD5C1ugLFFSEJL3pAPGWStvZ4wD6YA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-paragraph": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-highlight": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-44.3.0.tgz",
+ "integrity": "sha512-BwdMrcAbS0J/3q3dmtY0F6sVARVR9oSrWj4/850EfXp0hw9gkpQyEjrds17sIrIchCG+/8/0LM4Z9sADYzmo9w==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-horizontal-line": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-44.3.0.tgz",
+ "integrity": "sha512-k8YuWptng4IKUbXVE+ZjVyNm8JpGU50aFWckYunimlpajNOKC52L8pneIEqIHr/BjA+2P/vtAIf8HDZs+AoNjw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-html-embed": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-html-embed/-/ckeditor5-html-embed-44.3.0.tgz",
+ "integrity": "sha512-rJV3ikojykVPw9CrtzInh8DsgGuk/2UOi8KUr3b6DEtuYOqJkG5cfpqRy5QVoSRbtpLhVOWNpEKhYGgiv+HUgw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-html-support": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-html-support/-/ckeditor5-html-support-44.3.0.tgz",
+ "integrity": "sha512-KFBHMzBNU9/YBj3Eil03qYBLNk7wAuholdZ3YijohgCt2YRw1cRu9krjGaOyhF9E5MEu0cqTJvTjPGBhGE8mVQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-enter": "44.3.0",
+ "@ckeditor/ckeditor5-heading": "44.3.0",
+ "@ckeditor/ckeditor5-image": "44.3.0",
+ "@ckeditor/ckeditor5-list": "44.3.0",
+ "@ckeditor/ckeditor5-table": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-image": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-image/-/ckeditor5-image-44.3.0.tgz",
+ "integrity": "sha512-3mRgGSOXQ4e/TJZcB7N8SPSnN+pdUzA72kwiN6FrjjdV0CNqehNoSUCFrwra4ctHaFjLBBqFVV+hEvwFlgmlxA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-undo": "44.3.0",
+ "@ckeditor/ckeditor5-upload": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-indent": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-44.3.0.tgz",
+ "integrity": "sha512-Gju3Lt2/OQB2mzhk/TTtonHTEcmFua4Ag4keB75EbPxthpLZZnMQm3Gl7MvrecjUv4+3nRlEBv/Bon00OIXcqA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-heading": "44.3.0",
+ "@ckeditor/ckeditor5-list": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-integrations-common": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-integrations-common/-/ckeditor5-integrations-common-2.2.3.tgz",
+ "integrity": "sha512-92kQWQj1wiABF7bY1+J79Ze+WHr7pwVBufn1eeJLWcTXbPQq4sAolfKv8Y8Ka9g69mdyE9+GPWmGFYDeQJVPDg==",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "ckeditor5": ">=42.0.0 || ^0.0.0-nightly"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-language": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-language/-/ckeditor5-language-44.3.0.tgz",
+ "integrity": "sha512-lnhnnsSwMnnyFpUktrvAxuj6tlwn2zjSm7+ZDxMiQpsZuRsmABnSapeKqjlfs8B1rQwrcZIhp1FsHVvnaVOzug==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-link": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-link/-/ckeditor5-link-44.3.0.tgz",
+ "integrity": "sha512-OmOWje1i7tuEBNHoIi/n6M69xE1K97P2xmbSJ9HB5nFFvelfCCMnuLa+7QmT1+/Sxg0VYM175dtTclinEeWJhQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-bookmark": "44.3.0",
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-image": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-list": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-list/-/ckeditor5-list-44.3.0.tgz",
+ "integrity": "sha512-66f3n8ASdhA7wxPoGt/sI+Eg/IhDFutSkCEcqL2tsJFVRB0MuhhQIklxdGRVfPrjbpMSUPSRJPMddAFhRCzfUQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-enter": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-markdown-gfm": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-markdown-gfm/-/ckeditor5-markdown-gfm-44.3.0.tgz",
+ "integrity": "sha512-q+vblaqjjwQQkcrFfsOCD7ejWl1ltqV982jfFK9LTx7DiJIuR2UwByNrRC00Xeol2rDeC8lYoIH77AZHavFIbw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@types/marked": "4.3.2",
+ "@types/turndown": "5.0.5",
+ "ckeditor5": "44.3.0",
+ "marked": "4.0.12",
+ "turndown": "7.2.0",
+ "turndown-plugin-gfm": "1.0.2"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-media-embed": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-44.3.0.tgz",
+ "integrity": "sha512-wlAITZKeNEZfB164hwODXfhg63pYaWynCuIvVCtaeVUmoBqnSkK8gxuZ2ehxUdi4SPlVJwt84afDsD4RU8UYDQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-undo": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-mention": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-44.3.0.tgz",
+ "integrity": "sha512-pmf7prEvIJgP4rbyeTtY6Ynl2i5jo52G+DlFwJbWUzZDyOZIR41mh4hBimK50QHR0szaXMBGbM+alFu924vZCA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-minimap": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-minimap/-/ckeditor5-minimap-44.3.0.tgz",
+ "integrity": "sha512-iRO1t1lyeyiFZg4il5JGRVwyoqRYqsRcj9uSh90xNJJAxH5yiPlWAGIvCMzWDwlINFJe/hfaNd0RDzlbNHytgA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-page-break": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-page-break/-/ckeditor5-page-break-44.3.0.tgz",
+ "integrity": "sha512-PzvOsEDNBPWCtN9S6nhJPWYwF/5BoE0klXkNzTgoA28EwsoSA4evU8gztcoxxGkVOskdI2OzZfz1QUaPFczLDQ==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-paragraph": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-44.3.0.tgz",
+ "integrity": "sha512-kxZBn/xmz+woXB0fIKWA/ZrFZXqyubX5BhcOYpM2j3CtjsJUJsL6ekwBq/y9HNSkkKfNKHaTzK7IDiPBKblcrw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-paste-from-office": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-44.3.0.tgz",
+ "integrity": "sha512-IHl3YVE6ONGXTxHf+uHvvBMFR90nxTz7nB9eA8DzuWskF+fOo+wtVdfZaafLUs0kJJXBTRebsv2Sa5onLLL6tA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-remove-format": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-44.3.0.tgz",
+ "integrity": "sha512-ZlbJNaX+IGui9C3NDC/W/4M308RzD3+jnk5iDGXENjBstNB99AnwpfDXel+Tc0t5rTd7D1fSr9eaxScnPLdgwA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-restricted-editing": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-restricted-editing/-/ckeditor5-restricted-editing-44.3.0.tgz",
+ "integrity": "sha512-0V/can4jw70DMBPwex1MRiUHRsvFdbjZp/RaHagazen6gOZZOAo3R7vJjp+qBQrHmXP6T6aTGn89Y9NxYI9OIw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-select-all": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-44.3.0.tgz",
+ "integrity": "sha512-GDNl6Iex1cyHAQgjR6cqIklH8QPO1x1Z87gwi93lX3mgm47DW6Q12jvwfRc36+d1zGf5W7+eH0xaP7jQPWYUPg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-show-blocks": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-show-blocks/-/ckeditor5-show-blocks-44.3.0.tgz",
+ "integrity": "sha512-4Qp992YWOby7+MiyX0PwD8bg/+PgsRFNXd9DLyhCvmmiFmkwUzbYmA8t3lp+V3uefg5SrcylzWn4QHlUNVg1iw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-source-editing": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-source-editing/-/ckeditor5-source-editing-44.3.0.tgz",
+ "integrity": "sha512-OCv2oO6ok0UrZJHOoJRnywFpv3+UntOs7TuvEw35zDYJCgcmICfzqqTZ++ZcZaq1oOERbwk2L4E4uy2H8KXWQA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-theme-lark": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-special-characters": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-special-characters/-/ckeditor5-special-characters-44.3.0.tgz",
+ "integrity": "sha512-K3cOw/aMUmkXofUVFpUXTHLNYlwvcT3KUyfvTO3oT8ae3ecQlG4btTjgnzgVD2zIXFSEpguSBYywVUhMAZWNMA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-style": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-style/-/ckeditor5-style-44.3.0.tgz",
+ "integrity": "sha512-IUd5yRea8uh/VyAJ6p1NdXL9wWywQYfIOubzNgiP1b58q0psfWYxwsREekE6Epd+sMHC1H4wc+dZsIxfi+stKw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-html-support": "44.3.0",
+ "@ckeditor/ckeditor5-list": "44.3.0",
+ "@ckeditor/ckeditor5-table": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-table": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-table/-/ckeditor5-table-44.3.0.tgz",
+ "integrity": "sha512-kFPvQWe/7Iq9tPzq788HLax7Ss8SJaS5+bkhbUmH+k4RM4NABl1ABRa+EzyMIrdqz9KLYr0B57jUoCU8Y2HLsg==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-theme-lark": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-44.3.0.tgz",
+ "integrity": "sha512-Druy7S1e3bjwMVLkld7ZPGIU6tdI9E6bn/AS+OrQF3mDck14mFP+K4qnMbYNCeYngMqv8Se0eSHtAmQhU7It0A==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-ui": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-typing": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-44.3.0.tgz",
+ "integrity": "sha512-ojAuhhd/PfO5Oko94ObgEmuvQzqApARb2H0R5YEySSRj9oek4Nm1NGMhHMvIC0sMP2hSVxhfSbHcHY3vDjGwiA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-ui": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-44.3.0.tgz",
+ "integrity": "sha512-Sotme1g/xwhmDYes+bXEU/9hbGXcaKC952Yck6UiYgZyhei28lErlNwtSOAKfpQ2gHbPjWRt7rigSH22EN+iqw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-editor-multi-root": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@types/color-convert": "2.0.4",
+ "color-convert": "2.0.1",
+ "color-parse": "1.4.2",
+ "lodash-es": "4.17.21",
+ "vanilla-colorful": "0.7.2"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-undo": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-44.3.0.tgz",
+ "integrity": "sha512-cogFPl7QoDrmoUPKTZI0/LiUYoFboqm0lqBK168nh5VRgy53RuGgbXJ4+hCOHNuzdUnVUlWvl/2u0vR4/R07+A==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-upload": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-44.3.0.tgz",
+ "integrity": "sha512-oJgsw374nHeVKx1qvnlQzEyDhfFvC/su84f00nOdDGWfsHabU3hE0hZE+yoBtreRViORwwe6Ftg5qbhl5OVyuA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-utils": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-44.3.0.tgz",
+ "integrity": "sha512-Z/ttfLhu9QnuMc9BBdQfH9Do6JD01ijUkUmUB41BPByYfOjZbGYGfZmhywH9OjXmHnSDQSUqwRnxqqM3nceR1g==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@types/lodash-es": "4.17.12",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-watchdog": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-44.3.0.tgz",
+ "integrity": "sha512-7Y4FOWB021CLEUDsIf61tZzd9ZrZ8JkD8lQeRZOmv+bBLTxgjyz2/7MCjIDR7NN0xdASXTFwRS6XO32HbdrN0Q==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-editor-multi-root": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-widget": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-44.3.0.tgz",
+ "integrity": "sha512-nFEKBE33RnZ2bOeD9L9jfyKYaFw/xKY543ZNQWxWHcmI70AX3U2KJ8wUnuMjMknHafyMuH6bSlWjKtn5vz3w+g==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-enter": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@ckeditor/ckeditor5-word-count": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/@ckeditor/ckeditor5-word-count/-/ckeditor5-word-count-44.3.0.tgz",
+ "integrity": "sha512-9iNiF1wq1f9npT/KhBAgDfM6kFbJ0GyUdlXt3V6zyLY2K3SILQ6q5B23jhtABZny8zxA+f528ClxDSTFh9bXDA==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "ckeditor5": "44.3.0",
+ "lodash-es": "4.17.21"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@ctrl/ngx-emoji-mart": {
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/@ctrl/ngx-emoji-mart/-/ngx-emoji-mart-9.2.0.tgz",
+ "integrity": "sha512-q8B7DiXPfyTe+VOGO6Ix7eh5gKCuADxAsud2xXRTlECTfchoKGTmirSczyjaxIKE/xmB+/ZsnkpthZqUM7SAJQ==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/core": ">=15.0.0-0"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz",
+ "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.17.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
+ "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
+ "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
+ "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
+ "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
+ "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
+ "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
+ "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
+ "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
+ "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
+ "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
+ "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
+ "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
+ "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
+ "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
+ "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
+ "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
+ "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
+ "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
+ "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
+ "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
+ "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
+ "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@fullcalendar/angular": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/angular/-/angular-6.1.17.tgz",
+ "integrity": "sha512-1XSiT62/KItFZCtecuqcxd0mxctQQcJuJbXfLFPjGG9Ycz6+af+bC0Ch89W+uYSPkGrmk7tczELouckJLSJm2Q==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "12 - 19",
+ "@angular/core": "12 - 19",
+ "@fullcalendar/core": "~6.1.17"
+ }
+ },
+ "node_modules/@fullcalendar/bootstrap": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/bootstrap/-/bootstrap-6.1.17.tgz",
+ "integrity": "sha512-8oGlepD17TEx+D7HqCKCoH1P19yDDbMaLBjuV3fW3XsYCqVZ3uGHcXSVHr7Jw/GzWB05vKiU/+CVXFmApltrsQ==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.17"
+ }
+ },
+ "node_modules/@fullcalendar/core": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.17.tgz",
+ "integrity": "sha512-0W7lnIrv18ruJ5zeWBeNZXO8qCWlzxDdp9COFEsZnyNjiEhUVnrW/dPbjRKYpL0edGG0/Lhs0ghp1z/5ekt8ZA==",
+ "dependencies": {
+ "preact": "~10.12.1"
+ }
+ },
+ "node_modules/@fullcalendar/daygrid": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.17.tgz",
+ "integrity": "sha512-K7m+pd7oVJ9fW4h7CLDdDGJbc9szJ1xDU1DZ2ag+7oOo1aCNLv44CehzkkknM6r8EYlOOhgaelxQpKAI4glj7A==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.17"
+ }
+ },
+ "node_modules/@fullcalendar/interaction": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.17.tgz",
+ "integrity": "sha512-AudvQvgmJP2FU89wpSulUUjeWv24SuyCx8FzH2WIPVaYg+vDGGYarI7K6PcM3TH7B/CyaBjm5Rqw9lXgnwt5YA==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.17"
+ }
+ },
+ "node_modules/@fullcalendar/list": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.17.tgz",
+ "integrity": "sha512-fkyK49F9IxwlGUBVhJGsFpd/LTi/vRVERLIAe1HmBaGkjwpxnynm8TMLb9mZip97wvDk3CmZWduMe6PxscAlow==",
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.17"
+ }
+ },
+ "node_modules/@fullcalendar/timegrid": {
+ "version": "6.1.17",
+ "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.17.tgz",
+ "integrity": "sha512-K4PlA3L3lclLOs3IX8cvddeiJI9ZVMD7RA9IqaWwbvac771971foc9tFze9YY+Pqesf6S+vhS2dWtEVlERaGlQ==",
+ "dependencies": {
+ "@fullcalendar/daygrid": "~6.1.17"
+ },
+ "peerDependencies": {
+ "@fullcalendar/core": "~6.1.17"
+ }
+ },
+ "node_modules/@iconify-json/iconamoon": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@iconify-json/iconamoon/-/iconamoon-1.2.2.tgz",
+ "integrity": "sha512-Xn7YeSDniPgutPr0qil/iQwQelq975OYQ/i2twGjcK4DjGOXBrBC+6q45WtVuQbFfXzM7bgijv4yVnxy0OqUdQ==",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="
+ },
+ "node_modules/@iconify/utils": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz",
+ "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==",
+ "dependencies": {
+ "@antfu/install-pkg": "^1.0.0",
+ "@antfu/utils": "^8.1.0",
+ "@iconify/types": "^2.0.0",
+ "debug": "^4.4.0",
+ "globals": "^15.14.0",
+ "kolorist": "^1.8.0",
+ "local-pkg": "^1.0.0",
+ "mlly": "^1.7.4"
+ }
+ },
+ "node_modules/@iconify/utils/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@inquirer/checkbox": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.5.tgz",
+ "integrity": "sha512-swPczVU+at65xa5uPfNP9u3qx/alNwiaykiI/ExpsmMSQW55trmZcwhYWzw/7fj+n6Q8z1eENvR7vFfq9oPSAQ==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz",
+ "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.7",
+ "@inquirer/type": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "10.1.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz",
+ "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^2.0.0",
+ "signal-exit": "^4.1.0",
+ "wrap-ansi": "^6.2.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/editor": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.10.tgz",
+ "integrity": "sha512-5GVWJ+qeI6BzR6TIInLP9SXhWCEcvgFQYmcRG6d6RIlhFjM5TyG18paTGBgRYyEouvCmzeco47x9zX9tQEofkw==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/type": "^3.0.6",
+ "external-editor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/expand": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.12.tgz",
+ "integrity": "sha512-jV8QoZE1fC0vPe6TnsOfig+qwu7Iza1pkXoUJ3SroRagrt2hxiL+RbM432YAihNR7m7XnU0HWl/WQ35RIGmXHw==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz",
+ "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/input": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.9.tgz",
+ "integrity": "sha512-mshNG24Ij5KqsQtOZMgj5TwEjIf+F2HOESk6bjMwGWgcH5UBe8UoljwzNFHqdMbGYbgAf6v2wU/X9CAdKJzgOA==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/type": "^3.0.6"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.12.tgz",
+ "integrity": "sha512-7HRFHxbPCA4e4jMxTQglHJwP+v/kpFsCf2szzfBHy98Wlc3L08HL76UDiA87TOdX5fwj2HMOLWqRWv9Pnn+Z5Q==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/type": "^3.0.6"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/password": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.12.tgz",
+ "integrity": "sha512-FlOB0zvuELPEbnBYiPaOdJIaDzb2PmJ7ghi/SVwIHDDSQ2K4opGBkF+5kXOg6ucrtSUQdLhVVY5tycH0j0l+0g==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/prompts": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.3.2.tgz",
+ "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/checkbox": "^4.1.2",
+ "@inquirer/confirm": "^5.1.6",
+ "@inquirer/editor": "^4.2.7",
+ "@inquirer/expand": "^4.0.9",
+ "@inquirer/input": "^4.1.6",
+ "@inquirer/number": "^3.0.9",
+ "@inquirer/password": "^4.0.9",
+ "@inquirer/rawlist": "^4.0.9",
+ "@inquirer/search": "^3.0.9",
+ "@inquirer/select": "^4.0.9"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/rawlist": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.12.tgz",
+ "integrity": "sha512-wNPJZy8Oc7RyGISPxp9/MpTOqX8lr0r+lCCWm7hQra+MDtYRgINv1hxw7R+vKP71Bu/3LszabxOodfV/uTfsaA==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/search": {
+ "version": "3.0.12",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.12.tgz",
+ "integrity": "sha512-H/kDJA3kNlnNIjB8YsaXoQI0Qccgf0Na14K1h8ExWhNmUg2E941dyFPrZeugihEa9AZNW5NdsD/NcvUME83OPQ==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/select": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.1.1.tgz",
+ "integrity": "sha512-IUXzzTKVdiVNMA+2yUvPxWsSgOG4kfX93jOM4Zb5FgujeInotv5SPIJVeXQ+fO4xu7tW8VowFhdG5JRmmCyQ1Q==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz",
+ "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@jsonjoy.com/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/json-pack": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz",
+ "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==",
+ "dev": true,
+ "dependencies": {
+ "@jsonjoy.com/base64": "^1.1.1",
+ "@jsonjoy.com/util": "^1.1.2",
+ "hyperdyperid": "^1.2.0",
+ "thingies": "^1.20.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@jsonjoy.com/util": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz",
+ "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "dev": true
+ },
+ "node_modules/@listr2/prompt-adapter-inquirer": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz",
+ "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==",
+ "dev": true,
+ "dependencies": {
+ "@inquirer/type": "^1.5.5"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "@inquirer/prompts": ">= 3 < 8"
+ }
+ },
+ "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz",
+ "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==",
+ "dev": true,
+ "dependencies": {
+ "mute-stream": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
+ "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
+ "dev": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@lmdb/lmdb-darwin-arm64": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.2.6.tgz",
+ "integrity": "sha512-yF/ih9EJJZc72psFQbwnn8mExIWfTnzWJg+N02hnpXtDPETYLmQswIMBn7+V88lfCaFrMozJsUvcEQIkEPU0Gg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-darwin-x64": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.2.6.tgz",
+ "integrity": "sha512-5BbCumsFLbCi586Bb1lTWQFkekdQUw8/t8cy++Uq251cl3hbDIGEwD9HAwh8H6IS2F6QA9KdKmO136LmipRNkg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-arm": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.2.6.tgz",
+ "integrity": "sha512-+6XgLpMb7HBoWxXj+bLbiiB4s0mRRcDPElnRS3LpWRzdYSe+gFk5MT/4RrVNqd2MESUDmb53NUXw1+BP69bjiQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-arm64": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.2.6.tgz",
+ "integrity": "sha512-l5VmJamJ3nyMmeD1ANBQCQqy7do1ESaJQfKPSm2IG9/ADZryptTyCj8N6QaYgIWewqNUrcbdMkJajRQAt5Qjfg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-linux-x64": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.2.6.tgz",
+ "integrity": "sha512-nDYT8qN9si5+onHYYaI4DiauDMx24OAiuZAUsEqrDy+ja/3EbpXPX/VAkMV8AEaQhy3xc4dRC+KcYIvOFefJ4Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@lmdb/lmdb-win32-x64": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.2.6.tgz",
+ "integrity": "sha512-XlqVtILonQnG+9fH2N3Aytria7P/1fwDgDhl29rde96uH2sLB8CHORIf2PfuLVzFQJ7Uqp8py9AYwr3ZUCFfWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@mixmark-io/domino": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz",
+ "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz",
+ "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz",
+ "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz",
+ "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz",
+ "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz",
+ "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz",
+ "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@napi-rs/nice": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz",
+ "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Brooooooklyn"
+ },
+ "optionalDependencies": {
+ "@napi-rs/nice-android-arm-eabi": "1.0.1",
+ "@napi-rs/nice-android-arm64": "1.0.1",
+ "@napi-rs/nice-darwin-arm64": "1.0.1",
+ "@napi-rs/nice-darwin-x64": "1.0.1",
+ "@napi-rs/nice-freebsd-x64": "1.0.1",
+ "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1",
+ "@napi-rs/nice-linux-arm64-gnu": "1.0.1",
+ "@napi-rs/nice-linux-arm64-musl": "1.0.1",
+ "@napi-rs/nice-linux-ppc64-gnu": "1.0.1",
+ "@napi-rs/nice-linux-riscv64-gnu": "1.0.1",
+ "@napi-rs/nice-linux-s390x-gnu": "1.0.1",
+ "@napi-rs/nice-linux-x64-gnu": "1.0.1",
+ "@napi-rs/nice-linux-x64-musl": "1.0.1",
+ "@napi-rs/nice-win32-arm64-msvc": "1.0.1",
+ "@napi-rs/nice-win32-ia32-msvc": "1.0.1",
+ "@napi-rs/nice-win32-x64-msvc": "1.0.1"
+ }
+ },
+ "node_modules/@napi-rs/nice-android-arm-eabi": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz",
+ "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-android-arm64": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz",
+ "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-darwin-arm64": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz",
+ "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-darwin-x64": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz",
+ "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-freebsd-x64": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz",
+ "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-arm-gnueabihf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz",
+ "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-arm64-gnu": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz",
+ "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-arm64-musl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz",
+ "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-ppc64-gnu": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz",
+ "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-riscv64-gnu": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz",
+ "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-s390x-gnu": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz",
+ "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-x64-gnu": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz",
+ "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-linux-x64-musl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz",
+ "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-win32-arm64-msvc": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz",
+ "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-win32-ia32-msvc": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz",
+ "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@napi-rs/nice-win32-x64-msvc": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz",
+ "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@ng-bootstrap/ng-bootstrap": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-18.0.0.tgz",
+ "integrity": "sha512-GeSAz4yiGq49psdte8kcf+Y562wB3jK/qKRAkh6iA32lcXmy2sfQXVAmlHdjZ3AyP+E8lf3yMwuPdSKiYcDgSg==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^19.0.0",
+ "@angular/core": "^19.0.0",
+ "@angular/forms": "^19.0.0",
+ "@angular/localize": "^19.0.0",
+ "@popperjs/core": "^2.11.8",
+ "rxjs": "^6.5.3 || ^7.4.0"
+ }
+ },
+ "node_modules/@ngrx/effects": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@ngrx/effects/-/effects-19.1.0.tgz",
+ "integrity": "sha512-rGRN0ZnzAPmQdUPvmoqZsK7Da/AoCfQcfody+h6PfHTwXNm+M2MRc8tXO6C+fznMRww8ZgNror2dfFmoOSOvNg==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/core": "^19.0.0",
+ "@ngrx/store": "19.1.0",
+ "rxjs": "^6.5.3 || ^7.5.0"
+ }
+ },
+ "node_modules/@ngrx/store": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@ngrx/store/-/store-19.1.0.tgz",
+ "integrity": "sha512-8kKCSFahTpRTx3f/wwcDjItdFnk2IMoorWRjTI2U/MGWuEi4flqLNWcX99s759e7TI6PctiGsaS8jnJXIUS8Jg==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/core": "^19.0.0",
+ "rxjs": "^6.5.3 || ^7.5.0"
+ }
+ },
+ "node_modules/@ngrx/store-devtools": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/@ngrx/store-devtools/-/store-devtools-19.1.0.tgz",
+ "integrity": "sha512-c8sV5FQofqm7lF6HTJ4Bb7L/69TaIYHAwEFMbgqbsNoWDx+pilw/It6X9J3LnU8bXjQK4xg6qsgJ7fJIH5X2NA==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/core": "^19.0.0",
+ "@ngrx/store": "19.1.0",
+ "rxjs": "^6.5.3 || ^7.5.0"
+ }
+ },
+ "node_modules/@ngtools/webpack": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.2.6.tgz",
+ "integrity": "sha512-/jWpZUoMru3YbRJAPZ2KroUSzE6Ak5Hav219raYQaBXVtyLAvFE5VC1/CiH0wTYnb/dyjxzWq38ftOr/vv0+tg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ },
+ "peerDependencies": {
+ "@angular/compiler-cli": "^19.0.0 || ^19.2.0-next.0",
+ "typescript": ">=5.5 <5.9",
+ "webpack": "^5.54.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@npmcli/agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz",
+ "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/agent/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
+ },
+ "node_modules/@npmcli/fs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz",
+ "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/git": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz",
+ "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==",
+ "dependencies": {
+ "@npmcli/promise-spawn": "^8.0.0",
+ "ini": "^5.0.0",
+ "lru-cache": "^10.0.1",
+ "npm-pick-manifest": "^10.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/git/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@npmcli/git/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
+ },
+ "node_modules/@npmcli/git/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/installed-package-contents": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz",
+ "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==",
+ "dependencies": {
+ "npm-bundled": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "bin": {
+ "installed-package-contents": "bin/index.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/node-gyp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz",
+ "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/package-json": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz",
+ "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "glob": "^10.2.2",
+ "hosted-git-info": "^8.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.5.3",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/package-json/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@npmcli/package-json/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@npmcli/package-json/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@npmcli/promise-spawn": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz",
+ "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==",
+ "dependencies": {
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/promise-spawn/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@npmcli/promise-spawn/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/redact": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz",
+ "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/run-script": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz",
+ "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==",
+ "dependencies": {
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "node-gyp": "^11.0.0",
+ "proc-log": "^5.0.0",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@npmcli/run-script/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@npmcli/run-script/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
+ "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.1",
+ "@parcel/watcher-darwin-arm64": "2.5.1",
+ "@parcel/watcher-darwin-x64": "2.5.1",
+ "@parcel/watcher-freebsd-x64": "2.5.1",
+ "@parcel/watcher-linux-arm-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm-musl": "2.5.1",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.1",
+ "@parcel/watcher-linux-arm64-musl": "2.5.1",
+ "@parcel/watcher-linux-x64-glibc": "2.5.1",
+ "@parcel/watcher-linux-x64-musl": "2.5.1",
+ "@parcel/watcher-win32-arm64": "2.5.1",
+ "@parcel/watcher-win32-ia32": "2.5.1",
+ "@parcel/watcher-win32-x64": "2.5.1"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz",
+ "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz",
+ "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz",
+ "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz",
+ "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz",
+ "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz",
+ "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz",
+ "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz",
+ "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz",
+ "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz",
+ "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz",
+ "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz",
+ "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz",
+ "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher/node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/@parcel/watcher/node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz",
+ "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz",
+ "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz",
+ "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz",
+ "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz",
+ "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz",
+ "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz",
+ "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz",
+ "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz",
+ "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz",
+ "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz",
+ "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz",
+ "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz",
+ "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz",
+ "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz",
+ "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz",
+ "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz",
+ "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz",
+ "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz",
+ "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@schematics/angular": {
+ "version": "19.2.6",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.2.6.tgz",
+ "integrity": "sha512-fmbF9ONmEZqxHocCwOSWG2mHp4a22d1uW+DZUBUgZSBUFIrnFw42deOxDq8mkZOZ1Tc73UpLN2GKI7iJeUqS2A==",
+ "dev": true,
+ "dependencies": {
+ "@angular-devkit/core": "19.2.6",
+ "@angular-devkit/schematics": "19.2.6",
+ "jsonc-parser": "3.3.1"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
+ "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
+ "yarn": ">= 1.13.0"
+ }
+ },
+ "node_modules/@sigstore/bundle": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz",
+ "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.4.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@sigstore/core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz",
+ "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@sigstore/protobuf-specs": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz",
+ "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@sigstore/sign": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz",
+ "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "make-fetch-happen": "^14.0.2",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@sigstore/tuf": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz",
+ "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "tuf-js": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@sigstore/verify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz",
+ "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@sindresorhus/merge-streams": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
+ "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+ "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+ "dev": true
+ },
+ "node_modules/@svgdotjs/svg.draggable.js": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.draggable.js/-/svg.draggable.js-3.0.6.tgz",
+ "integrity": "sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==",
+ "peerDependencies": {
+ "@svgdotjs/svg.js": "^3.2.4"
+ }
+ },
+ "node_modules/@svgdotjs/svg.filter.js": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.filter.js/-/svg.filter.js-3.0.9.tgz",
+ "integrity": "sha512-/69XMRCDoam2HgC4ldHIaDgeQf1ViHIsa0Ld4uWgiXtZ+E24DWHe/9Ib6kbNiZ7WRIdlVokUDR1Fg0kjIpkfbw==",
+ "dependencies": {
+ "@svgdotjs/svg.js": "^3.2.4"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/@svgdotjs/svg.js": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.js/-/svg.js-3.2.4.tgz",
+ "integrity": "sha512-BjJ/7vWNowlX3Z8O4ywT58DqbNRyYlkk6Yz/D13aB7hGmfQTvGX4Tkgtm/ApYlu9M7lCQi15xUEidqMUmdMYwg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Fuzzyma"
+ }
+ },
+ "node_modules/@svgdotjs/svg.resize.js": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.resize.js/-/svg.resize.js-2.0.5.tgz",
+ "integrity": "sha512-4heRW4B1QrJeENfi7326lUPYBCevj78FJs8kfeDxn5st0IYPIRXoTtOSYvTzFWgaWWXd3YCDE6ao4fmv91RthA==",
+ "engines": {
+ "node": ">= 14.18"
+ },
+ "peerDependencies": {
+ "@svgdotjs/svg.js": "^3.2.4",
+ "@svgdotjs/svg.select.js": "^4.0.1"
+ }
+ },
+ "node_modules/@svgdotjs/svg.select.js": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@svgdotjs/svg.select.js/-/svg.select.js-4.0.2.tgz",
+ "integrity": "sha512-5gWdrvoQX3keo03SCmgaBbD+kFftq0F/f2bzCbNnpkkvW6tk4rl4MakORzFuNjvXPWwB4az9GwuvVxQVnjaK2g==",
+ "engines": {
+ "node": ">= 14.18"
+ },
+ "peerDependencies": {
+ "@svgdotjs/svg.js": "^3.2.4"
+ }
+ },
+ "node_modules/@tufjs/canonical-json": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz",
+ "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@tufjs/models": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz",
+ "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==",
+ "dependencies": {
+ "@tufjs/canonical-json": "2.0.0",
+ "minimatch": "^9.0.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/@tufjs/models/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@tufjs/models/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz",
+ "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "dev": true,
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/color-convert": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.4.tgz",
+ "integrity": "sha512-Ub1MmDdyZ7mX//g25uBAoH/mWGd9swVbt8BseymnaE18SU4po/PjmCrHxqIIRjBo3hV/vh1KGr0eMxUhp+t+dQ==",
+ "dependencies": {
+ "@types/color-name": "^1.1.0"
+ }
+ },
+ "node_modules/@types/color-name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.5.tgz",
+ "integrity": "sha512-j2K5UJqGTxeesj6oQuGpMgifpT5k9HprgQd8D1Y0lOFqKHl3PJu5GMeS4Y5EgjS55AE6OQxf8mPED9uaGbf4Cg=="
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "dev": true,
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz",
+ "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/google.maps": {
+ "version": "3.58.1",
+ "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz",
+ "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ=="
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "dev": true
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.16",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
+ "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/jasmine": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.7.tgz",
+ "integrity": "sha512-DVOfk9FaClQfNFpSfaML15jjB5cjffDMvjtph525sroR5BEAW2uKnTOYUTqTFuZFjNvH0T5XMIydvIctnUKufw==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.17.16",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz",
+ "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g=="
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.12",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+ "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/marked": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz",
+ "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w=="
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "22.14.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz",
+ "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.11",
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
+ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.18",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz",
+ "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==",
+ "dev": true
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "dev": true
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz",
+ "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==",
+ "dev": true
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "dev": true,
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/turndown": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.5.tgz",
+ "integrity": "sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w=="
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@vitejs/plugin-basic-ssl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.2.0.tgz",
+ "integrity": "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.21.3"
+ },
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "node_modules/@yarnpkg/lockfile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
+ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
+ "dev": true
+ },
+ "node_modules/@yr/monotone-cubic-spline": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
+ "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA=="
+ },
+ "node_modules/abbrev": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz",
+ "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/adjust-sourcemap-loader": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
+ "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "regex-parser": "^2.2.11"
+ },
+ "engines": {
+ "node": ">=8.9"
+ }
+ },
+ "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/angularx-flatpickr": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/angularx-flatpickr/-/angularx-flatpickr-8.1.0.tgz",
+ "integrity": "sha512-U+WXMUXGEiQbdMGSPk7T+HehmAFdVWKu3XlCXFM8mYCCB/fWHW8sbHstxxZgOymD5Q1kfLaHNob1MxhWUgv1hg==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/core": ">=17.0.0",
+ "@angular/forms": ">=17.0.0",
+ "flatpickr": "^4.5.0"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/anymatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/apexcharts": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.5.0.tgz",
+ "integrity": "sha512-E7ZkrVqPNBUWy/Rmg8DEIqHNBmElzICE/oxOX5Ekvs2ICQUOK/VkEkMH09JGJu+O/EA0NL31hxlmF+wrwrSLaQ==",
+ "dependencies": {
+ "@svgdotjs/svg.draggable.js": "^3.0.4",
+ "@svgdotjs/svg.filter.js": "^3.0.8",
+ "@svgdotjs/svg.js": "^3.2.4",
+ "@svgdotjs/svg.resize.js": "^2.0.2",
+ "@svgdotjs/svg.select.js": "^4.0.1",
+ "@yr/monotone-cubic-spline": "^1.0.3"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz",
+ "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==",
+ "dev": true,
+ "dependencies": {
+ "find-cache-dir": "^4.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0",
+ "webpack": ">=5"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz",
+ "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.4",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz",
+ "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "core-js-compat": "^3.40.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz",
+ "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "dev": true,
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true
+ },
+ "node_modules/beasties": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.2.0.tgz",
+ "integrity": "sha512-Ljqskqx/tbZagIglYoJIMzH5zgssyp+in9+9sAyh15N22AornBeIDnb8EZ6Rk+6ShfMxd92uO3gfpT0NtZbpow==",
+ "dev": true,
+ "dependencies": {
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "htmlparser2": "^9.1.0",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.49",
+ "postcss-media-query-parser": "^0.2.3"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/blurhash": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz",
+ "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w=="
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/bootstrap": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz",
+ "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "peerDependencies": {
+ "@popperjs/core": "^2.11.8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.4",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001688",
+ "electron-to-chromium": "^1.5.73",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "dev": true,
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cacache": {
+ "version": "19.0.1",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz",
+ "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==",
+ "dependencies": {
+ "@npmcli/fs": "^4.0.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3",
+ "unique-filename": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/cacache/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/cacache/node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cacache/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/cacache/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
+ },
+ "node_modules/cacache/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/cacache/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/cacache/node_modules/tar": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+ "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cacache/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001712",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz",
+ "integrity": "sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "node_modules/choices.js": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/choices.js/-/choices.js-11.1.0.tgz",
+ "integrity": "sha512-mIt0uLhedHg2ea/K2PACrVpt391vRGHuOoctPAiHcyemezwzNMxj7jOzNEk8e7EbjLh0S0sspDkSCADOKz9kcw==",
+ "dependencies": {
+ "fuse.js": "^7.0.0"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ckeditor5": {
+ "version": "44.3.0",
+ "resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-44.3.0.tgz",
+ "integrity": "sha512-g2arr/fejYAiOkdMeYvz1ficRPJ42OvO+pYROhre08YjIbAtJBr8wO9DPk9nCV3msnyYE+B02bs+TppazhYNtw==",
+ "dependencies": {
+ "@ckeditor/ckeditor5-adapter-ckfinder": "44.3.0",
+ "@ckeditor/ckeditor5-alignment": "44.3.0",
+ "@ckeditor/ckeditor5-autoformat": "44.3.0",
+ "@ckeditor/ckeditor5-autosave": "44.3.0",
+ "@ckeditor/ckeditor5-basic-styles": "44.3.0",
+ "@ckeditor/ckeditor5-block-quote": "44.3.0",
+ "@ckeditor/ckeditor5-bookmark": "44.3.0",
+ "@ckeditor/ckeditor5-ckbox": "44.3.0",
+ "@ckeditor/ckeditor5-ckfinder": "44.3.0",
+ "@ckeditor/ckeditor5-clipboard": "44.3.0",
+ "@ckeditor/ckeditor5-cloud-services": "44.3.0",
+ "@ckeditor/ckeditor5-code-block": "44.3.0",
+ "@ckeditor/ckeditor5-core": "44.3.0",
+ "@ckeditor/ckeditor5-easy-image": "44.3.0",
+ "@ckeditor/ckeditor5-editor-balloon": "44.3.0",
+ "@ckeditor/ckeditor5-editor-classic": "44.3.0",
+ "@ckeditor/ckeditor5-editor-decoupled": "44.3.0",
+ "@ckeditor/ckeditor5-editor-inline": "44.3.0",
+ "@ckeditor/ckeditor5-editor-multi-root": "44.3.0",
+ "@ckeditor/ckeditor5-emoji": "44.3.0",
+ "@ckeditor/ckeditor5-engine": "44.3.0",
+ "@ckeditor/ckeditor5-enter": "44.3.0",
+ "@ckeditor/ckeditor5-essentials": "44.3.0",
+ "@ckeditor/ckeditor5-find-and-replace": "44.3.0",
+ "@ckeditor/ckeditor5-font": "44.3.0",
+ "@ckeditor/ckeditor5-heading": "44.3.0",
+ "@ckeditor/ckeditor5-highlight": "44.3.0",
+ "@ckeditor/ckeditor5-horizontal-line": "44.3.0",
+ "@ckeditor/ckeditor5-html-embed": "44.3.0",
+ "@ckeditor/ckeditor5-html-support": "44.3.0",
+ "@ckeditor/ckeditor5-image": "44.3.0",
+ "@ckeditor/ckeditor5-indent": "44.3.0",
+ "@ckeditor/ckeditor5-language": "44.3.0",
+ "@ckeditor/ckeditor5-link": "44.3.0",
+ "@ckeditor/ckeditor5-list": "44.3.0",
+ "@ckeditor/ckeditor5-markdown-gfm": "44.3.0",
+ "@ckeditor/ckeditor5-media-embed": "44.3.0",
+ "@ckeditor/ckeditor5-mention": "44.3.0",
+ "@ckeditor/ckeditor5-minimap": "44.3.0",
+ "@ckeditor/ckeditor5-page-break": "44.3.0",
+ "@ckeditor/ckeditor5-paragraph": "44.3.0",
+ "@ckeditor/ckeditor5-paste-from-office": "44.3.0",
+ "@ckeditor/ckeditor5-remove-format": "44.3.0",
+ "@ckeditor/ckeditor5-restricted-editing": "44.3.0",
+ "@ckeditor/ckeditor5-select-all": "44.3.0",
+ "@ckeditor/ckeditor5-show-blocks": "44.3.0",
+ "@ckeditor/ckeditor5-source-editing": "44.3.0",
+ "@ckeditor/ckeditor5-special-characters": "44.3.0",
+ "@ckeditor/ckeditor5-style": "44.3.0",
+ "@ckeditor/ckeditor5-table": "44.3.0",
+ "@ckeditor/ckeditor5-theme-lark": "44.3.0",
+ "@ckeditor/ckeditor5-typing": "44.3.0",
+ "@ckeditor/ckeditor5-ui": "44.3.0",
+ "@ckeditor/ckeditor5-undo": "44.3.0",
+ "@ckeditor/ckeditor5-upload": "44.3.0",
+ "@ckeditor/ckeditor5-utils": "44.3.0",
+ "@ckeditor/ckeditor5-watchdog": "44.3.0",
+ "@ckeditor/ckeditor5-widget": "44.3.0",
+ "@ckeditor/ckeditor5-word-count": "44.3.0"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
+ "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone-deep/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ },
+ "node_modules/color-parse": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.2.tgz",
+ "integrity": "sha512-RI7s49/8yqDj3fECFZjUI1Yi0z/Gq1py43oNJivAIIDSyJiOZLfYCRQEgn8HEVAj++PcRe8AnL2XF0fRJ3BTnA==",
+ "dependencies": {
+ "color-name": "^1.0.0"
+ }
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/common-path-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
+ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
+ "dev": true
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz",
+ "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/compression/node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/confbox": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
+ "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/connect/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/connect/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "dev": true
+ },
+ "node_modules/copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "dependencies": {
+ "is-what": "^3.14.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/copy-webpack-plugin": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz",
+ "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==",
+ "dev": true,
+ "dependencies": {
+ "fast-glob": "^3.3.2",
+ "glob-parent": "^6.0.1",
+ "globby": "^14.0.0",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.2.0",
+ "serialize-javascript": "^6.0.2"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.41.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz",
+ "integrity": "sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.24.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz",
+ "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.27.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/custom-event": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==",
+ "dev": true
+ },
+ "node_modules/date-format": {
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz",
+ "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-browser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
+ "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
+ "dev": true,
+ "dependencies": {
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/default-browser-id": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
+ "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true
+ },
+ "node_modules/di": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==",
+ "dev": true
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "dev": true,
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dom-serialize": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+ "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==",
+ "dev": true,
+ "dependencies": {
+ "custom-event": "~1.0.0",
+ "ent": "~2.2.0",
+ "extend": "^3.0.0",
+ "void-elements": "^2.0.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dropzone": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.9.3.tgz",
+ "integrity": "sha512-Azk8kD/2/nJIuVPK+zQ9sjKMRIpRvNyqn9XwbBHNq+iNuSccbJS6hwm1Woy0pMST0erSo0u4j+KJaodndDk4vA=="
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.132",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz",
+ "integrity": "sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/engine.io": {
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz",
+ "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==",
+ "dev": true,
+ "dependencies": {
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.7.2",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
+ "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/engine.io/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
+ "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/ent": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz",
+ "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "es-errors": "^1.3.0",
+ "punycode": "^1.4.1",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/environment": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
+ "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
+ "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
+ "dev": true
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
+ "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.1",
+ "@esbuild/android-arm": "0.25.1",
+ "@esbuild/android-arm64": "0.25.1",
+ "@esbuild/android-x64": "0.25.1",
+ "@esbuild/darwin-arm64": "0.25.1",
+ "@esbuild/darwin-x64": "0.25.1",
+ "@esbuild/freebsd-arm64": "0.25.1",
+ "@esbuild/freebsd-x64": "0.25.1",
+ "@esbuild/linux-arm": "0.25.1",
+ "@esbuild/linux-arm64": "0.25.1",
+ "@esbuild/linux-ia32": "0.25.1",
+ "@esbuild/linux-loong64": "0.25.1",
+ "@esbuild/linux-mips64el": "0.25.1",
+ "@esbuild/linux-ppc64": "0.25.1",
+ "@esbuild/linux-riscv64": "0.25.1",
+ "@esbuild/linux-s390x": "0.25.1",
+ "@esbuild/linux-x64": "0.25.1",
+ "@esbuild/netbsd-arm64": "0.25.1",
+ "@esbuild/netbsd-x64": "0.25.1",
+ "@esbuild/openbsd-arm64": "0.25.1",
+ "@esbuild/openbsd-x64": "0.25.1",
+ "@esbuild/sunos-x64": "0.25.1",
+ "@esbuild/win32-arm64": "0.25.1",
+ "@esbuild/win32-ia32": "0.25.1",
+ "@esbuild/win32-x64": "0.25.1"
+ }
+ },
+ "node_modules/esbuild-wasm": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.25.1.tgz",
+ "integrity": "sha512-dZxPeDHcDIQ6ilml/NzYxnPbNkoVsHSFH3JGLSobttc5qYYgExMo8lh2XcB+w+AfiqykVDGK5PWanGB0gWaAWw==",
+ "dev": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/exponential-backoff": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz",
+ "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/express/node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/express/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/exsolve": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz",
+ "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw=="
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "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.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ]
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dev": true,
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fdir": {
+ "version": "6.4.3",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz",
+ "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/finalhandler/node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+ "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
+ "dev": true,
+ "dependencies": {
+ "common-path-prefix": "^3.0.0",
+ "pkg-dir": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+ "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^7.1.0",
+ "path-exists": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flatpickr": {
+ "version": "4.6.13",
+ "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz",
+ "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw=="
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/fuse.js": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz",
+ "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fuzzysort": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-3.1.0.tgz",
+ "integrity": "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz",
+ "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/merge-streams": "^2.1.0",
+ "fast-glob": "^3.3.3",
+ "ignore": "^7.0.3",
+ "path-type": "^6.0.0",
+ "slash": "^5.1.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ },
+ "node_modules/gumshoejs": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/gumshoejs/-/gumshoejs-5.1.2.tgz",
+ "integrity": "sha512-wIRdZGTNkWMP8dY3po8mtNYmCfiSva41LxXIEek2yEHceETpxRmO7DfW7aUbHsuucC9z2oDPu3alN3+00FUqlw=="
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz",
+ "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/htmlparser2": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz",
+ "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.1.0",
+ "entities": "^4.5.0"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "dev": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-errors/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.9",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz",
+ "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==",
+ "dev": true
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz",
+ "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-proxy": "^1.17.15",
+ "debug": "^4.3.6",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.3",
+ "is-plain-object": "^5.0.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/hyperdyperid": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
+ "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.18"
+ }
+ },
+ "node_modules/iconify-icon": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/iconify-icon/-/iconify-icon-2.3.0.tgz",
+ "integrity": "sha512-C0beI9oTDxQz6voI5CKl7MiJf0Lw4UU8K4G4t6pcUDClLmCvuMOpcvd8MAztQ2SfoH0iv7WHdxBFjekKPFKH2Q==",
+ "dependencies": {
+ "@iconify/types": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/cyberalien"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
+ "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-walk": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz",
+ "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==",
+ "dependencies": {
+ "minimatch": "^9.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/ignore-walk/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/ignore-walk/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz",
+ "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==",
+ "dev": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ini": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz",
+ "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-network-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz",
+ "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true
+ },
+ "node_modules/is-wsl": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+ "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
+ "dev": true,
+ "dependencies": {
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "node_modules/isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jasmine-core": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.1.2.tgz",
+ "integrity": "sha512-2oIUMGn00FdUiqz6epiiJr7xcFyNYj3rDcfmnzfkBnHyBQ3cBQUs4mmyGsOb7TTLb9kxk7dBcmEmqhDKkBoDyA==",
+ "dev": true
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A=="
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz",
+ "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "engines": [
+ "node >= 0.2.0"
+ ]
+ },
+ "node_modules/jsvectormap": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/jsvectormap/-/jsvectormap-1.3.3.tgz",
+ "integrity": "sha512-cx0TgSxlFGzoX//4lW5ahP1rGUUiyiYc1p1eGPoF1vGVfEHF3M0+bgith4Fl8s3J1UPYvXpcpOWR9r0He8TpBg=="
+ },
+ "node_modules/karma": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz",
+ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==",
+ "dev": true,
+ "dependencies": {
+ "@colors/colors": "1.5.0",
+ "body-parser": "^1.19.0",
+ "braces": "^3.0.2",
+ "chokidar": "^3.5.1",
+ "connect": "^3.7.0",
+ "di": "^0.0.1",
+ "dom-serialize": "^2.2.1",
+ "glob": "^7.1.7",
+ "graceful-fs": "^4.2.6",
+ "http-proxy": "^1.18.1",
+ "isbinaryfile": "^4.0.8",
+ "lodash": "^4.17.21",
+ "log4js": "^6.4.1",
+ "mime": "^2.5.2",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.5",
+ "qjobs": "^1.2.0",
+ "range-parser": "^1.2.1",
+ "rimraf": "^3.0.2",
+ "socket.io": "^4.7.2",
+ "source-map": "^0.6.1",
+ "tmp": "^0.2.1",
+ "ua-parser-js": "^0.7.30",
+ "yargs": "^16.1.1"
+ },
+ "bin": {
+ "karma": "bin/karma"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/karma-chrome-launcher": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz",
+ "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==",
+ "dev": true,
+ "dependencies": {
+ "which": "^1.2.1"
+ }
+ },
+ "node_modules/karma-coverage": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz",
+ "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.2.0",
+ "istanbul-lib-instrument": "^5.1.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.1",
+ "istanbul-reports": "^3.0.5",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "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"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/karma-coverage/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/karma-jasmine": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz",
+ "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==",
+ "dev": true,
+ "dependencies": {
+ "jasmine-core": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "karma": "^6.0.0"
+ }
+ },
+ "node_modules/karma-jasmine-html-reporter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz",
+ "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==",
+ "dev": true,
+ "peerDependencies": {
+ "jasmine-core": "^4.0.0 || ^5.0.0",
+ "karma": "^6.0.0",
+ "karma-jasmine": "^5.0.0"
+ }
+ },
+ "node_modules/karma-jasmine/node_modules/jasmine-core": {
+ "version": "4.6.1",
+ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz",
+ "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==",
+ "dev": true
+ },
+ "node_modules/karma-source-map-support": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
+ "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==",
+ "dev": true,
+ "dependencies": {
+ "source-map-support": "^0.5.5"
+ }
+ },
+ "node_modules/karma/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/karma/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/karma/node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/karma/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/karma/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/karma/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/karma/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/karma/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/karma/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/karma/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/karma/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/karma/node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/karma/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/karma/node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/karma/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kolorist": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
+ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="
+ },
+ "node_modules/launch-editor": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz",
+ "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.8.1"
+ }
+ },
+ "node_modules/less": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz",
+ "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==",
+ "dev": true,
+ "dependencies": {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1",
+ "tslib": "^2.3.0"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/less-loader": {
+ "version": "12.2.0",
+ "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz",
+ "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "less": "^3.5.0 || ^4.0.0",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/less/node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/less/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/less/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/less/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/license-webpack-plugin": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz",
+ "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==",
+ "dev": true,
+ "dependencies": {
+ "webpack-sources": "^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-sources": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true
+ },
+ "node_modules/listr2": {
+ "version": "8.2.5",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
+ "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^4.0.0",
+ "colorette": "^2.0.20",
+ "eventemitter3": "^5.0.1",
+ "log-update": "^6.1.0",
+ "rfdc": "^1.4.1",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/listr2/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/listr2/node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
+ "dev": true
+ },
+ "node_modules/listr2/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/lmdb": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.2.6.tgz",
+ "integrity": "sha512-SuHqzPl7mYStna8WRotY8XX/EUZBjjv3QyKIByeCLFfC9uXT/OIHByEcA07PzbMfQAM0KYJtLgtpMRlIe5dErQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "msgpackr": "^1.11.2",
+ "node-addon-api": "^6.1.0",
+ "node-gyp-build-optional-packages": "5.2.2",
+ "ordered-binary": "^1.5.3",
+ "weak-lru-cache": "^1.2.2"
+ },
+ "bin": {
+ "download-lmdb-prebuilds": "bin/download-prebuilds.js"
+ },
+ "optionalDependencies": {
+ "@lmdb/lmdb-darwin-arm64": "3.2.6",
+ "@lmdb/lmdb-darwin-x64": "3.2.6",
+ "@lmdb/lmdb-linux-arm": "3.2.6",
+ "@lmdb/lmdb-linux-arm64": "3.2.6",
+ "@lmdb/lmdb-linux-x64": "3.2.6",
+ "@lmdb/lmdb-win32-x64": "3.2.6"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
+ "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12.13.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz",
+ "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==",
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.0.1",
+ "quansync": "^0.2.8"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash.clonedeep": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+ "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead."
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
+ "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^7.0.0",
+ "cli-cursor": "^5.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-escapes": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
+ "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
+ "dev": true,
+ "dependencies": {
+ "environment": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/is-fullwidth-code-point": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
+ "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
+ "dev": true,
+ "dependencies": {
+ "get-east-asian-width": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
+ "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "is-fullwidth-code-point": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
+ "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log4js": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz",
+ "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
+ "dev": true,
+ "dependencies": {
+ "date-format": "^4.0.14",
+ "debug": "^4.3.4",
+ "flatted": "^3.2.7",
+ "rfdc": "^1.3.0",
+ "streamroller": "^3.1.5"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-fetch-happen": {
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz",
+ "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==",
+ "dependencies": {
+ "@npmcli/agent": "^3.0.0",
+ "cacache": "^19.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/marked": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
+ "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz",
+ "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==",
+ "dev": true,
+ "dependencies": {
+ "@jsonjoy.com/json-pack": "^1.0.3",
+ "@jsonjoy.com/util": "^1.3.0",
+ "tree-dump": "^1.0.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/micromatch/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz",
+ "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==",
+ "dev": true,
+ "dependencies": {
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/minipass-fetch": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz",
+ "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-flush/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-pipeline/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/minizlib": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz",
+ "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==",
+ "dependencies": {
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz",
+ "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==",
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "pathe": "^2.0.1",
+ "pkg-types": "^1.3.0",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/mlly/node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="
+ },
+ "node_modules/mlly/node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/msgpackr": {
+ "version": "1.11.2",
+ "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz",
+ "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==",
+ "dev": true,
+ "optional": true,
+ "optionalDependencies": {
+ "msgpackr-extract": "^3.0.2"
+ }
+ },
+ "node_modules/msgpackr-extract": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz",
+ "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "node-gyp-build-optional-packages": "5.2.2"
+ },
+ "bin": {
+ "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
+ },
+ "optionalDependencies": {
+ "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3",
+ "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3"
+ }
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "dev": true,
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "dev": true,
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/needle": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
+ "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/ng-apexcharts": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/ng-apexcharts/-/ng-apexcharts-1.15.0.tgz",
+ "integrity": "sha512-CNJMStzS+NxLvxRLrybPCy67n1z53WqsGvD9qdepWMo3xgZRDzpX8NiNOvwWDsZGSi7Y/nS5qaUmiM84gi3x7Q==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^19.0.0",
+ "@angular/core": "^19.0.0",
+ "apexcharts": ">=4.0.0",
+ "rxjs": "^6.5.5 || ^7.4.0"
+ }
+ },
+ "node_modules/ng2-nouislider": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ng2-nouislider/-/ng2-nouislider-2.0.0.tgz",
+ "integrity": "sha512-NGbF/0w0+bZqclpSPFOlWIeVJaVwRRYFJzD1x8PClbw9GIeo7fCHoBzZ81y7K7FTJg6to+cgjSTFETPZG/Dizg==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=14.x",
+ "@angular/core": ">=14.x",
+ "nouislider": ">=15.x"
+ }
+ },
+ "node_modules/ngrx-store-localstorage": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/ngrx-store-localstorage/-/ngrx-store-localstorage-19.0.0.tgz",
+ "integrity": "sha512-aONkwb2oW8BI9p6Hqyc6UvB8N51LgPSPg6ogg/ypYCQqRP/p8CDgDuYfkXyQktO1WS+2wKV4lPvGdjfb8dJwEw==",
+ "dependencies": {
+ "deepmerge": "^4.2.2",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^19.0.5",
+ "@angular/core": "^19.0.5",
+ "@ngrx/store": "^19.0.0"
+ }
+ },
+ "node_modules/ngx-clipboard": {
+ "version": "16.0.0",
+ "resolved": "https://registry.npmjs.org/ngx-clipboard/-/ngx-clipboard-16.0.0.tgz",
+ "integrity": "sha512-rZ/Eo1PqiKMiyF8tdjhmUkoUu68f7OzBJ7YH1YFeh2RAaNrerTaW8XfFOzppSckjFQqA1fwGSYuTTJlDhDag5w==",
+ "dependencies": {
+ "ngx-window-token": ">=7.0.0",
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=13.0.0",
+ "@angular/core": ">=13.0.0"
+ }
+ },
+ "node_modules/ngx-cookie-service": {
+ "version": "19.1.2",
+ "resolved": "https://registry.npmjs.org/ngx-cookie-service/-/ngx-cookie-service-19.1.2.tgz",
+ "integrity": "sha512-4BFbc5BA7/ryuQVZUfDMHcjdgkHeW8obqfCCknoOEaplefjzlVvMQUx9Hywfjbc8POzZeZD2csS43Hs7rscJcA==",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ },
+ "peerDependencies": {
+ "@angular/common": "^19.0.0",
+ "@angular/core": "^19.0.0"
+ }
+ },
+ "node_modules/ngx-dropzone-wrapper": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/ngx-dropzone-wrapper/-/ngx-dropzone-wrapper-17.0.0.tgz",
+ "integrity": "sha512-ln8vrHrqCSDGG5EPGxDowCX5Xur0GRagI4Yai8Uq7XiLjPYDU3BE8p3Lnkk2ERDMHMUK9dF7AIXNyTLoVk5rcw==",
+ "dependencies": {
+ "dropzone": "^5.9.0",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=9.0.0",
+ "@angular/core": ">=9.0.0"
+ }
+ },
+ "node_modules/ngx-mask": {
+ "version": "19.0.6",
+ "resolved": "https://registry.npmjs.org/ngx-mask/-/ngx-mask-19.0.6.tgz",
+ "integrity": "sha512-lJa3+gIg0XMwjRv71pqW7uYrzFPZXl7VUbdbafJ9uo7QydfHIhUe8ByPgWt5VxvSC2mp5ndE3O7jWMOtv7Kthw==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=14.0.0",
+ "@angular/core": ">=14.0.0",
+ "@angular/forms": ">=14.0.0"
+ }
+ },
+ "node_modules/ngx-progressbar": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/ngx-progressbar/-/ngx-progressbar-14.0.0.tgz",
+ "integrity": "sha512-tDj7h5F2aSI4/XaJjs50FnELVe6qFqyz3vVq22acacd3oDW2EyJB4c+IYaxMf5972OdTw0WL4n6UwQ3dqC+gCA==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/cdk": ">=17.3.0",
+ "@angular/common": ">=17.3.0",
+ "@angular/core": ">=17.3.0",
+ "rxjs": ">=7.0.0"
+ }
+ },
+ "node_modules/ngx-quill": {
+ "version": "27.0.1",
+ "resolved": "https://registry.npmjs.org/ngx-quill/-/ngx-quill-27.0.1.tgz",
+ "integrity": "sha512-gVv5qNM35Azb/ARk22CJ2NVUnVhU+Ds6Z5eCv7GjISCZr+ELTPVEx1S7EL2R+VUfPxy4fwVA8X6agq6k1BvOiQ==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "engines": {
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "@angular/core": "^19.0.0",
+ "quill": "^2.0.0",
+ "rxjs": "^7.0.0"
+ }
+ },
+ "node_modules/ngx-toastr": {
+ "version": "19.0.0",
+ "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-19.0.0.tgz",
+ "integrity": "sha512-6pTnktwwWD+kx342wuMOWB4+bkyX9221pAgGz3SHOJH0/MI9erLucS8PeeJDFwbUYyh75nQ6AzVtolgHxi52dQ==",
+ "dependencies": {
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=16.0.0-0",
+ "@angular/core": ">=16.0.0-0",
+ "@angular/platform-browser": ">=16.0.0-0"
+ }
+ },
+ "node_modules/ngx-window-token": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ngx-window-token/-/ngx-window-token-7.0.0.tgz",
+ "integrity": "sha512-5+XfRVSY7Dciu8xyCNMkOlH2UfwR9W2P1Pirz7caaZgOZDjFbL8aEO2stjfJJm2FFf1D6dlVHNzhLWGk9HGkqA==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": "^14.20.0 || ^16.13.0 || >=18.10.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=13.0.0",
+ "@angular/core": ">=13.0.0"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+ "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-gyp": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz",
+ "integrity": "sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA==",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^14.0.3",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.4.3",
+ "tinyglobby": "^0.2.12",
+ "which": "^5.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/node-gyp-build-optional-packages": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
+ "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^2.0.1"
+ },
+ "bin": {
+ "node-gyp-build-optional-packages": "bin.js",
+ "node-gyp-build-optional-packages-optional": "optional.js",
+ "node-gyp-build-optional-packages-test": "build-test.js"
+ }
+ },
+ "node_modules/node-gyp/node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/node-gyp/node_modules/isexe": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
+ "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/node-gyp/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/node-gyp/node_modules/tar": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
+ "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/node-gyp/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/node-gyp/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true
+ },
+ "node_modules/nopt": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
+ "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "dependencies": {
+ "abbrev": "^3.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nouislider": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/nouislider/-/nouislider-15.8.1.tgz",
+ "integrity": "sha512-93TweAi8kqntHJSPiSWQ1o/uZ29VWOmal9YKb6KKGGlCkugaNfAupT7o1qTHqdJvNQ7S0su5rO6qRFCjP8fxtw=="
+ },
+ "node_modules/npm": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/npm/-/npm-11.2.0.tgz",
+ "integrity": "sha512-PcnFC6gTo9VDkxVaQ1/mZAS3JoWrDjAI+a6e2NgfYQSGDwftJlbdV0jBMi2V8xQPqbGcWaa7p3UP0SKF+Bhm2g==",
+ "bundleDependencies": [
+ "@isaacs/string-locale-compare",
+ "@npmcli/arborist",
+ "@npmcli/config",
+ "@npmcli/fs",
+ "@npmcli/map-workspaces",
+ "@npmcli/package-json",
+ "@npmcli/promise-spawn",
+ "@npmcli/redact",
+ "@npmcli/run-script",
+ "@sigstore/tuf",
+ "abbrev",
+ "archy",
+ "cacache",
+ "chalk",
+ "ci-info",
+ "cli-columns",
+ "fastest-levenshtein",
+ "fs-minipass",
+ "glob",
+ "graceful-fs",
+ "hosted-git-info",
+ "ini",
+ "init-package-json",
+ "is-cidr",
+ "json-parse-even-better-errors",
+ "libnpmaccess",
+ "libnpmdiff",
+ "libnpmexec",
+ "libnpmfund",
+ "libnpmorg",
+ "libnpmpack",
+ "libnpmpublish",
+ "libnpmsearch",
+ "libnpmteam",
+ "libnpmversion",
+ "make-fetch-happen",
+ "minimatch",
+ "minipass",
+ "minipass-pipeline",
+ "ms",
+ "node-gyp",
+ "nopt",
+ "normalize-package-data",
+ "npm-audit-report",
+ "npm-install-checks",
+ "npm-package-arg",
+ "npm-pick-manifest",
+ "npm-profile",
+ "npm-registry-fetch",
+ "npm-user-validate",
+ "p-map",
+ "pacote",
+ "parse-conflict-json",
+ "proc-log",
+ "qrcode-terminal",
+ "read",
+ "semver",
+ "spdx-expression-parse",
+ "ssri",
+ "supports-color",
+ "tar",
+ "text-table",
+ "tiny-relative-date",
+ "treeverse",
+ "validate-npm-package-name",
+ "which"
+ ],
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/config": "^10.1.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/map-workspaces": "^4.0.2",
+ "@npmcli/package-json": "^6.1.1",
+ "@npmcli/promise-spawn": "^8.0.2",
+ "@npmcli/redact": "^3.1.1",
+ "@npmcli/run-script": "^9.0.1",
+ "@sigstore/tuf": "^3.0.0",
+ "abbrev": "^3.0.0",
+ "archy": "~1.0.0",
+ "cacache": "^19.0.1",
+ "chalk": "^5.4.1",
+ "ci-info": "^4.1.0",
+ "cli-columns": "^4.0.0",
+ "fastest-levenshtein": "^1.0.16",
+ "fs-minipass": "^3.0.3",
+ "glob": "^10.4.5",
+ "graceful-fs": "^4.2.11",
+ "hosted-git-info": "^8.0.2",
+ "ini": "^5.0.0",
+ "init-package-json": "^8.0.0",
+ "is-cidr": "^5.1.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "libnpmaccess": "^10.0.0",
+ "libnpmdiff": "^8.0.1",
+ "libnpmexec": "^10.1.0",
+ "libnpmfund": "^7.0.1",
+ "libnpmorg": "^8.0.0",
+ "libnpmpack": "^9.0.1",
+ "libnpmpublish": "^11.0.0",
+ "libnpmsearch": "^9.0.0",
+ "libnpmteam": "^8.0.0",
+ "libnpmversion": "^8.0.0",
+ "make-fetch-happen": "^14.0.3",
+ "minimatch": "^9.0.5",
+ "minipass": "^7.1.1",
+ "minipass-pipeline": "^1.2.4",
+ "ms": "^2.1.2",
+ "node-gyp": "^11.1.0",
+ "nopt": "^8.1.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-audit-report": "^6.0.0",
+ "npm-install-checks": "^7.1.1",
+ "npm-package-arg": "^12.0.2",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-profile": "^11.0.1",
+ "npm-registry-fetch": "^18.0.2",
+ "npm-user-validate": "^3.0.0",
+ "p-map": "^7.0.3",
+ "pacote": "^21.0.0",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "qrcode-terminal": "^0.12.0",
+ "read": "^4.1.0",
+ "semver": "^7.7.1",
+ "spdx-expression-parse": "^4.0.0",
+ "ssri": "^12.0.0",
+ "supports-color": "^10.0.0",
+ "tar": "^6.2.1",
+ "text-table": "~0.2.0",
+ "tiny-relative-date": "^1.3.0",
+ "treeverse": "^3.0.0",
+ "validate-npm-package-name": "^6.0.0",
+ "which": "^5.0.0"
+ },
+ "bin": {
+ "npm": "bin/npm-cli.js",
+ "npx": "bin/npx-cli.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm-bundled": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz",
+ "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==",
+ "dependencies": {
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm-install-checks": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz",
+ "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==",
+ "dependencies": {
+ "semver": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm-normalize-package-bin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
+ "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm-package-arg": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz",
+ "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==",
+ "dependencies": {
+ "hosted-git-info": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^6.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm-packlist": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz",
+ "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==",
+ "dependencies": {
+ "ignore-walk": "^7.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm-pick-manifest": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz",
+ "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==",
+ "dependencies": {
+ "npm-install-checks": "^7.1.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm-registry-fetch": {
+ "version": "18.0.2",
+ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz",
+ "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==",
+ "dependencies": {
+ "@npmcli/redact": "^3.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^14.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minizlib": "^3.0.1",
+ "npm-package-arg": "^12.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.4"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@isaacs/string-locale-compare": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz",
+ "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/@npmcli/agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz",
+ "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.1",
+ "lru-cache": "^10.0.1",
+ "socks-proxy-agent": "^8.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/arborist": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.0.1.tgz",
+ "integrity": "sha512-m00iV8hgbmli0IMf4Os+UmEq5JRTgqOHR+x5h07O7mO/60q5hLaYwZUMamJ73wlMG68c3WB8ZloOxON/knF5vg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/string-locale-compare": "^1.1.0",
+ "@npmcli/fs": "^4.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/metavuln-calculator": "^9.0.0",
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.1",
+ "@npmcli/query": "^4.0.0",
+ "@npmcli/redact": "^3.0.0",
+ "@npmcli/run-script": "^9.0.1",
+ "bin-links": "^5.0.0",
+ "cacache": "^19.0.1",
+ "common-ancestor-path": "^1.0.1",
+ "hosted-git-info": "^8.0.0",
+ "json-stringify-nice": "^1.1.4",
+ "lru-cache": "^10.2.2",
+ "minimatch": "^9.0.4",
+ "nopt": "^8.0.0",
+ "npm-install-checks": "^7.1.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "pacote": "^21.0.0",
+ "parse-conflict-json": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "proggy": "^3.0.0",
+ "promise-all-reject-late": "^1.0.0",
+ "promise-call-limit": "^3.0.1",
+ "read-package-json-fast": "^4.0.0",
+ "semver": "^7.3.7",
+ "ssri": "^12.0.0",
+ "treeverse": "^3.0.0",
+ "walk-up-path": "^4.0.0"
+ },
+ "bin": {
+ "arborist": "bin/index.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/config": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/config/-/config-10.1.0.tgz",
+ "integrity": "sha512-ygyCJATTr+xmuQHiX28adNT3tbDcWIfHQggNtLL2ykSyH4VCF5YeG4SilZaYIxf+72GZA6CJpESaDyhq9Boozg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/map-workspaces": "^4.0.1",
+ "@npmcli/package-json": "^6.0.1",
+ "ci-info": "^4.0.0",
+ "ini": "^5.0.0",
+ "nopt": "^8.1.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "walk-up-path": "^4.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/fs": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz",
+ "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/git": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz",
+ "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/promise-spawn": "^8.0.0",
+ "ini": "^5.0.0",
+ "lru-cache": "^10.0.1",
+ "npm-pick-manifest": "^10.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "semver": "^7.3.5",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/installed-package-contents": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz",
+ "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-bundled": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "bin": {
+ "installed-package-contents": "bin/index.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/map-workspaces": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz",
+ "integrity": "sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/name-from-folder": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "glob": "^10.2.2",
+ "minimatch": "^9.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/metavuln-calculator": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.0.tgz",
+ "integrity": "sha512-znLKqdy1ZEGNK3VB9j/RzGyb/P0BJb3fGpvEbHIAyBAXsps2l1ce8SVHfsGAFLl9s8072PxafqTn7RC8wSnQPg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cacache": "^19.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "pacote": "^21.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/name-from-folder": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz",
+ "integrity": "sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/node-gyp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz",
+ "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/package-json": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.1.tgz",
+ "integrity": "sha512-d5qimadRAUCO4A/Txw71VM7UrRZzV+NPclxz/dc+M6B2oYwjWTjqh8HA/sGQgs9VZuJ6I/P7XIAlJvgrl27ZOw==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "glob": "^10.2.2",
+ "hosted-git-info": "^8.0.0",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.5.3",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/promise-spawn": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz",
+ "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/query": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-4.0.0.tgz",
+ "integrity": "sha512-3pPbese0fbCiFJ/7/X1GBgxAKYFE8sxBddA7GtuRmOgNseH4YbGsXJ807Ig3AEwNITjDUISHglvy89cyDJnAwA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^6.1.2"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/redact": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.1.1.tgz",
+ "integrity": "sha512-3Hc2KGIkrvJWJqTbvueXzBeZlmvoOxc2jyX00yzr3+sNFquJg0N8hH4SAPLPVrkWIRQICVpVgjrss971awXVnA==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@npmcli/run-script": {
+ "version": "9.0.2",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/node-gyp": "^4.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "node-gyp": "^11.0.0",
+ "proc-log": "^5.0.0",
+ "which": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/bundle": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz",
+ "integrity": "sha512-Mm1E3/CmDDCz3nDhFKTuYdB47EdRFRQMOE/EAbiG1MJW77/w1b3P7Qx7JSrVJs8PfwOLOVcKQCHErIwCTyPbag==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.4.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz",
+ "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/protobuf-specs": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.0.tgz",
+ "integrity": "sha512-o09cLSIq9EKyRXwryWDOJagkml9XgQCoCSRjHOnHLnvsivaW7Qznzz6yjfV7PHJHhIvyp8OH7OX8w0Dc5bQK7A==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/sign": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz",
+ "integrity": "sha512-knzjmaOHOov1Ur7N/z4B1oPqZ0QX5geUfhrVaqVlu+hl0EAoL4o+l0MSULINcD5GCWe3Z0+YJO8ues6vFlW0Yw==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "make-fetch-happen": "^14.0.2",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/tuf": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.0.tgz",
+ "integrity": "sha512-suVMQEA+sKdOz5hwP9qNcEjX6B45R+hFFr4LAWzbRc5O+U2IInwvay/bpG5a4s+qR35P/JK/PiKiRGjfuLy1IA==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "tuf-js": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@sigstore/verify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.0.tgz",
+ "integrity": "sha512-kAAM06ca4CzhvjIZdONAL9+MLppW3K48wOFy1TbuaWFW/OMfl8JuTgW0Bm02JB1WJGT/ET2eqav0KTEKmxqkIA==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/@tufjs/canonical-json": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz",
+ "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/@tufjs/models": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz",
+ "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/canonical-json": "2.0.0",
+ "minimatch": "^9.0.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/abbrev": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz",
+ "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/agent-base": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/aproba": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/bin-links": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz",
+ "integrity": "sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cmd-shim": "^7.0.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "read-cmd-shim": "^5.0.0",
+ "write-file-atomic": "^6.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/binary-extensions": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-3.0.0.tgz",
+ "integrity": "sha512-X0RfwMgXPEesg6PCXzytQZt9Unh9gtc4SfeTNJvKifUL//Oegcc/Yf31z6hThNZ8dnD3Ir3wkHVN0eWrTvP5ww==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/cacache": {
+ "version": "19.0.1",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz",
+ "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/fs": "^4.0.0",
+ "fs-minipass": "^3.0.0",
+ "glob": "^10.2.2",
+ "lru-cache": "^10.0.1",
+ "minipass": "^7.0.3",
+ "minipass-collect": "^2.0.1",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "p-map": "^7.0.2",
+ "ssri": "^12.0.0",
+ "tar": "^7.4.3",
+ "unique-filename": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/minizlib": {
+ "version": "3.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/tar": {
+ "version": "7.4.3",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/cacache/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/ci-info": {
+ "version": "4.1.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/cidr-regex": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-4.1.3.tgz",
+ "integrity": "sha512-86M1y3ZeQvpZkZejQCcS+IaSWjlDUC+ORP0peScQ4uEUFCZ8bEQVz7NlJHqysoUb6w3zCjx4Mq/8/2RHhMwHYw==",
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "ip-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/cli-columns": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz",
+ "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/npm/node_modules/cmd-shim": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz",
+ "integrity": "sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/common-ancestor-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz",
+ "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm/node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/npm/node_modules/diff": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz",
+ "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==",
+ "inBundle": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/npm/node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/npm/node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/npm/node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/exponential-backoff": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz",
+ "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==",
+ "inBundle": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/npm/node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/npm/node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/fs-minipass": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
+ "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/hosted-git-info": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz",
+ "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "inBundle": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/npm/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm/node_modules/ignore-walk": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz",
+ "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minimatch": "^9.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/npm/node_modules/ini": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz",
+ "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/init-package-json": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-8.0.0.tgz",
+ "integrity": "sha512-zKgxfaGt6Zzi8VBSInOK0CYDigA9gzDCWPnSzGIoUlTU/5w7qIyi+6MyJYX96mMlxDGrIR85FhQszVyodYfB9g==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/package-json": "^6.1.0",
+ "npm-package-arg": "^12.0.0",
+ "promzard": "^2.0.0",
+ "read": "^4.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4",
+ "validate-npm-package-name": "^6.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/npm/node_modules/ip-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz",
+ "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/is-cidr": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-5.1.1.tgz",
+ "integrity": "sha512-AwzRMjtJNTPOgm7xuYZ71715z99t+4yRnSnSzgK5err5+heYi4zMuvmpUadaJ28+KCXCQo8CjUrKQZRWSPmqTQ==",
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "cidr-regex": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/npm/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/npm/node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/json-parse-even-better-errors": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz",
+ "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/json-stringify-nice": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz",
+ "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==",
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/jsonparse": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
+ "engines": [
+ "node >= 0.2.0"
+ ],
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz",
+ "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/just-diff-apply": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz",
+ "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/libnpmaccess": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-10.0.0.tgz",
+ "integrity": "sha512-Nz9Lolajvh6nPA5ixdKNfN2BJS0N7LvqTXPqy3+F37i3T4mcped24JCjwnp5KCPCB0ewX3ccopwUnhaTS1/yXg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmdiff": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/libnpmdiff/-/libnpmdiff-8.0.1.tgz",
+ "integrity": "sha512-3HoZq96FtqpEq1miPKQVj49T+KAKF4bP1UflWBBQ1YZDwm77tgNnYttuSRj6N41R5B2bxL5wK8a0zFbFGIN7tw==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "binary-extensions": "^3.0.0",
+ "diff": "^7.0.0",
+ "minimatch": "^9.0.4",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^21.0.0",
+ "tar": "^6.2.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmexec": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/libnpmexec/-/libnpmexec-10.1.0.tgz",
+ "integrity": "sha512-ojQgfhwlC4PCzHUSVRaTUg3aKxrJbArtc/9KwC3mED1Wc1FSW11pHo0Ufs5DJLDbRK5LhjjEQ8AxzwRIUQVY+A==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/package-json": "^6.1.1",
+ "@npmcli/run-script": "^9.0.1",
+ "ci-info": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^21.0.0",
+ "proc-log": "^5.0.0",
+ "read": "^4.0.0",
+ "read-package-json-fast": "^4.0.0",
+ "semver": "^7.3.7",
+ "walk-up-path": "^4.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmfund": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/libnpmfund/-/libnpmfund-7.0.1.tgz",
+ "integrity": "sha512-bkam0l6uKTTwBZ5LhG05tdTnMt75g/jrL5tzPaWIpSMDWlcqFqLy+aqT+FkQCi4fCp8XDEOCZ2POqCyAFUiJuA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.0.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmorg": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-8.0.0.tgz",
+ "integrity": "sha512-VO/mxds3Qu67S7/3TsFbykN+7kzpes14P/RiO3ECtLtUYQdlE5ddXGArRgU2tP4hUHZRvyBhc4sSiAXEzTA4eQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmpack": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/libnpmpack/-/libnpmpack-9.0.1.tgz",
+ "integrity": "sha512-0b9x8h0xAiu99ZewqZqZInf82dCxVx2AWB6jqwooIHzey4i2XYcIi0Tcik9GhkayU5nJ5WLD/W9PVyZcIWcm2w==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/arborist": "^9.0.1",
+ "@npmcli/run-script": "^9.0.1",
+ "npm-package-arg": "^12.0.0",
+ "pacote": "^21.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmpublish": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-11.0.0.tgz",
+ "integrity": "sha512-c+cBWLWXafHzmSEQwRVKjHP6KkWntvqvAAT83agwmWrOwRpEXWDtiIlkopwzPcLRau6BcS6BwOttTlAWboH3BQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "ci-info": "^4.0.0",
+ "normalize-package-data": "^7.0.0",
+ "npm-package-arg": "^12.0.0",
+ "npm-registry-fetch": "^18.0.1",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7",
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmsearch": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-9.0.0.tgz",
+ "integrity": "sha512-uMUbX5ynU/imuXlijCPathemyi1EZVtka9PEbaIqghdrjdHmMJITbyTsmSB+muzBWm1NUUFwRRKdpwktEmvipg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmteam": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-8.0.0.tgz",
+ "integrity": "sha512-GfbxITlY4rVe3PKUU6wBjfNNc4Xho9Jv03N0sdzqho9H+9hynFjiwJpfWGwfVBdtimH+kPQW58qRUMott/Bkyg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "aproba": "^2.0.0",
+ "npm-registry-fetch": "^18.0.1"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/libnpmversion": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/libnpmversion/-/libnpmversion-8.0.0.tgz",
+ "integrity": "sha512-nqHD/YQtC/xLRquvFj2W2hvTNAIWSssJdz5ULCV0jAGBxjlQaPS9s8FNIiJ3w+iina+pCJo5AmlBjA7oWew0JQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.1",
+ "@npmcli/run-script": "^9.0.1",
+ "json-parse-even-better-errors": "^4.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/npm/node_modules/make-fetch-happen": {
+ "version": "14.0.3",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz",
+ "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/agent": "^3.0.0",
+ "cacache": "^19.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^1.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "ssri": "^12.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/make-fetch-happen/node_modules/negotiator": {
+ "version": "1.0.0",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/npm/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-collect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
+ "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-fetch": {
+ "version": "4.0.0",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.3",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^3.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.13"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-fetch/node_modules/minizlib": {
+ "version": "3.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": {
+ "version": "3.3.6",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": {
+ "version": "3.3.6",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": {
+ "version": "3.3.6",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/mute-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp": {
+ "version": "11.1.0",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "glob": "^10.3.10",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^14.0.3",
+ "nopt": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.4.3",
+ "which": "^5.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/minizlib": {
+ "version": "3.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "inBundle": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/tar": {
+ "version": "7.4.3",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.0.1",
+ "mkdirp": "^3.0.1",
+ "yallist": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/node-gyp/node_modules/yallist": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/npm/node_modules/nopt": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz",
+ "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "abbrev": "^3.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/normalize-package-data": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz",
+ "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==",
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^8.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-audit-report": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-6.0.0.tgz",
+ "integrity": "sha512-Ag6Y1irw/+CdSLqEEAn69T8JBgBThj5mw0vuFIKeP7hATYuQuS5jkMjK6xmVB8pr7U4g5Audbun0lHhBDMIBRA==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-bundled": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz",
+ "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-install-checks": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz",
+ "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==",
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "semver": "^7.1.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-normalize-package-bin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
+ "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-package-arg": {
+ "version": "12.0.2",
+ "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz",
+ "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "hosted-git-info": "^8.0.0",
+ "proc-log": "^5.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-name": "^6.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-packlist": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.0.tgz",
+ "integrity": "sha512-rht9U6nS8WOBDc53eipZNPo5qkAV4X2rhKE2Oj1DYUQ3DieXfj0mKkVmjnf3iuNdtMd8WfLdi2L6ASkD/8a+Kg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "ignore-walk": "^7.0.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-pick-manifest": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz",
+ "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-install-checks": "^7.1.0",
+ "npm-normalize-package-bin": "^4.0.0",
+ "npm-package-arg": "^12.0.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-profile": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-11.0.1.tgz",
+ "integrity": "sha512-HP5Cw9WHwFS9vb4fxVlkNAQBUhVL5BmW6rAR+/JWkpwqcFJid7TihKUdYDWqHl0NDfLd0mpucheGySqo8ysyfw==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-registry-fetch": {
+ "version": "18.0.2",
+ "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz",
+ "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/redact": "^3.0.0",
+ "jsonparse": "^1.3.1",
+ "make-fetch-happen": "^14.0.0",
+ "minipass": "^7.0.2",
+ "minipass-fetch": "^4.0.0",
+ "minizlib": "^3.0.1",
+ "npm-package-arg": "^12.0.0",
+ "proc-log": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/npm-registry-fetch/node_modules/minizlib": {
+ "version": "3.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^7.0.4",
+ "rimraf": "^5.0.5"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/npm/node_modules/npm-user-validate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-3.0.0.tgz",
+ "integrity": "sha512-9xi0RdSmJ4mPYTC393VJPz1Sp8LyCx9cUnm/L9Qcb3cFO8gjT4mN20P9FAsea8qDHdQ7LtcN8VLh2UT47SdKCw==",
+ "inBundle": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/p-map": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
+ "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/npm/node_modules/pacote": {
+ "version": "21.0.0",
+ "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.0.0.tgz",
+ "integrity": "sha512-lcqexq73AMv6QNLo7SOpz0JJoaGdS3rBFgF122NZVl1bApo2mfu+XzUBU/X/XsiJu+iUmKpekRayqQYAs+PhkA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^9.0.0",
+ "cacache": "^19.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^12.0.0",
+ "npm-packlist": "^10.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/npm/node_modules/parse-conflict-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-4.0.0.tgz",
+ "integrity": "sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^4.0.0",
+ "just-diff": "^6.0.0",
+ "just-diff-apply": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "inBundle": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npm/node_modules/proc-log": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
+ "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/proggy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/proggy/-/proggy-3.0.0.tgz",
+ "integrity": "sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/promise-all-reject-late": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz",
+ "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==",
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/promise-call-limit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz",
+ "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==",
+ "inBundle": true,
+ "license": "ISC",
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/promzard": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/promzard/-/promzard-2.0.0.tgz",
+ "integrity": "sha512-Ncd0vyS2eXGOjchIRg6PVCYKetJYrW1BSbbIo+bKdig61TB6nH2RQNF2uP+qMpsI73L/jURLWojcw8JNIKZ3gg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "read": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/qrcode-terminal": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz",
+ "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==",
+ "inBundle": true,
+ "bin": {
+ "qrcode-terminal": "bin/qrcode-terminal.js"
+ }
+ },
+ "node_modules/npm/node_modules/read": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/read/-/read-4.1.0.tgz",
+ "integrity": "sha512-uRfX6K+f+R8OOrYScaM3ixPY4erg69f8DN6pgTvMcA9iRc8iDhwrA4m3Yu8YYKsXJgVvum+m8PkRboZwwuLzYA==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "mute-stream": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/read-cmd-shim": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz",
+ "integrity": "sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/read-package-json-fast": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz",
+ "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "json-parse-even-better-errors": "^4.0.0",
+ "npm-normalize-package-bin": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/npm/node_modules/rimraf": {
+ "version": "5.0.10",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^10.3.7"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "inBundle": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/npm/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "inBundle": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/npm/node_modules/sigstore": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz",
+ "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "@sigstore/sign": "^3.1.0",
+ "@sigstore/tuf": "^3.1.0",
+ "@sigstore/verify": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/socks": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz",
+ "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "inBundle": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/npm/node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+ "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/spdx-license-ids": {
+ "version": "3.0.21",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz",
+ "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==",
+ "inBundle": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/npm/node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "inBundle": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/npm/node_modules/ssri": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz",
+ "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/supports-color": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz",
+ "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm/node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/tiny-relative-date": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz",
+ "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/treeverse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz",
+ "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/tuf-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz",
+ "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tufjs/models": "3.0.1",
+ "debug": "^4.3.6",
+ "make-fetch-happen": "^14.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/unique-filename": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz",
+ "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "unique-slug": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/unique-slug": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz",
+ "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "inBundle": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/npm/node_modules/validate-npm-package-name": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz",
+ "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/walk-up-path": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz",
+ "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/npm/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/which/node_modules/isexe": {
+ "version": "3.1.1",
+ "inBundle": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "inBundle": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "inBundle": true,
+ "license": "MIT"
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "5.1.2",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "inBundle": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/npm/node_modules/write-file-atomic": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz",
+ "integrity": "sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ==",
+ "inBundle": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/npm/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "inBundle": true,
+ "license": "ISC"
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-function": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
+ "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
+ "dev": true,
+ "dependencies": {
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ora/node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ora/node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ora/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/ora/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ordered-binary": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz",
+ "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
+ "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz",
+ "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/retry": "0.12.2",
+ "is-network-error": "^1.0.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-retry/node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="
+ },
+ "node_modules/package-manager-detector": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.11.tgz",
+ "integrity": "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==",
+ "dependencies": {
+ "quansync": "^0.2.7"
+ }
+ },
+ "node_modules/pacote": {
+ "version": "20.0.0",
+ "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz",
+ "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==",
+ "dependencies": {
+ "@npmcli/git": "^6.0.0",
+ "@npmcli/installed-package-contents": "^3.0.0",
+ "@npmcli/package-json": "^6.0.0",
+ "@npmcli/promise-spawn": "^8.0.0",
+ "@npmcli/run-script": "^9.0.0",
+ "cacache": "^19.0.0",
+ "fs-minipass": "^3.0.0",
+ "minipass": "^7.0.2",
+ "npm-package-arg": "^12.0.0",
+ "npm-packlist": "^9.0.0",
+ "npm-pick-manifest": "^10.0.0",
+ "npm-registry-fetch": "^18.0.0",
+ "proc-log": "^5.0.0",
+ "promise-retry": "^2.0.1",
+ "sigstore": "^3.0.0",
+ "ssri": "^12.0.0",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "pacote": "bin/index.js"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/parchment": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/parchment/-/parchment-3.0.0.tgz",
+ "integrity": "sha512-HUrJFQ/StvgmXRcQ1ftY6VEZUq3jA2t9ncFN4F84J/vN0/FPpQF+8FKXb3l6fLces6q0uOHj6NJn+2xvZnxO6A=="
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-json/node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
+ "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+ "dependencies": {
+ "entities": "^4.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-html-rewriting-stream": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz",
+ "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==",
+ "dev": true,
+ "dependencies": {
+ "entities": "^4.3.0",
+ "parse5": "^7.0.0",
+ "parse5-sax-parser": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-sax-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz",
+ "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==",
+ "dev": true,
+ "dependencies": {
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz",
+ "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/piscina": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.8.0.tgz",
+ "integrity": "sha512-EZJb+ZxDrQf3dihsUL7p42pjNyrNIFJCrRHPMgxu/svsj+P3xS3fuEWp7k2+rfsavfl1N0G29b1HGs7J0m8rZA==",
+ "dev": true,
+ "optionalDependencies": {
+ "@napi-rs/nice": "^1.0.1"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
+ "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz",
+ "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==",
+ "dependencies": {
+ "confbox": "^0.2.1",
+ "exsolve": "^1.0.1",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.2",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
+ "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz",
+ "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^9.0.0",
+ "jiti": "^1.20.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+ "dev": true
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true
+ },
+ "node_modules/preact": {
+ "version": "10.12.1",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.12.1.tgz",
+ "integrity": "sha512-l8386ixSsBdbreOAkqtrwqHwdvR35ID8c3rKPa8lCWuO86dBi32QWHV4vfsZK1utLLFMvw+Z5Ad4XLkZzchscg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/preact"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz",
+ "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/proc-log": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
+ "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true
+ },
+ "node_modules/qjobs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.9"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz",
+ "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ]
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quill": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/quill/-/quill-2.0.3.tgz",
+ "integrity": "sha512-xEYQBqfYx/sfb33VJiKnSJp8ehloavImQ2A6564GAbqG55PGw1dAWUn1MUbQB62t0azawUS2CZZhWCjO8gRvTw==",
+ "dependencies": {
+ "eventemitter3": "^5.0.1",
+ "lodash-es": "^4.17.21",
+ "parchment": "^3.0.0",
+ "quill-delta": "^5.1.0"
+ },
+ "engines": {
+ "npm": ">=8.2.3"
+ }
+ },
+ "node_modules/quill-delta": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-5.1.0.tgz",
+ "integrity": "sha512-X74oCeRI4/p0ucjb5Ma8adTXd9Scumz367kkMK5V/IatcX6A0vlgLgKbzXWy5nZmCGeNJm2oQX0d2Eqj+ZIlCA==",
+ "dependencies": {
+ "fast-diff": "^1.3.0",
+ "lodash.clonedeep": "^4.5.0",
+ "lodash.isequal": "^4.5.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/quill/node_modules/eventemitter3": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
+ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/reflect-metadata": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
+ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
+ "dev": true
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "dev": true
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regex-parser": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz",
+ "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==",
+ "dev": true
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
+ "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.12.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
+ "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-url-loader": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz",
+ "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==",
+ "dev": true,
+ "dependencies": {
+ "adjust-sourcemap-loader": "^4.0.0",
+ "convert-source-map": "^1.7.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^8.2.14",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/resolve-url-loader/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.34.8",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz",
+ "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.6"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.34.8",
+ "@rollup/rollup-android-arm64": "4.34.8",
+ "@rollup/rollup-darwin-arm64": "4.34.8",
+ "@rollup/rollup-darwin-x64": "4.34.8",
+ "@rollup/rollup-freebsd-arm64": "4.34.8",
+ "@rollup/rollup-freebsd-x64": "4.34.8",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.34.8",
+ "@rollup/rollup-linux-arm-musleabihf": "4.34.8",
+ "@rollup/rollup-linux-arm64-gnu": "4.34.8",
+ "@rollup/rollup-linux-arm64-musl": "4.34.8",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.34.8",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8",
+ "@rollup/rollup-linux-riscv64-gnu": "4.34.8",
+ "@rollup/rollup-linux-s390x-gnu": "4.34.8",
+ "@rollup/rollup-linux-x64-gnu": "4.34.8",
+ "@rollup/rollup-linux-x64-musl": "4.34.8",
+ "@rollup/rollup-win32-arm64-msvc": "4.34.8",
+ "@rollup/rollup-win32-ia32-msvc": "4.34.8",
+ "@rollup/rollup-win32-x64-msvc": "4.34.8",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-applescript": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
+ "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "devOptional": true
+ },
+ "node_modules/sass": {
+ "version": "1.85.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz",
+ "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "16.0.5",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.5.tgz",
+ "integrity": "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw==",
+ "dev": true,
+ "dependencies": {
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/schema-utils": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "dev": true
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/send/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "dev": true,
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "dev": true,
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-static/node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
+ "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sigstore": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz",
+ "integrity": "sha512-ZpzWAFHIFqyFE56dXqgX/DkDRZdz+rRcjoIk/RQU4IX0wiCv1l8S7ZrXDHcCc+uaf+6o7w3h2l3g6GYG5TKN9Q==",
+ "dependencies": {
+ "@sigstore/bundle": "^3.1.0",
+ "@sigstore/core": "^2.0.0",
+ "@sigstore/protobuf-specs": "^0.4.0",
+ "@sigstore/sign": "^3.1.0",
+ "@sigstore/tuf": "^3.1.0",
+ "@sigstore/verify": "^2.1.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/simplebar-angular": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/simplebar-angular/-/simplebar-angular-3.2.4.tgz",
+ "integrity": "sha512-cBjr+GD2c4RaO85Yyo0Y1PsKeRdIgu5tgXp3FiNqyUwlisQUKZVweDiVuCtlec4nJTIwNJSoPV6yW8S1ek1B/A==",
+ "dependencies": {
+ "simplebar-core": "^1.2.4",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=12.0.0",
+ "@angular/core": ">=12.0.0"
+ }
+ },
+ "node_modules/simplebar-core": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/simplebar-core/-/simplebar-core-1.3.0.tgz",
+ "integrity": "sha512-LpWl3w0caz0bl322E68qsrRPpIn+rWBGAaEJ0lUJA7Xpr2sw92AkIhg6VWj988IefLXYh50ILatfAnbNoCFrlA==",
+ "dependencies": {
+ "lodash": "^4.17.21"
+ }
+ },
+ "node_modules/slash": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
+ "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socket.io": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
+ "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.3.2",
+ "engine.io": "~6.6.0",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/socket.io-adapter": {
+ "version": "2.5.5",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
+ "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "~4.3.4",
+ "ws": "~8.17.1"
+ }
+ },
+ "node_modules/socket.io-adapter/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+ "dev": true,
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/socket.io-parser/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/socket.io/node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dev": true,
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz",
+ "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==",
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-loader": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz",
+ "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==",
+ "dev": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.72.1"
+ }
+ },
+ "node_modules/source-map-loader/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.21",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz",
+ "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
+ },
+ "node_modules/ssri": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz",
+ "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/streamroller": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz",
+ "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
+ "dev": true,
+ "dependencies": {
+ "date-format": "^4.0.14",
+ "debug": "^4.3.4",
+ "fs-extra": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/sweetalert2": {
+ "version": "11.17.2",
+ "resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.17.2.tgz",
+ "integrity": "sha512-HKxDr1IyV3Lxr3W6sb61qm/p2epFIEdr5EKwteRFHnIg6f8nHFl2kX++DBVz16Mac+fFiU3hMpjq1L6yE2Ge5w==",
+ "funding": {
+ "type": "individual",
+ "url": "https://github.com/sponsors/limonte"
+ }
+ },
+ "node_modules/swiper": {
+ "version": "11.2.6",
+ "resolved": "https://registry.npmjs.org/swiper/-/swiper-11.2.6.tgz",
+ "integrity": "sha512-8aXpYKtjy3DjcbzZfz+/OX/GhcU5h+looA6PbAzHMZT6ESSycSp9nAjPCenczgJyslV+rUGse64LMGpWE3PX9Q==",
+ "funding": [
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/swiperjs"
+ },
+ {
+ "type": "open_collective",
+ "url": "http://opencollective.com/swiper"
+ }
+ ],
+ "engines": {
+ "node": ">= 4.7.0"
+ }
+ },
+ "node_modules/symbol-observable": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
+ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tar/node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar/node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/terser": {
+ "version": "5.39.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz",
+ "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.14",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
+ "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/thingies": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz",
+ "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.18"
+ },
+ "peerDependencies": {
+ "tslib": "^2"
+ }
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true
+ },
+ "node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
+ "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
+ "dependencies": {
+ "fdir": "^6.4.3",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tree-dump": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz",
+ "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
+ },
+ "node_modules/tuf-js": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz",
+ "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==",
+ "dependencies": {
+ "@tufjs/models": "3.0.1",
+ "debug": "^4.3.6",
+ "make-fetch-happen": "^14.0.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/turndown": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz",
+ "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==",
+ "dependencies": {
+ "@mixmark-io/domino": "^2.2.0"
+ }
+ },
+ "node_modules/turndown-plugin-gfm": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz",
+ "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg=="
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-assert": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz",
+ "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==",
+ "dev": true
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/ua-parser-js": {
+ "version": "0.7.40",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz",
+ "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/faisalman"
+ }
+ ],
+ "bin": {
+ "ua-parser-js": "script/cli.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
+ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ=="
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unique-filename": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz",
+ "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==",
+ "dependencies": {
+ "unique-slug": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/unique-slug": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz",
+ "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==",
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/validate-npm-package-name": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz",
+ "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/vanilla-colorful": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/vanilla-colorful/-/vanilla-colorful-0.7.2.tgz",
+ "integrity": "sha512-z2YZusTFC6KnLERx1cgoIRX2CjPRP0W75N+3CC6gbvdX5Ch47rZkEMGO2Xnf+IEmi3RiFLxS18gayMA27iU7Kg=="
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.2.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.5.tgz",
+ "integrity": "sha512-j023J/hCAa4pRIUH6J9HemwYfjB5llR2Ps0CWeikOtdR8+pAURAk0DoJC5/mm9kd+UgdnIy7d6HE4EAvlYhPhA==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "postcss": "^8.5.3",
+ "rollup": "^4.30.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "dev": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/weak-lru-cache": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz",
+ "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/webpack": {
+ "version": "5.98.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz",
+ "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.11",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz",
+ "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==",
+ "dev": true,
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^4.6.0",
+ "mime-types": "^2.1.31",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.0.tgz",
+ "integrity": "sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==",
+ "dev": true,
+ "dependencies": {
+ "@types/bonjour": "^3.5.13",
+ "@types/connect-history-api-fallback": "^1.5.4",
+ "@types/express": "^4.17.21",
+ "@types/serve-index": "^1.9.4",
+ "@types/serve-static": "^1.15.5",
+ "@types/sockjs": "^0.3.36",
+ "@types/ws": "^8.5.10",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.2.1",
+ "chokidar": "^3.6.0",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "express": "^4.21.2",
+ "graceful-fs": "^4.2.6",
+ "http-proxy-middleware": "^2.0.7",
+ "ipaddr.js": "^2.1.0",
+ "launch-editor": "^2.6.1",
+ "open": "^10.0.3",
+ "p-retry": "^6.2.0",
+ "schema-utils": "^4.2.0",
+ "selfsigned": "^2.4.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^7.4.2",
+ "ws": "^8.18.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
+ "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
+ "dev": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-subresource-integrity": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz",
+ "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==",
+ "dev": true,
+ "dependencies": {
+ "typed-assert": "^1.0.8"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependencies": {
+ "html-webpack-plugin": ">= 5.0.0-beta.1 < 6",
+ "webpack": "^5.12.0"
+ },
+ "peerDependenciesMeta": {
+ "html-webpack-plugin": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack/node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dev": true,
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+ "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "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.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.1.tgz",
+ "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors-cjs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
+ "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zone.js": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz",
+ "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA=="
+ }
+ }
+}
diff --git a/apiferia/package.json b/apiferia/package.json
new file mode 100644
index 00000000..202cbf4b
--- /dev/null
+++ b/apiferia/package.json
@@ -0,0 +1,89 @@
+{
+ "name": "reback",
+ "version": "0.0.0",
+ "scripts": {
+ "ng": "ng",
+ "start": "ng serve",
+ "build": "ng build",
+ "watch": "ng build --watch --configuration development",
+ "test": "ng test",
+ "format": "prettier --write src/**/*.{ts,html}"
+ },
+ "private": true,
+ "dependencies": {
+ "@angular/animations": "^19.0.6",
+ "@angular/cdk": "^19.0.5",
+ "@angular/common": "^19.0.6",
+ "@angular/compiler": "^19.0.6",
+ "@angular/core": "^19.0.6",
+ "@angular/forms": "^19.0.6",
+ "@angular/google-maps": "^19.0.2",
+ "@angular/platform-browser": "^19.0.6",
+ "@angular/platform-browser-dynamic": "^19.0.6",
+ "@angular/router": "^19.0.6",
+ "@ckeditor/ckeditor5-angular": "^9.1.0",
+ "@ckeditor/ckeditor5-build-classic": "^44.3.0",
+ "@ctrl/ngx-emoji-mart": "^9.2.0",
+ "@fullcalendar/angular": "^6.1.17",
+ "@fullcalendar/bootstrap": "^6.1.17",
+ "@fullcalendar/core": "^6.1.17",
+ "@fullcalendar/daygrid": "^6.1.17",
+ "@fullcalendar/interaction": "^6.1.17",
+ "@fullcalendar/list": "^6.1.17",
+ "@fullcalendar/timegrid": "^6.1.17",
+ "@iconify-json/iconamoon": "^1.2.2",
+ "@iconify/utils": "^2.3.0",
+ "@ng-bootstrap/ng-bootstrap": "^18.0.0",
+ "@ngrx/effects": "^19.1.0",
+ "@ngrx/store": "^19.1.0",
+ "@ngrx/store-devtools": "^19.1.0",
+ "@popperjs/core": "^2.11.8",
+ "angularx-flatpickr": "^8.1.0",
+ "apexcharts": "^4.5.0",
+ "bootstrap": "^5.3.5",
+ "choices.js": "^11.1.0",
+ "ckeditor5": "^44.3.0",
+ "dayjs": "^1.11.13",
+ "flatpickr": "^4.6.13",
+ "gumshoejs": "^5.1.2",
+ "iconify-icon": "^2.3.0",
+ "jsvectormap": "1.3.3",
+ "moment": "^2.30.1",
+ "ng-apexcharts": "^1.15.0",
+ "ng2-nouislider": "^2.0.0",
+ "ngrx-store-localstorage": "^19.0.0",
+ "ngx-clipboard": "^16.0.0",
+ "ngx-cookie-service": "^19.1.2",
+ "ngx-dropzone-wrapper": "^17.0.0",
+ "ngx-mask": "^19.0.6",
+ "ngx-progressbar": "^14.0.0",
+ "ngx-quill": "^27.0.1",
+ "ngx-toastr": "^19.0.0",
+ "nouislider": "^15.8.1",
+ "npm": "^11.2.0",
+ "prettier": "^3.5.3",
+ "quill": "^2.0.3",
+ "quill-delta": "^5.1.0",
+ "rxjs": "~7.8.2",
+ "simplebar-angular": "3.2.4",
+ "sweetalert2": "^11.17.2",
+ "swiper": "^11.2.6",
+ "tslib": "^2.8.1",
+ "zone.js": "~0.15.0"
+ },
+ "devDependencies": {
+ "@angular-devkit/build-angular": "^19.0.7",
+ "@angular/cli": "^19.0.7",
+ "@angular/compiler-cli": "^19.0.0",
+ "@angular/localize": "^19.0.0",
+ "@types/jasmine": "~5.1.0",
+ "jasmine-core": "~5.1.0",
+ "karma": "~6.4.0",
+ "karma-chrome-launcher": "~3.2.0",
+ "karma-coverage": "~2.2.0",
+ "karma-jasmine": "~5.1.0",
+ "karma-jasmine-html-reporter": "~2.1.0",
+ "typescript": "~5.8.3",
+ "vite": "^6.2.5"
+ }
+}
diff --git a/apiferia/src/app/app.component.html b/apiferia/src/app/app.component.html
new file mode 100644
index 00000000..7cc32635
--- /dev/null
+++ b/apiferia/src/app/app.component.html
@@ -0,0 +1,8 @@
+
+
diff --git a/apiferia/src/app/app.component.scss b/apiferia/src/app/app.component.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/apiferia/src/app/app.component.spec.ts b/apiferia/src/app/app.component.spec.ts
new file mode 100644
index 00000000..558bcda5
--- /dev/null
+++ b/apiferia/src/app/app.component.spec.ts
@@ -0,0 +1,29 @@
+import { TestBed } from '@angular/core/testing'
+import { AppComponent } from './app.component'
+
+describe('AppComponent', () => {
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [AppComponent],
+ }).compileComponents()
+ })
+
+ it('should create the app', () => {
+ const fixture = TestBed.createComponent(AppComponent)
+ const app = fixture.componentInstance
+ expect(app).toBeTruthy()
+ })
+
+ it(`should have the 'Reback' title`, () => {
+ const fixture = TestBed.createComponent(AppComponent)
+ const app = fixture.componentInstance
+ // expect(app.title).toEqual('Reback')
+ })
+
+ it('should render title', () => {
+ const fixture = TestBed.createComponent(AppComponent)
+ fixture.detectChanges()
+ const compiled = fixture.nativeElement as HTMLElement
+ expect(compiled.querySelector('h1')?.textContent).toContain('Hello, Reback')
+ })
+})
diff --git a/apiferia/src/app/app.component.ts b/apiferia/src/app/app.component.ts
new file mode 100644
index 00000000..e48ffda8
--- /dev/null
+++ b/apiferia/src/app/app.component.ts
@@ -0,0 +1,53 @@
+import { Component, inject, ViewChild, type OnInit } from '@angular/core'
+import { CommonModule } from '@angular/common'
+import {
+ NavigationCancel,
+ NavigationEnd,
+ NavigationError,
+ NavigationStart,
+ Router,
+ RouterOutlet,
+ type Event,
+} from '@angular/router'
+import { TitleService } from '@core/services/title.service'
+import { NgProgressbar, NgProgressRef } from 'ngx-progressbar'
+
+@Component({
+ selector: 'app-root',
+ standalone: true,
+ imports: [CommonModule, RouterOutlet, NgProgressbar],
+ templateUrl: './app.component.html',
+ styleUrl: './app.component.scss',
+})
+export class AppComponent implements OnInit {
+ @ViewChild(NgProgressRef) progressBar!: NgProgressRef
+
+ private titleService = inject(TitleService)
+ private router = inject(Router)
+
+ constructor() {
+ this.router.events.subscribe((event: Event) => {
+ this.checkRouteChange(event)
+ })
+ }
+
+ ngOnInit(): void {
+ this.titleService.init()
+ }
+
+ // show Loader when route change
+ checkRouteChange(routerEvent: Event) {
+ if (routerEvent instanceof NavigationStart) {
+ this.progressBar.start()
+ }
+ if (
+ routerEvent instanceof NavigationEnd ||
+ routerEvent instanceof NavigationCancel ||
+ routerEvent instanceof NavigationError
+ ) {
+ setTimeout(() => {
+ this.progressBar.complete()
+ }, 200)
+ }
+ }
+}
diff --git a/apiferia/src/app/app.config.ts b/apiferia/src/app/app.config.ts
new file mode 100644
index 00000000..a58a0c65
--- /dev/null
+++ b/apiferia/src/app/app.config.ts
@@ -0,0 +1,57 @@
+import {
+ ApplicationConfig,
+ importProvidersFrom,
+ isDevMode,
+ provideExperimentalZonelessChangeDetection,
+ provideZoneChangeDetection,
+} from '@angular/core'
+import {
+ provideRouter,
+ withInMemoryScrolling,
+ type InMemoryScrollingFeature,
+ type InMemoryScrollingOptions,
+} from '@angular/router'
+
+import {
+ HTTP_INTERCEPTORS,
+ provideHttpClient,
+ withFetch,
+ withInterceptorsFromDi,
+} from '@angular/common/http'
+import { provideStore } from '@ngrx/store'
+import { provideStoreDevtools } from '@ngrx/store-devtools'
+import { routes } from './app.routes'
+import { rootReducer } from './store'
+import { localStorageSyncReducer } from './store/layout/layout-reducers'
+import { DecimalPipe } from '@angular/common'
+import { provideEffects } from '@ngrx/effects'
+import { CalendarEffects } from './store/calendar/calendar.effects'
+import { FakeBackendProvider } from './helpers/fake-backend'
+import { AuthenticationEffects } from './store/authentication/authentication.effects'
+import { provideToastr } from 'ngx-toastr'
+import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
+import { BrowserModule } from '@angular/platform-browser'
+
+// scroll
+const scrollConfig: InMemoryScrollingOptions = {
+ scrollPositionRestoration: 'top',
+ anchorScrolling: 'enabled',
+}
+
+const inMemoryScrollingFeatures: InMemoryScrollingFeature =
+ withInMemoryScrolling(scrollConfig)
+
+export const appConfig: ApplicationConfig = {
+ providers: [
+ FakeBackendProvider,
+ provideZoneChangeDetection({ eventCoalescing: true }),
+ provideRouter(routes, inMemoryScrollingFeatures),
+ DecimalPipe,
+ provideStore(rootReducer, { metaReducers: [localStorageSyncReducer] }),
+ provideStoreDevtools({ maxAge: 25, logOnly: !isDevMode() }),
+ provideEffects(AuthenticationEffects, CalendarEffects),
+ provideHttpClient(withFetch(), withInterceptorsFromDi()),
+ importProvidersFrom(BrowserAnimationsModule, BrowserModule),
+ provideToastr({}),
+ ],
+}
diff --git a/apiferia/src/app/app.routes.ts b/apiferia/src/app/app.routes.ts
new file mode 100644
index 00000000..eb4f1b37
--- /dev/null
+++ b/apiferia/src/app/app.routes.ts
@@ -0,0 +1,47 @@
+import { RedirectCommand, Router, Routes, type UrlTree } from '@angular/router'
+import { AuthLayoutComponent } from './layouts/auth-layout/auth-layout.component'
+import { PrivateLayoutComponent } from './layouts/private-layout/private-layout.component'
+import { AuthenticationService } from './core/services/auth.service'
+import { inject } from '@angular/core'
+import { CarViewComponent } from './views/car-view/car-view.component';
+
+export const routes: Routes = [
+ {
+ path: '',
+ redirectTo: 'dashboard/analytics',
+ pathMatch: 'full',
+ },
+ {
+ path: '',
+ component: PrivateLayoutComponent,
+ canActivate: [
+ () => {
+ const currentUser = inject(AuthenticationService).session
+ const router: Router = inject(Router)
+ if (currentUser) return true
+ const urlTree: UrlTree = router.parseUrl('/auth/sign-in')
+ return new RedirectCommand(urlTree, { skipLocationChange: true })
+ },
+ ],
+ loadChildren: () =>
+ import('./views/views.route').then((mod) => mod.VIEW_ROUTES),
+ },
+ {
+ path: '',
+ component: AuthLayoutComponent,
+ loadChildren: () =>
+ import('./views/other-pages/other-page.route').then(
+ (mod) => mod.OTHER_PAGES_ROUTES
+ ),
+ },
+ {
+ path: 'auth',
+ component: AuthLayoutComponent,
+ loadChildren: () =>
+ import('./views/auth/auth.route').then((mod) => mod.AUTH_ROUTES),
+ },
+ {
+ path: 'cars',
+ component: CarViewComponent
+ },
+]
diff --git a/apiferia/src/app/common/apexchart.model.ts b/apiferia/src/app/common/apexchart.model.ts
new file mode 100644
index 00000000..dfd0972a
--- /dev/null
+++ b/apiferia/src/app/common/apexchart.model.ts
@@ -0,0 +1,44 @@
+import {
+ ApexAxisChartSeries,
+ ApexNonAxisChartSeries,
+ ApexChart,
+ ChartComponent,
+ ApexDataLabels,
+ ApexPlotOptions,
+ ApexYAxis,
+ ApexLegend,
+ ApexStroke,
+ ApexXAxis,
+ ApexFill,
+ ApexTooltip,
+ ApexTitleSubtitle,
+ ApexResponsive,
+ ApexAnnotations,
+ ApexGrid,
+ ApexStates,
+ ApexMarkers,
+ ApexTheme,
+} from 'ng-apexcharts'
+
+export type ChartOptions = {
+ series: ApexAxisChartSeries | ApexNonAxisChartSeries
+ chart: ApexChart
+ xaxis: ApexXAxis
+ fill: ApexFill
+ stroke: ApexStroke
+ tooltip: ApexTooltip
+ dataLabels: ApexDataLabels
+ plotOptions: ApexPlotOptions
+ markers: ApexMarkers
+ responsive: ApexResponsive[]
+ colors: string[]
+ labels: string[]
+ annotations: ApexAnnotations
+ yaxis: ApexYAxis | ApexYAxis[]
+ grid: ApexGrid
+ legend: ApexLegend
+ title: ApexTitleSubtitle
+ subtitle: ApexTitleSubtitle
+ states: ApexStates
+ theme: ApexTheme
+}
diff --git a/apiferia/src/app/common/constants.ts b/apiferia/src/app/common/constants.ts
new file mode 100644
index 00000000..ada7a961
--- /dev/null
+++ b/apiferia/src/app/common/constants.ts
@@ -0,0 +1,12 @@
+type CurrencyType = '₹' | '$' | '€'
+
+export const currency: CurrencyType = '$'
+
+export const currentYear = new Date().getFullYear()
+
+export const credits = {
+ name: 'Techzaa',
+ buyLink: '',
+}
+
+export const basePath: string = '/'
diff --git a/apiferia/src/app/common/menu-meta.ts b/apiferia/src/app/common/menu-meta.ts
new file mode 100644
index 00000000..1d1131f4
--- /dev/null
+++ b/apiferia/src/app/common/menu-meta.ts
@@ -0,0 +1,911 @@
+export type MenuItem = {
+ key?: string
+ label?: string
+ icon?: string
+ link?: string
+ collapsed?: boolean
+ subMenu?: any
+ isTitle?: boolean
+ badge?: any
+ parentKey?: string
+ disabled?: boolean
+}
+
+export const MENU: MenuItem[] = [
+ {
+ key: 'general',
+ label: 'GENERAL',
+ isTitle: true,
+ },
+ {
+ key: 'dashboards',
+ icon: 'iconamoon:home-duotone',
+ label: 'Dashboards',
+ collapsed: false,
+ subMenu: [
+ {
+ key: 'dashboard-analytics',
+ label: 'Analytics',
+ link: '/dashboard/analytics',
+ parentKey: 'dashboards',
+ },
+ {
+ key: 'dashboard-finance',
+ label: 'Finance',
+ link: '/dashboard/finance',
+ parentKey: 'dashboards',
+ },
+ {
+ key: 'dashboard-sales',
+ label: 'Sales',
+ link: '/dashboard/sales',
+ parentKey: 'dashboards',
+ },
+ ],
+ },
+ {
+ key: 'apps',
+ label: 'APPS',
+ isTitle: true,
+ },
+ {
+ key: 'ecommerce',
+ icon: 'iconamoon:shopping-bag-duotone',
+ label: 'Ecommerce',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'ecommerce-products',
+ label: 'Products',
+ link: '/ecommerce/products',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-productsdetails',
+ label: 'Product Details',
+ link: '/ecommerce/product/1',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-createproduct',
+ label: 'Create Product',
+ link: '/ecommerce/create',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-customers',
+ label: 'Customers',
+ link: '/ecommerce/customers',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-sellers',
+ label: 'Sellers',
+ link: '/ecommerce/sellers',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-orders',
+ label: 'Orders',
+ link: '/ecommerce/orders',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-orderdetails',
+ label: 'Order Details',
+ link: '/ecommerce/orders/10001',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-inventory',
+ label: 'Inventory',
+ link: '/ecommerce/inventory',
+ parentKey: 'ecommerce',
+ },
+ ],
+ },
+ {
+ key: 'apps-chat',
+ icon: 'iconamoon:comment-dots-duotone',
+ label: 'Chat',
+ link: '/apps/chat',
+ },
+ {
+ key: 'apps-email',
+ icon: 'iconamoon:email-duotone',
+ label: 'Email',
+ link: '/apps/email',
+ },
+ {
+ key: 'apps-calendar',
+ icon: 'iconamoon:calendar-1-duotone',
+ label: 'Calendar',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'calendar-schedule',
+ label: 'Schedule',
+ link: '/calendar/schedule',
+ parentKey: 'apps-calendar',
+ },
+ {
+ key: 'calendar-integration',
+ label: 'Integration',
+ link: '/calendar/integration',
+ parentKey: 'apps-calendar',
+ },
+ {
+ key: 'calendar-help',
+ label: 'Help',
+ link: '/calendar/help',
+ parentKey: 'apps-calendar',
+ },
+ ],
+ },
+ {
+ key: 'apps-todo',
+ icon: 'iconamoon:ticket-duotone',
+ label: 'Todo',
+ link: '/apps/todo',
+ },
+ {
+ key: 'apps-social',
+ icon: 'iconamoon:squinting-face-duotone',
+ label: 'Social',
+ link: '/apps/social',
+ badge: {
+ variant: 'danger',
+ text: 'Hot',
+ },
+ },
+ {
+ key: 'apps-contacts',
+ icon: 'iconamoon:profile-circle-duotone',
+ label: 'Contacts',
+ link: '/apps/contacts',
+ },
+ {
+ key: 'apps-invoices',
+ icon: 'iconamoon:invoice-duotone',
+ label: 'Invoices',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'invoices',
+ label: 'Invoices',
+ link: '/invoices',
+ parentKey: 'apps-invoices',
+ },
+ {
+ key: 'invoices-details',
+ label: 'Invoice Details',
+ link: '/invoice/RB6985',
+ parentKey: 'apps-invoices',
+ },
+ ],
+ },
+ {
+ key: 'feria',
+ label: 'FERIA DE VEHÍCULOS',
+ isTitle: true,
+ },
+ {
+ key: 'vehicles',
+ icon: 'iconamoon:car-duotone',
+ label: 'Vehículos',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'vehicles-list',
+ label: 'Lista de Vehículos',
+ link: '/vehicles',
+ parentKey: 'vehicles',
+ },
+ {
+ key: 'vehicles-create',
+ label: 'Nuevo Vehículo',
+ link: '/vehicles/create',
+ parentKey: 'vehicles',
+ },
+ {
+ key: 'vehicles-import',
+ label: 'Importar Vehículos',
+ link: '/vehicles/import',
+ parentKey: 'vehicles',
+ },
+ ],
+ },
+ {
+ key: 'finance',
+ icon: 'iconamoon:certificate-badge-duotone',
+ label: 'Financiamiento',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'finance-applications',
+ label: 'Aplicaciones',
+ link: '/finance/applications',
+ parentKey: 'finance',
+ },
+ {
+ key: 'finance-companies',
+ label: 'Financieras',
+ link: '/finance/companies',
+ parentKey: 'finance',
+ },
+ {
+ key: 'finance-calculator',
+ label: 'Calculadora',
+ link: '/finance/calculator',
+ parentKey: 'finance',
+ },
+ ],
+ },
+ {
+ key: 'insurance',
+ icon: 'iconamoon:shield-yes-duotone',
+ label: 'Seguros',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'insurance-quotes',
+ label: 'Cotizaciones',
+ link: '/insurance/quotes',
+ parentKey: 'insurance',
+ },
+ {
+ key: 'insurance-companies',
+ label: 'Aseguradoras',
+ link: '/insurance/companies',
+ parentKey: 'insurance',
+ },
+ ],
+ },
+ {
+ key: 'sales',
+ icon: 'iconamoon:shopping-cart-duotone',
+ label: 'Ventas',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'sales-list',
+ label: 'Lista de Ventas',
+ link: '/sales',
+ parentKey: 'sales',
+ },
+ {
+ key: 'sales-reports',
+ label: 'Reportes',
+ link: '/sales/reports',
+ parentKey: 'sales',
+ },
+ {
+ key: 'sales-commissions',
+ label: 'Comisiones',
+ link: '/sales/commissions',
+ parentKey: 'sales',
+ },
+ ],
+ },
+ {
+ key: 'custom',
+ label: 'Custom',
+ isTitle: true,
+ },
+ {
+ key: 'pages',
+ label: 'Pages',
+ isTitle: false,
+ icon: 'iconamoon:copy-duotone',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'page-welcome',
+ label: 'Welcome',
+ link: '/pages/welcome',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-faqs',
+ label: 'FAQs',
+ link: '/pages/faqs',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-profile',
+ label: 'Profile',
+ link: '/pages/profile',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-coming-soon',
+ label: 'Coming Soon',
+ link: '/coming-soon',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-contact-us',
+ label: 'Contact Us',
+ link: '/pages/contact-us',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-about-us',
+ label: 'About Us',
+ link: '/pages/about-us',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-our-team',
+ label: 'Our Team',
+ link: '/pages/our-team',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-timeline',
+ label: 'Timeline',
+ link: '/pages/timeline',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-pricing',
+ label: 'Pricing',
+ link: '/pages/pricing',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-maintenance',
+ label: 'Maintenance',
+ link: '/maintenance',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-404-error',
+ label: '404 Error',
+ link: '/error-404',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-404-error2',
+ label: '404 Error 2',
+ link: '/error-404-2',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-error-404-alt',
+ label: 'Error 404 (alt)',
+ link: '/pages/error-404-alt',
+ parentKey: 'pages',
+ },
+ ],
+ },
+ {
+ key: 'page-authentication',
+ label: 'Authentication',
+ isTitle: false,
+ icon: 'iconamoon:lock-duotone',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'sign-in',
+ label: 'Sign In',
+ link: '/auth/sign-in',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'sign-in-2',
+ label: 'Sign In 2',
+ link: '/auth/sign-in-2',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'signup',
+ label: 'Sign Up',
+ link: '/auth/sign-up',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'signup2',
+ label: 'Sign Up 2',
+ link: '/auth/sign-up-2',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'reset-pass',
+ label: 'Reset Password',
+ link: '/auth/reset-pass',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'reset-pass2',
+ label: 'Reset Password 2',
+ link: '/auth/reset-pass-2',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'lock-screen',
+ label: 'Lock Screen',
+ link: '/auth/lock-screen',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'lock-screen-2',
+ label: 'Lock Screen 2',
+ link: '/auth/lock-screen-2',
+ parentKey: 'page-authentication',
+ },
+ ],
+ },
+ {
+ key: 'widgets',
+ icon: 'iconamoon:gift-duotone',
+ label: 'Widgets',
+ link: '/widgets',
+ badge: {
+ variant: 'info',
+ text: '9+',
+ },
+ },
+ {
+ key: 'components',
+ label: 'COMPONENTS',
+ isTitle: true,
+ },
+ {
+ key: 'base-ui',
+ icon: 'iconamoon:briefcase-duotone',
+ label: 'Base UI',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'base-ui-accordions',
+ label: 'Accordion',
+ link: '/ui/accordions',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-alerts',
+ label: 'Alerts',
+ link: '/ui/alerts',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-avatars',
+ label: 'Avatar',
+ link: '/ui/avatars',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-badges',
+ label: 'Badge',
+ link: '/ui/badges',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-breadcrumb',
+ label: 'Breadcrumb',
+ link: '/ui/breadcrumb',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-buttons',
+ label: 'Buttons',
+ link: '/ui/buttons',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-cards',
+ label: 'Card',
+ link: '/ui/cards',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-carousel',
+ label: 'Carousel',
+ link: '/ui/carousel',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-collapse',
+ label: 'Collapse',
+ link: '/ui/collapse',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-dropdowns',
+ label: 'Dropdown',
+ link: '/ui/dropdowns',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-list-group',
+ label: 'List Group',
+ link: '/ui/list-group',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-modals',
+ label: 'Modal',
+ link: '/ui/modals',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-tabs',
+ label: 'Tabs',
+ link: '/ui/tabs',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-offcanvas',
+ label: 'Offcanvas',
+ link: '/ui/offcanvas',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-pagination',
+ label: 'Pagination',
+ link: '/ui/pagination',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-placeholders',
+ label: 'Placeholders',
+ link: '/ui/placeholders',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-popovers',
+ label: 'Popovers',
+ link: '/ui/popovers',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-progress',
+ label: 'Progress',
+ link: '/ui/progress',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-scrollspy',
+ label: 'Scrollspy',
+ link: '/ui/scrollspy',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-spinners',
+ label: 'Spinners',
+ link: '/ui/spinners',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-toasts',
+ label: 'Toasts',
+ link: '/ui/toasts',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-tooltips',
+ label: 'Tooltips',
+ link: '/ui/tooltips',
+ parentKey: 'base-ui',
+ },
+ ],
+ },
+ {
+ key: 'advanced-ui',
+ icon: 'iconamoon:component-duotone',
+ label: 'Advanced UI',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'advanced-ui-ratings',
+ label: 'Ratings',
+ link: '/advanced/ratings',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-sweet-alert',
+ label: 'Sweet Alert',
+ link: '/advanced/alert',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-swiper-slider',
+ label: 'Swiper Slider',
+ link: '/advanced/swiper',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-scrollbar',
+ label: 'Scrollbar',
+ link: '/advanced/scrollbar',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-toastify',
+ label: 'Toastify',
+ link: '/advanced/toastify',
+ parentKey: 'advanced-ui',
+ },
+ ],
+ },
+ {
+ key: 'charts',
+ icon: 'iconamoon:3d-duotone',
+ label: 'Charts',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'charts-area',
+ label: 'Area',
+ link: '/charts/area',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-bar',
+ label: 'Bar',
+ link: '/charts/bar',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-bubble',
+ label: 'Bubble',
+ link: '/charts/bubble',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-candl-stick',
+ label: 'Candlestick',
+ link: '/charts/candlestick',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-column',
+ label: 'Column',
+ link: '/charts/column',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-heatmap',
+ label: 'Heatmap',
+ link: '/charts/heatmap',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-line',
+ label: 'Line',
+ link: '/charts/line',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-mixed',
+ label: 'Mixed',
+ link: '/charts/mixed',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-timeline',
+ label: 'Timeline',
+ link: '/charts/timeline',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-boxplot',
+ label: 'Boxplot',
+ link: '/charts/boxplot',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-treemap',
+ label: 'Treemap',
+ link: '/charts/treemap',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-pie',
+ label: 'Pie',
+ link: '/charts/pie',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-radar',
+ label: 'Radar',
+ link: '/charts/radar',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-radial-bar',
+ label: 'RadialBar',
+ link: '/charts/radial-bar',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-scatter',
+ label: 'Scatter',
+ link: '/charts/scatter',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-polar-area',
+ label: 'Polar Area',
+ link: '/charts/polar',
+ parentKey: 'charts',
+ },
+ ],
+ },
+ {
+ key: 'forms',
+ icon: 'iconamoon:cheque-duotone',
+ label: 'Forms',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'forms-basic-elements',
+ label: 'Basic Elements',
+ link: '/forms/basic',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-checkbox&radio',
+ label: 'Checkbox & Radio',
+ link: '/forms/checkbox',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-choice-select',
+ label: 'Choice Select',
+ link: '/forms/select',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-clipboard',
+ label: 'Clipboard',
+ link: '/forms/clipboard',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-flat-picker',
+ label: 'Flatpicker',
+ link: '/forms/flat-picker',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-validation',
+ label: 'Validation',
+ link: '/forms/validation',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-wizard',
+ label: 'Wizard',
+ link: '/forms/wizard',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-file-uploads',
+ label: 'File Upload',
+ link: '/forms/file-uploads',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-editors',
+ label: 'Editors',
+ link: '/forms/editors',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-input-mask',
+ label: 'Input Mask',
+ link: '/forms/input-mask',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-slider',
+ label: 'Slider',
+ link: '/forms/slider',
+ parentKey: 'forms',
+ },
+ ],
+ },
+ {
+ key: 'tables',
+ icon: 'iconamoon:box-duotone',
+ label: 'Tables',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'tables-basic',
+ label: 'Basic Tables',
+ link: '/tables/basic',
+ parentKey: 'tables',
+ },
+ {
+ key: 'tables-grid-js',
+ label: 'Datatables',
+ link: '/tables/datatable',
+ parentKey: 'tables',
+ },
+ ],
+ },
+ {
+ key: 'icons',
+ icon: 'iconamoon:lightning-1-duotone',
+ label: 'Icons',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'icons-boxicons',
+ label: 'Boxicons',
+ link: '/icons/boxicons',
+ parentKey: 'icons',
+ },
+ {
+ key: 'icons-iconamoon',
+ label: 'IconaMoon Icons',
+ link: '/icons/iconamoon',
+ parentKey: 'icons',
+ },
+ ],
+ },
+ {
+ key: 'maps',
+ icon: 'iconamoon:location-pin-duotone',
+ label: 'Maps',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'maps-google',
+ label: 'Google Maps',
+ link: '/maps/google',
+ parentKey: 'maps',
+ },
+ {
+ key: 'maps-vector',
+ label: 'Vector Maps',
+ link: '/maps/vector',
+ parentKey: 'maps',
+ },
+ ],
+ },
+ {
+ key: 'badge-menu',
+ icon: 'iconamoon:badge-duotone',
+ label: 'Badge Menu',
+ badge: {
+ variant: 'danger',
+ text: '1',
+ },
+ },
+ {
+ key: 'menuitem',
+ icon: 'iconamoon:folder-add-duotone',
+ label: 'Menu Item',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'menu-item-1',
+ label: 'Menu Item 1',
+ parentKey: 'menuitem',
+ },
+ {
+ key: 'menu-item-2',
+ label: 'Menu Item 2',
+ collapsed: true,
+ parentKey: 'menuitem',
+ subMenu: [
+ {
+ key: 'menu-sub-item',
+ label: 'Menu Sub Item',
+ parentKey: 'menu-item-2',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ key: 'disabled-item',
+ icon: 'iconamoon:unavailable-duotone',
+ label: 'Disabled Item',
+ disabled: true,
+ },
+]
diff --git a/apiferia/src/app/common/menu-meta.ts.backup b/apiferia/src/app/common/menu-meta.ts.backup
new file mode 100644
index 00000000..90667348
--- /dev/null
+++ b/apiferia/src/app/common/menu-meta.ts.backup
@@ -0,0 +1,808 @@
+export type MenuItem = {
+ key?: string
+ label?: string
+ icon?: string
+ link?: string
+ collapsed?: boolean
+ subMenu?: any
+ isTitle?: boolean
+ badge?: any
+ parentKey?: string
+ disabled?: boolean
+}
+
+export const MENU: MenuItem[] = [
+ {
+ key: 'general',
+ label: 'GENERAL',
+ isTitle: true,
+ },
+ {
+ key: 'dashboards',
+ icon: 'iconamoon:home-duotone',
+ label: 'Dashboards',
+ collapsed: false,
+ subMenu: [
+ {
+ key: 'dashboard-analytics',
+ label: 'Analytics',
+ link: '/dashboard/analytics',
+ parentKey: 'dashboards',
+ },
+ {
+ key: 'dashboard-finance',
+ label: 'Finance',
+ link: '/dashboard/finance',
+ parentKey: 'dashboards',
+ },
+ {
+ key: 'dashboard-sales',
+ label: 'Sales',
+ link: '/dashboard/sales',
+ parentKey: 'dashboards',
+ },
+ ],
+ },
+ {
+ key: 'apps',
+ label: 'APPS',
+ isTitle: true,
+ },
+ {
+ key: 'ecommerce',
+ icon: 'iconamoon:shopping-bag-duotone',
+ label: 'Ecommerce',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'ecommerce-products',
+ label: 'Products',
+ link: '/ecommerce/products',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-productsdetails',
+ label: 'Product Details',
+ link: '/ecommerce/product/1',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-createproduct',
+ label: 'Create Product',
+ link: '/ecommerce/create',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-customers',
+ label: 'Customers',
+ link: '/ecommerce/customers',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-sellers',
+ label: 'Sellers',
+ link: '/ecommerce/sellers',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-orders',
+ label: 'Orders',
+ link: '/ecommerce/orders',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-orderdetails',
+ label: 'Order Details',
+ link: '/ecommerce/orders/10001',
+ parentKey: 'ecommerce',
+ },
+ {
+ key: 'ecommerce-inventory',
+ label: 'Inventory',
+ link: '/ecommerce/inventory',
+ parentKey: 'ecommerce',
+ },
+ ],
+ },
+ {
+ key: 'apps-chat',
+ icon: 'iconamoon:comment-dots-duotone',
+ label: 'Chat',
+ link: '/apps/chat',
+ },
+ {
+ key: 'apps-email',
+ icon: 'iconamoon:email-duotone',
+ label: 'Email',
+ link: '/apps/email',
+ },
+ {
+ key: 'apps-calendar',
+ icon: 'iconamoon:calendar-1-duotone',
+ label: 'Calendar',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'calendar-schedule',
+ label: 'Schedule',
+ link: '/calendar/schedule',
+ parentKey: 'apps-calendar',
+ },
+ {
+ key: 'calendar-integration',
+ label: 'Integration',
+ link: '/calendar/integration',
+ parentKey: 'apps-calendar',
+ },
+ {
+ key: 'calendar-help',
+ label: 'Help',
+ link: '/calendar/help',
+ parentKey: 'apps-calendar',
+ },
+ ],
+ },
+ {
+ key: 'apps-todo',
+ icon: 'iconamoon:ticket-duotone',
+ label: 'Todo',
+ link: '/apps/todo',
+ },
+ {
+ key: 'apps-social',
+ icon: 'iconamoon:squinting-face-duotone',
+ label: 'Social',
+ link: '/apps/social',
+ badge: {
+ variant: 'danger',
+ text: 'Hot',
+ },
+ },
+ {
+ key: 'apps-contacts',
+ icon: 'iconamoon:profile-circle-duotone',
+ label: 'Contacts',
+ link: '/apps/contacts',
+ },
+ {
+ key: 'apps-invoices',
+ icon: 'iconamoon:invoice-duotone',
+ label: 'Invoices',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'invoices',
+ label: 'Invoices',
+ link: '/invoices',
+ parentKey: 'apps-invoices',
+ },
+ {
+ key: 'invoices-details',
+ label: 'Invoice Details',
+ link: '/invoice/RB6985',
+ parentKey: 'apps-invoices',
+ },
+ ],
+ },
+ {
+ key: 'custom',
+ label: 'Custom',
+ isTitle: true,
+ },
+ {
+ key: 'pages',
+ label: 'Pages',
+ isTitle: false,
+ icon: 'iconamoon:copy-duotone',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'page-welcome',
+ label: 'Welcome',
+ link: '/pages/welcome',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-faqs',
+ label: 'FAQs',
+ link: '/pages/faqs',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-profile',
+ label: 'Profile',
+ link: '/pages/profile',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-coming-soon',
+ label: 'Coming Soon',
+ link: '/coming-soon',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-contact-us',
+ label: 'Contact Us',
+ link: '/pages/contact-us',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-about-us',
+ label: 'About Us',
+ link: '/pages/about-us',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-our-team',
+ label: 'Our Team',
+ link: '/pages/our-team',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-timeline',
+ label: 'Timeline',
+ link: '/pages/timeline',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-pricing',
+ label: 'Pricing',
+ link: '/pages/pricing',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-maintenance',
+ label: 'Maintenance',
+ link: '/maintenance',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-404-error',
+ label: '404 Error',
+ link: '/error-404',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-404-error2',
+ label: '404 Error 2',
+ link: '/error-404-2',
+ parentKey: 'pages',
+ },
+ {
+ key: 'page-error-404-alt',
+ label: 'Error 404 (alt)',
+ link: '/pages/error-404-alt',
+ parentKey: 'pages',
+ },
+ ],
+ },
+ {
+ key: 'page-authentication',
+ label: 'Authentication',
+ isTitle: false,
+ icon: 'iconamoon:lock-duotone',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'sign-in',
+ label: 'Sign In',
+ link: '/auth/sign-in',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'sign-in-2',
+ label: 'Sign In 2',
+ link: '/auth/sign-in-2',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'signup',
+ label: 'Sign Up',
+ link: '/auth/sign-up',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'signup2',
+ label: 'Sign Up 2',
+ link: '/auth/sign-up-2',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'reset-pass',
+ label: 'Reset Password',
+ link: '/auth/reset-pass',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'reset-pass2',
+ label: 'Reset Password 2',
+ link: '/auth/reset-pass-2',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'lock-screen',
+ label: 'Lock Screen',
+ link: '/auth/lock-screen',
+ parentKey: 'page-authentication',
+ },
+ {
+ key: 'lock-screen-2',
+ label: 'Lock Screen 2',
+ link: '/auth/lock-screen-2',
+ parentKey: 'page-authentication',
+ },
+ ],
+ },
+ {
+ key: 'widgets',
+ icon: 'iconamoon:gift-duotone',
+ label: 'Widgets',
+ link: '/widgets',
+ badge: {
+ variant: 'info',
+ text: '9+',
+ },
+ },
+ {
+ key: 'components',
+ label: 'COMPONENTS',
+ isTitle: true,
+ },
+ {
+ key: 'base-ui',
+ icon: 'iconamoon:briefcase-duotone',
+ label: 'Base UI',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'base-ui-accordions',
+ label: 'Accordion',
+ link: '/ui/accordions',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-alerts',
+ label: 'Alerts',
+ link: '/ui/alerts',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-avatars',
+ label: 'Avatar',
+ link: '/ui/avatars',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-badges',
+ label: 'Badge',
+ link: '/ui/badges',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-breadcrumb',
+ label: 'Breadcrumb',
+ link: '/ui/breadcrumb',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-buttons',
+ label: 'Buttons',
+ link: '/ui/buttons',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-cards',
+ label: 'Card',
+ link: '/ui/cards',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-carousel',
+ label: 'Carousel',
+ link: '/ui/carousel',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-collapse',
+ label: 'Collapse',
+ link: '/ui/collapse',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-dropdowns',
+ label: 'Dropdown',
+ link: '/ui/dropdowns',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-list-group',
+ label: 'List Group',
+ link: '/ui/list-group',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-modals',
+ label: 'Modal',
+ link: '/ui/modals',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-tabs',
+ label: 'Tabs',
+ link: '/ui/tabs',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-offcanvas',
+ label: 'Offcanvas',
+ link: '/ui/offcanvas',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-pagination',
+ label: 'Pagination',
+ link: '/ui/pagination',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-placeholders',
+ label: 'Placeholders',
+ link: '/ui/placeholders',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-popovers',
+ label: 'Popovers',
+ link: '/ui/popovers',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-progress',
+ label: 'Progress',
+ link: '/ui/progress',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-scrollspy',
+ label: 'Scrollspy',
+ link: '/ui/scrollspy',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-spinners',
+ label: 'Spinners',
+ link: '/ui/spinners',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-toasts',
+ label: 'Toasts',
+ link: '/ui/toasts',
+ parentKey: 'base-ui',
+ },
+ {
+ key: 'base-ui-tooltips',
+ label: 'Tooltips',
+ link: '/ui/tooltips',
+ parentKey: 'base-ui',
+ },
+ ],
+ },
+ {
+ key: 'advanced-ui',
+ icon: 'iconamoon:component-duotone',
+ label: 'Advanced UI',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'advanced-ui-ratings',
+ label: 'Ratings',
+ link: '/advanced/ratings',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-sweet-alert',
+ label: 'Sweet Alert',
+ link: '/advanced/alert',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-swiper-slider',
+ label: 'Swiper Slider',
+ link: '/advanced/swiper',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-scrollbar',
+ label: 'Scrollbar',
+ link: '/advanced/scrollbar',
+ parentKey: 'advanced-ui',
+ },
+ {
+ key: 'advanced-ui-toastify',
+ label: 'Toastify',
+ link: '/advanced/toastify',
+ parentKey: 'advanced-ui',
+ },
+ ],
+ },
+ {
+ key: 'charts',
+ icon: 'iconamoon:3d-duotone',
+ label: 'Charts',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'charts-area',
+ label: 'Area',
+ link: '/charts/area',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-bar',
+ label: 'Bar',
+ link: '/charts/bar',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-bubble',
+ label: 'Bubble',
+ link: '/charts/bubble',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-candl-stick',
+ label: 'Candlestick',
+ link: '/charts/candlestick',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-column',
+ label: 'Column',
+ link: '/charts/column',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-heatmap',
+ label: 'Heatmap',
+ link: '/charts/heatmap',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-line',
+ label: 'Line',
+ link: '/charts/line',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-mixed',
+ label: 'Mixed',
+ link: '/charts/mixed',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-timeline',
+ label: 'Timeline',
+ link: '/charts/timeline',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-boxplot',
+ label: 'Boxplot',
+ link: '/charts/boxplot',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-treemap',
+ label: 'Treemap',
+ link: '/charts/treemap',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-pie',
+ label: 'Pie',
+ link: '/charts/pie',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-radar',
+ label: 'Radar',
+ link: '/charts/radar',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-radial-bar',
+ label: 'RadialBar',
+ link: '/charts/radial-bar',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-scatter',
+ label: 'Scatter',
+ link: '/charts/scatter',
+ parentKey: 'charts',
+ },
+ {
+ key: 'charts-polar-area',
+ label: 'Polar Area',
+ link: '/charts/polar',
+ parentKey: 'charts',
+ },
+ ],
+ },
+ {
+ key: 'forms',
+ icon: 'iconamoon:cheque-duotone',
+ label: 'Forms',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'forms-basic-elements',
+ label: 'Basic Elements',
+ link: '/forms/basic',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-checkbox&radio',
+ label: 'Checkbox & Radio',
+ link: '/forms/checkbox',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-choice-select',
+ label: 'Choice Select',
+ link: '/forms/select',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-clipboard',
+ label: 'Clipboard',
+ link: '/forms/clipboard',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-flat-picker',
+ label: 'Flatpicker',
+ link: '/forms/flat-picker',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-validation',
+ label: 'Validation',
+ link: '/forms/validation',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-wizard',
+ label: 'Wizard',
+ link: '/forms/wizard',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-file-uploads',
+ label: 'File Upload',
+ link: '/forms/file-uploads',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-editors',
+ label: 'Editors',
+ link: '/forms/editors',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-input-mask',
+ label: 'Input Mask',
+ link: '/forms/input-mask',
+ parentKey: 'forms',
+ },
+ {
+ key: 'forms-slider',
+ label: 'Slider',
+ link: '/forms/slider',
+ parentKey: 'forms',
+ },
+ ],
+ },
+ {
+ key: 'tables',
+ icon: 'iconamoon:box-duotone',
+ label: 'Tables',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'tables-basic',
+ label: 'Basic Tables',
+ link: '/tables/basic',
+ parentKey: 'tables',
+ },
+ {
+ key: 'tables-grid-js',
+ label: 'Datatables',
+ link: '/tables/datatable',
+ parentKey: 'tables',
+ },
+ ],
+ },
+ {
+ key: 'icons',
+ icon: 'iconamoon:lightning-1-duotone',
+ label: 'Icons',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'icons-boxicons',
+ label: 'Boxicons',
+ link: '/icons/boxicons',
+ parentKey: 'icons',
+ },
+ {
+ key: 'icons-iconamoon',
+ label: 'IconaMoon Icons',
+ link: '/icons/iconamoon',
+ parentKey: 'icons',
+ },
+ ],
+ },
+ {
+ key: 'maps',
+ icon: 'iconamoon:location-pin-duotone',
+ label: 'Maps',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'maps-google',
+ label: 'Google Maps',
+ link: '/maps/google',
+ parentKey: 'maps',
+ },
+ {
+ key: 'maps-vector',
+ label: 'Vector Maps',
+ link: '/maps/vector',
+ parentKey: 'maps',
+ },
+ ],
+ },
+ {
+ key: 'badge-menu',
+ icon: 'iconamoon:badge-duotone',
+ label: 'Badge Menu',
+ badge: {
+ variant: 'danger',
+ text: '1',
+ },
+ },
+ {
+ key: 'menuitem',
+ icon: 'iconamoon:folder-add-duotone',
+ label: 'Menu Item',
+ collapsed: true,
+ subMenu: [
+ {
+ key: 'menu-item-1',
+ label: 'Menu Item 1',
+ parentKey: 'menuitem',
+ },
+ {
+ key: 'menu-item-2',
+ label: 'Menu Item 2',
+ collapsed: true,
+ parentKey: 'menuitem',
+ subMenu: [
+ {
+ key: 'menu-sub-item',
+ label: 'Menu Sub Item',
+ parentKey: 'menu-item-2',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ key: 'disabled-item',
+ icon: 'iconamoon:unavailable-duotone',
+ label: 'Disabled Item',
+ disabled: true,
+ },
+]
diff --git a/apiferia/src/app/components/commonFunction.ts b/apiferia/src/app/components/commonFunction.ts
new file mode 100644
index 00000000..e99a0a09
--- /dev/null
+++ b/apiferia/src/app/components/commonFunction.ts
@@ -0,0 +1,7 @@
+// shuffle chart series
+export function shuffleArray(array: any[]): void {
+ for (let i = array.length - 1; i > 0; i--) {
+ const j = Math.floor(Math.random() * (i + 1))
+ ;[array[i], array[j]] = [array[j], array[i]]
+ }
+}
diff --git a/apiferia/src/app/components/file-uploader/file-uploader.component.ts b/apiferia/src/app/components/file-uploader/file-uploader.component.ts
new file mode 100644
index 00000000..77355729
--- /dev/null
+++ b/apiferia/src/app/components/file-uploader/file-uploader.component.ts
@@ -0,0 +1,129 @@
+import { Component, Input } from '@angular/core'
+import {
+ DROPZONE_CONFIG,
+ DropzoneConfigInterface,
+ DropzoneModule,
+} from 'ngx-dropzone-wrapper'
+
+type UploadedFile = {
+ name: string
+ size: number
+ type: string
+ dataURL?: string
+}
+
+const DEFAULT_DROPZONE_CONFIG: DropzoneConfigInterface = {
+ // Change this to your upload POST address:
+ url: 'https://httpbin.org/post',
+ maxFilesize: 50,
+ acceptedFiles: 'image/*',
+}
+
+@Component({
+ selector: 'FileUploader',
+ standalone: true,
+ imports: [DropzoneModule],
+ template: `
+
+
+ @if (showPreview && uploadedFiles) {
+
+ @for (file of uploadedFiles; track $index) {
+
+
+
+
+
+
+
+
+
+
+
+ {{ file.name }}
+
+
+ {{ file.size }}
+
+
+
+
+
+
+ Delete
+
+
+
+
+
+ }
+
+ }
+ `,
+ providers: [
+ {
+ provide: DROPZONE_CONFIG,
+ useValue: DEFAULT_DROPZONE_CONFIG,
+ },
+ ],
+})
+export class FileUploaderComponent {
+ @Input() showPreview: boolean = false
+
+ dropzone = `
+
+
+ Drop files here or click to
+ upload.
+
+
+ (This is just a demo
+ dropzone. Selected files are
+ not
+ actually uploaded.)
+
+ `
+ dropzoneConfig: DropzoneConfigInterface = {
+ url: 'https://httpbin.org/post',
+ maxFilesize: 50,
+ clickable: true,
+ addRemoveLinks: true,
+ }
+ uploadedFiles: any[] = []
+
+ ngOnInit(): void {
+ if (this.showPreview == true) {
+ this.dropzoneConfig.previewsContainer = false
+ }
+ }
+ // File Upload
+ imageURL: string = ''
+ onUploadSuccess(event: UploadedFile[]) {
+ setTimeout(() => {
+ this.uploadedFiles.push(event[0])
+ }, 0)
+ }
+
+ // File Remove
+ removeFile(index: number) {
+ this.uploadedFiles.splice(index, 1)
+ }
+}
diff --git a/apiferia/src/app/components/file-uploader/index.ts b/apiferia/src/app/components/file-uploader/index.ts
new file mode 100644
index 00000000..8ab54839
--- /dev/null
+++ b/apiferia/src/app/components/file-uploader/index.ts
@@ -0,0 +1 @@
+export { FileUploaderComponent } from './file-uploader.component'
diff --git a/apiferia/src/app/components/logo-box.component.ts b/apiferia/src/app/components/logo-box.component.ts
new file mode 100644
index 00000000..481b1d0d
--- /dev/null
+++ b/apiferia/src/app/components/logo-box.component.ts
@@ -0,0 +1,46 @@
+import { CommonModule } from '@angular/common'
+import { Component, Input } from '@angular/core'
+
+@Component({
+ selector: 'app-logo-box',
+ standalone: true,
+ imports: [CommonModule],
+ template: `
+
+ `,
+})
+export class LogoBoxComponent {
+ @Input() className: string = ''
+ @Input() height: string = ''
+ @Input() logoHeight: string = ''
+}
diff --git a/apiferia/src/app/components/page-title.component.ts b/apiferia/src/app/components/page-title.component.ts
new file mode 100644
index 00000000..e63f4441
--- /dev/null
+++ b/apiferia/src/app/components/page-title.component.ts
@@ -0,0 +1,25 @@
+import { Component, Input } from '@angular/core'
+
+@Component({
+ selector: 'app-page-title',
+ standalone: true,
+ template: `
+
+
+
+
{{ subtitle }}
+
+
+ {{ title }}
+
+ {{ subtitle }}
+
+
+
+
+ `,
+})
+export class PageTitleComponent {
+ @Input() title: string = ''
+ @Input() subtitle: string = ''
+}
diff --git a/apiferia/src/app/components/social-btn/social-btn.component.spec.ts b/apiferia/src/app/components/social-btn/social-btn.component.spec.ts
new file mode 100644
index 00000000..ccd67578
--- /dev/null
+++ b/apiferia/src/app/components/social-btn/social-btn.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SocialBtnComponent } from './social-btn.component'
+
+describe('SocialBtnComponent', () => {
+ let component: SocialBtnComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SocialBtnComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SocialBtnComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/components/social-btn/social-btn.component.ts b/apiferia/src/app/components/social-btn/social-btn.component.ts
new file mode 100644
index 00000000..1486dd3d
--- /dev/null
+++ b/apiferia/src/app/components/social-btn/social-btn.component.ts
@@ -0,0 +1,24 @@
+import { Component } from '@angular/core'
+
+@Component({
+ selector: 'app-social-btn',
+ standalone: true,
+ imports: [],
+ template: `
+ OR sign with
+
+
+ `,
+ styles: ``,
+})
+export class SocialBtnComponent {}
diff --git a/apiferia/src/app/components/state-card/state-card.component.html b/apiferia/src/app/components/state-card/state-card.component.html
new file mode 100644
index 00000000..fca44a82
--- /dev/null
+++ b/apiferia/src/app/components/state-card/state-card.component.html
@@ -0,0 +1,20 @@
+
+ @for (data of stateData; track $index; let last = $last) {
+
+
+
+
+
${{ data.amount }}k
+
{{ data.title }}
+
{{ data.badge }}%
+
+
+
+
+ }
+
diff --git a/apiferia/src/app/components/state-card/state-card.component.spec.ts b/apiferia/src/app/components/state-card/state-card.component.spec.ts
new file mode 100644
index 00000000..04913886
--- /dev/null
+++ b/apiferia/src/app/components/state-card/state-card.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { StateCardComponent } from './state-card.component'
+
+describe('StateCardComponent', () => {
+ let component: StateCardComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [StateCardComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(StateCardComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/components/state-card/state-card.component.ts b/apiferia/src/app/components/state-card/state-card.component.ts
new file mode 100644
index 00000000..570df0c5
--- /dev/null
+++ b/apiferia/src/app/components/state-card/state-card.component.ts
@@ -0,0 +1,58 @@
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
+
+@Component({
+ selector: 'state-card',
+ standalone: true,
+ imports: [],
+ templateUrl: './state-card.component.html',
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class StateCardComponent {
+ stateData = [
+ {
+ icon: 'iconamoon:shopping-card-add-duotone',
+ iconColor: 'info',
+ amount: '59.6',
+ title: 'Total Sales',
+ badge: '8.72',
+ badgeColor: 'success',
+ badgeIcon: 'bx bx-doughnut-chart',
+ },
+ {
+ icon: 'iconamoon:link-external-duotone',
+ iconColor: 'success',
+ amount: '24.03',
+ title: 'Total Expenses',
+ badge: '3.28',
+ badgeColor: 'danger',
+ badgeIcon: 'bx bx-bar-chart-alt-2',
+ },
+ {
+ icon: 'iconamoon:store-duotone',
+ iconColor: 'purple',
+ amount: '48.7',
+ title: 'Investments',
+ badge: '5.69',
+ badgeColor: 'danger',
+ badgeIcon: 'bx bx-building-house',
+ },
+ {
+ icon: 'iconamoon:gift-duotone',
+ iconColor: 'orange',
+ amount: '11.3',
+ title: 'Profit',
+ badge: '10.58',
+ badgeColor: 'success',
+ badgeIcon: 'bx bx-bowl-hot',
+ },
+ {
+ icon: 'iconamoon:certificate-badge-duotone',
+ iconColor: 'warning',
+ amount: '5.06',
+ title: 'Savings',
+ badge: '8.72',
+ badgeColor: 'success',
+ badgeIcon: 'bx bx-cricket-ball',
+ },
+ ]
+}
diff --git a/apiferia/src/app/components/swiper-directive.component.ts b/apiferia/src/app/components/swiper-directive.component.ts
new file mode 100644
index 00000000..4b80ac1d
--- /dev/null
+++ b/apiferia/src/app/components/swiper-directive.component.ts
@@ -0,0 +1,24 @@
+import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core'
+import type { SwiperOptions } from 'swiper/types/swiper-options'
+
+@Directive({
+ selector: 'swiper-container',
+ standalone: true,
+})
+export class SwiperDirective implements AfterViewInit {
+ private readonly swiperElement: HTMLElement
+
+ @Input('config') config?: SwiperOptions
+
+ constructor(
+ private el: ElementRef void }>
+ ) {
+ this.swiperElement = el.nativeElement
+ }
+
+ ngAfterViewInit() {
+ Object.assign(this.el.nativeElement, this.config)
+
+ this.el.nativeElement.initialize()
+ }
+}
diff --git a/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.html b/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.html
new file mode 100644
index 00000000..8aa9518c
--- /dev/null
+++ b/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.html
@@ -0,0 +1,14 @@
+
diff --git a/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.spec.ts b/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.spec.ts
new file mode 100644
index 00000000..5f061467
--- /dev/null
+++ b/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.spec.ts
@@ -0,0 +1,21 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+import { UIExamplesListComponent } from './ui-examples-list.component'
+
+describe('UIExamplesListComponent', () => {
+ let component: UIExamplesListComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [UIExamplesListComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(UIExamplesListComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.ts b/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.ts
new file mode 100644
index 00000000..e3e788a4
--- /dev/null
+++ b/apiferia/src/app/components/ui-examples-list/ui-examples-list.component.ts
@@ -0,0 +1,24 @@
+import { AfterViewInit, Component, Input } from '@angular/core'
+import Gumshoe from 'gumshoejs'
+
+@Component({
+ selector: 'ui-examples-list',
+ standalone: true,
+ templateUrl: './ui-examples-list.component.html',
+})
+export class UIExamplesListComponent implements AfterViewInit {
+ @Input() linkList: { label: string; link: string }[] | undefined
+
+ ngAfterViewInit() {
+ if (document.querySelector('.docs-nav a')) new Gumshoe('.docs-nav a')
+ }
+
+ scrollToSection(event: Event, link: string) {
+ event.preventDefault()
+ const targetId = link.substring(1)
+ const targetElement = document.getElementById(targetId)
+ if (targetElement) {
+ targetElement.scrollIntoView({ behavior: 'smooth', block: 'start' })
+ }
+ }
+}
diff --git a/apiferia/src/app/components/vector-maps/world-vector-map.component.ts b/apiferia/src/app/components/vector-maps/world-vector-map.component.ts
new file mode 100644
index 00000000..592fe5a9
--- /dev/null
+++ b/apiferia/src/app/components/vector-maps/world-vector-map.component.ts
@@ -0,0 +1,35 @@
+import { AfterViewInit, Component, Input, OnDestroy } from '@angular/core'
+
+declare global {
+ interface Window {
+ jsVectorMap?: any
+ }
+}
+
+@Component({
+ selector: 'app-world-vector-map',
+ standalone: true,
+ template:
+ '
',
+})
+export class WorldVectorMapComponent implements AfterViewInit {
+ @Input() width: string = ''
+ @Input() height: string = ''
+ @Input() options: Record = {}
+ @Input() type: string = ''
+ @Input() mapId: string = 'map'
+
+ constructor() {}
+
+ ngOnInit(): void {}
+
+ ngAfterViewInit(): void {
+ setTimeout(() => {
+ new (window as Window).jsVectorMap({
+ selector: '#' + this.mapId,
+ map: this.type,
+ ...this.options,
+ })
+ }, 200)
+ }
+}
diff --git a/apiferia/src/app/core/guards/role.guard.ts b/apiferia/src/app/core/guards/role.guard.ts
new file mode 100644
index 00000000..dd4df5bf
--- /dev/null
+++ b/apiferia/src/app/core/guards/role.guard.ts
@@ -0,0 +1,27 @@
+import { Injectable } from '@angular/core';
+import { Router, CanActivate, ActivatedRouteSnapshot } from '@angular/router';
+import { AuthenticationService } from '../services/auth.service';
+
+@Injectable({ providedIn: 'root' })
+export class RoleGuard implements CanActivate {
+ constructor(
+ private router: Router,
+ private authService: AuthenticationService
+ ) {}
+
+ canActivate(route: ActivatedRouteSnapshot): boolean {
+ const requiredRoles = route.data['roles'] as string[];
+
+ if (!requiredRoles || requiredRoles.length === 0) {
+ return true;
+ }
+
+ if (this.authService.hasRole(requiredRoles)) {
+ return true;
+ }
+
+ // No tiene el rol requerido
+ this.router.navigate(['/']);
+ return false;
+ }
+}
diff --git a/apiferia/src/app/core/interceptors/auth.interceptor.ts b/apiferia/src/app/core/interceptors/auth.interceptor.ts
new file mode 100644
index 00000000..c4f70f24
--- /dev/null
+++ b/apiferia/src/app/core/interceptors/auth.interceptor.ts
@@ -0,0 +1,45 @@
+import { Injectable } from '@angular/core'
+import {
+ HttpRequest,
+ HttpHandler,
+ HttpEvent,
+ HttpInterceptor,
+ HttpErrorResponse
+} from '@angular/common/http'
+import { Observable, throwError } from 'rxjs'
+import { catchError } from 'rxjs/operators'
+import { Router } from '@angular/router'
+import { Store } from '@ngrx/store'
+import { logout } from '@/app/store/authentication/authentication.actions'
+
+@Injectable()
+export class AuthInterceptor implements HttpInterceptor {
+ constructor(
+ private router: Router,
+ private store: Store
+ ) {}
+
+ intercept(request: HttpRequest, next: HttpHandler): Observable> {
+ // Obtener el token
+ const token = localStorage.getItem('access_token')
+
+ // Si hay token, agregarlo al header
+ if (token) {
+ request = request.clone({
+ setHeaders: {
+ Authorization: `Bearer ${token}`
+ }
+ })
+ }
+
+ return next.handle(request).pipe(
+ catchError((error: HttpErrorResponse) => {
+ if (error.status === 401) {
+ // Token expirado o inválido
+ this.store.dispatch(logout())
+ }
+ return throwError(() => error)
+ })
+ )
+ }
+}
diff --git a/apiferia/src/app/core/services/api/vehicles.service.ts b/apiferia/src/app/core/services/api/vehicles.service.ts
new file mode 100644
index 00000000..14fcf54a
--- /dev/null
+++ b/apiferia/src/app/core/services/api/vehicles.service.ts
@@ -0,0 +1,62 @@
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+export interface Vehicle {
+ id: string;
+ dealerId: string;
+ brand: string;
+ model: string;
+ year: number;
+ mileage: number;
+ condition: string;
+ price: number;
+ status: string;
+ qrCode?: string;
+ viewsCount: number;
+ scansCount: number;
+ createdAt?: Date;
+ updatedAt?: Date;
+}
+
+@Injectable({
+ providedIn: 'root'
+})
+export class VehiclesService {
+ private endpoint = '/api/vehicles';
+
+ constructor(private http: HttpClient) {}
+
+ getAll(): Observable {
+ return this.http.get(this.endpoint);
+ }
+
+ getById(id: string): Observable {
+ return this.http.get(`${this.endpoint}/${id}`);
+ }
+
+ create(vehicle: Partial): Observable {
+ return this.http.post(this.endpoint, vehicle);
+ }
+
+ update(id: string, vehicle: Partial): Observable {
+ return this.http.patch(`${this.endpoint}/${id}`, vehicle);
+ }
+
+ delete(id: string): Observable {
+ return this.http.delete(`${this.endpoint}/${id}`);
+ }
+
+ // Métodos adicionales específicos de vehículos
+ getByDealer(dealerId: string): Observable {
+ return this.http.get(`${this.endpoint}/dealer/${dealerId}`);
+ }
+
+ generateQR(id: string): Observable<{qrCode: string}> {
+ return this.http.post<{qrCode: string}>(`${this.endpoint}/${id}/generate-qr`, {});
+ }
+
+ updateStatus(id: string, status: string): Observable {
+ return this.http.patch(`${this.endpoint}/${id}/status`, { status });
+ }
+}
diff --git a/apiferia/src/app/core/services/auth.service.ts b/apiferia/src/app/core/services/auth.service.ts
new file mode 100644
index 00000000..d9d567e7
--- /dev/null
+++ b/apiferia/src/app/core/services/auth.service.ts
@@ -0,0 +1,61 @@
+import { Injectable, inject } from '@angular/core'
+import { HttpClient } from '@angular/common/http'
+import { map } from 'rxjs/operators'
+import { CookieService } from 'ngx-cookie-service'
+import { User } from '@/app/store/authentication/auth.model'
+
+@Injectable({ providedIn: 'root' })
+export class AuthenticationService {
+ user: User | null = null
+ public readonly authSessionKey = '_REBACK_AUTH_SESSION_KEY_'
+ private cookieService = inject(CookieService)
+
+ constructor(private http: HttpClient) {
+ // Recuperar usuario si existe
+ const savedUser = localStorage.getItem('currentUser');
+ if (savedUser) {
+ this.user = JSON.parse(savedUser);
+ }
+ }
+
+ login(email: string, password: string) {
+ return this.http.post(`/api/login`, { email, password }).pipe(
+ map((user) => {
+ if (user && user.token) {
+ this.user = user
+ this.saveSession(user.token)
+ }
+ return user
+ })
+ )
+ }
+
+ logout(): void {
+ this.removeSession()
+ localStorage.removeItem('access_token')
+ localStorage.removeItem('currentUser')
+ this.user = null
+ }
+
+ get session(): string {
+ return this.cookieService.get(this.authSessionKey) || localStorage.getItem('access_token') || ''
+ }
+
+ saveSession(token: string): void {
+ this.cookieService.set(this.authSessionKey, token)
+ localStorage.setItem('access_token', token)
+ }
+
+ removeSession(): void {
+ this.cookieService.delete(this.authSessionKey)
+ }
+
+ getCurrentUser(): User | null {
+ return this.user || JSON.parse(localStorage.getItem('currentUser') || '{}')
+ }
+
+ hasRole(roles: string[]): boolean {
+ const user = this.getCurrentUser();
+ return user && user.role ? roles.includes(user.role) : false;
+ }
+}
diff --git a/apiferia/src/app/core/services/crud.service.ts b/apiferia/src/app/core/services/crud.service.ts
new file mode 100644
index 00000000..bfce96bb
--- /dev/null
+++ b/apiferia/src/app/core/services/crud.service.ts
@@ -0,0 +1,35 @@
+import { Injectable } from '@angular/core'
+import { Observable, of } from 'rxjs'
+
+import { defaultEvents } from '@/app/store/calendar/data'
+import type { EventInput } from '@fullcalendar/core'
+
+@Injectable({ providedIn: 'root' })
+export class CrudService {
+ constructor() {}
+
+ /***
+ * Get
+ */
+ fetchCalendarEvents(): Observable {
+ return of(defaultEvents)
+ }
+
+ addCalendarEvents(newData: EventInput): Observable {
+ let newEvents = [...defaultEvents, newData] // Create a new array by spreading defaultEvents and adding newData
+ return of(newEvents)
+ }
+
+ updateCalendarEvents(updatedData: EventInput): Observable {
+ const index = defaultEvents.findIndex((item) => item.id === updatedData.id)
+ let updatedEvents = defaultEvents.slice()
+ if (index !== -1) {
+ updatedEvents[index] = updatedData
+ }
+ return of(updatedEvents)
+ }
+
+ deleteCalendarEvents(id: string): Observable {
+ return of(defaultEvents.filter((item) => item.id !== id))
+ }
+}
diff --git a/apiferia/src/app/core/services/pagination.services.ts b/apiferia/src/app/core/services/pagination.services.ts
new file mode 100644
index 00000000..747c3a60
--- /dev/null
+++ b/apiferia/src/app/core/services/pagination.services.ts
@@ -0,0 +1,35 @@
+import { Injectable } from '@angular/core'
+
+@Injectable({
+ providedIn: 'root',
+})
+export class PaginationService {
+ page = 1
+ startIndex: number = 0
+ endIndex: number = 0
+
+ constructor() {}
+
+ refreshData(displayList: any[], data: any[], pageSize: number) {
+ this.startIndex = (this.page - 1) * pageSize + 1
+ this.endIndex = (this.page - 1) * pageSize + pageSize
+
+ displayList = data
+ .map((item: any, i: number) => ({ id: i + 1, ...item }))
+ .slice(this.startIndex - 1, this.endIndex)
+ return displayList
+ }
+
+ searchTerm(displayList: any[], data: any[], searchQuery: string) {
+ if (searchQuery) {
+ displayList = data.filter((item) =>
+ Object.values(item).some((value: any) =>
+ value.toString().toLowerCase().includes(searchQuery.toLowerCase())
+ )
+ )
+ } else {
+ displayList = data
+ }
+ return displayList
+ }
+}
diff --git a/apiferia/src/app/core/services/table.service.ts b/apiferia/src/app/core/services/table.service.ts
new file mode 100644
index 00000000..98e2e48f
--- /dev/null
+++ b/apiferia/src/app/core/services/table.service.ts
@@ -0,0 +1,182 @@
+import type { SortDirection } from '@/app/directive/sortable.directive'
+import { DecimalPipe } from '@angular/common'
+import { inject, Injectable, PipeTransform } from '@angular/core'
+import { BehaviorSubject, Observable, of, Subject } from 'rxjs'
+import { debounceTime, delay, switchMap, tap } from 'rxjs/operators'
+
+interface SearchResult {
+ items: T[]
+ total: number
+}
+
+interface State {
+ page: number
+ startIndex: number
+ endIndex: number
+ pageSize: number
+ searchTerm: string
+ sortColumn: keyof T | ''
+ sortDirection: SortDirection
+}
+
+function matches(items: any, term: string, searchFields: (keyof T)[]) {
+ if (!term) return true
+ term = term.toLowerCase()
+
+ for (const field of searchFields) {
+ const value = (items[field] as unknown as string)?.toString().toLowerCase()
+ if (value?.includes(term)) {
+ return true
+ }
+ }
+ return false
+}
+
+function compare(v1: T, v2: T): number {
+ return v1 < v2 ? -1 : v1 > v2 ? 1 : 0
+}
+
+@Injectable({
+ providedIn: 'root',
+})
+export class TableService {
+ private _loading$ = new BehaviorSubject(true)
+ private _search$ = new Subject()
+ private _items$ = new BehaviorSubject([])
+ private _total$ = new BehaviorSubject(0)
+
+ items: T[] = []
+ private _state: State = {
+ page: 1,
+ pageSize: 10,
+ searchTerm: '',
+ startIndex: 1,
+ endIndex: 10,
+ sortColumn: '',
+ sortDirection: '',
+ }
+
+ public pipe = inject(DecimalPipe)
+ constructor() {
+ this._search$
+ .pipe(
+ tap(() => this._loading$.next(true)),
+ debounceTime(200),
+ switchMap(() => this._search()),
+ delay(0),
+ tap(() => this._loading$.next(false))
+ )
+ .subscribe((result) => {
+ this._items$.next(result.items)
+ this._total$.next(result.total)
+ })
+
+ this._search$.next()
+ }
+
+ get items$(): Observable {
+ return this._items$.asObservable()
+ }
+
+ get total$(): Observable {
+ return this._total$.asObservable()
+ }
+
+ get loading$(): Observable {
+ return this._loading$.asObservable()
+ }
+
+ get page(): number {
+ return this._state.page
+ }
+
+ get startIndex(): number {
+ return this._state.startIndex
+ }
+
+ get endIndex(): number {
+ return this._state.endIndex
+ }
+
+ get pageSize(): number {
+ return this._state.pageSize
+ }
+
+ get searchTerm(): string {
+ return this._state.searchTerm
+ }
+
+ get sortColumn(): keyof T | '' {
+ return this._state.sortColumn
+ }
+
+ get sortDirection(): SortDirection {
+ return this._state.sortDirection
+ }
+
+ set page(page: number) {
+ this._set({ page })
+ }
+
+ set startIndex(startIndex: number) {
+ this._set({ startIndex })
+ }
+ set endIndex(endIndex: number) {
+ this._set({ endIndex })
+ }
+
+ set pageSize(pageSize: number) {
+ this._set({ pageSize })
+ }
+
+ set searchTerm(searchTerm: string) {
+ this._set({ searchTerm })
+ }
+
+ set sortColumn(sortColumn: keyof T | '') {
+ this._set({ sortColumn })
+ }
+
+ set sortDirection(sortDirection: SortDirection) {
+ this._set({ sortDirection })
+ }
+
+ setItems(items: T[], pageSize: number): void {
+ this.items = items
+ this._set({ pageSize })
+ this._set({ endIndex: pageSize })
+ }
+
+ private _set(patch: Partial>): void {
+ Object.assign(this._state, patch)
+ this._search$.next()
+ }
+
+ private _search(): Observable> {
+ const { pageSize, page, searchTerm, sortColumn, sortDirection } =
+ this._state
+ const searchableFields = Object.keys(this.items[0]) as (keyof T)[]
+
+ // filter
+ let filteredItems = this.items.filter((item) =>
+ matches(item, searchTerm, searchableFields)
+ )
+
+ // Sort
+ if (sortColumn) {
+ filteredItems = [...filteredItems].sort((a, b) => {
+ const res = compare(a[sortColumn], b[sortColumn])
+ return sortDirection === 'asc' ? res : -res
+ })
+ }
+
+ const total = filteredItems.length
+
+ // Paginate the items
+ this.startIndex = (page - 1) * pageSize
+ this.endIndex = this.startIndex + pageSize
+ const paginatedItems = filteredItems.slice(this.startIndex, this.endIndex)
+ this._loading$.next(false)
+ return of({ items: paginatedItems, total })
+ }
+}
diff --git a/apiferia/src/app/core/services/title.service.ts b/apiferia/src/app/core/services/title.service.ts
new file mode 100644
index 00000000..36e2d786
--- /dev/null
+++ b/apiferia/src/app/core/services/title.service.ts
@@ -0,0 +1,38 @@
+// title.service.ts
+import { Injectable } from '@angular/core'
+import { Title } from '@angular/platform-browser'
+import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'
+import { filter } from 'rxjs/operators'
+
+@Injectable({
+ providedIn: 'root',
+})
+export class TitleService {
+ constructor(
+ private titleService: Title,
+ private router: Router,
+ private activatedRoute: ActivatedRoute
+ ) {}
+
+ init(): void {
+ this.router.events
+ .pipe(filter((event) => event instanceof NavigationEnd))
+ .subscribe(() => {
+ this.updateTitle()
+ })
+ }
+
+ private updateTitle(): void {
+ let route = this.activatedRoute
+ while (route.firstChild) {
+ route = route.firstChild
+ }
+
+ if (route.snapshot.data['title']) {
+ this.titleService.setTitle(
+ route.snapshot.data['title'] +
+ ' | Reback - Responsive Angular Admin Dashboard Template'
+ )
+ }
+ }
+}
diff --git a/apiferia/src/app/directive/flatpickr.directive.ts b/apiferia/src/app/directive/flatpickr.directive.ts
new file mode 100644
index 00000000..36c73a78
--- /dev/null
+++ b/apiferia/src/app/directive/flatpickr.directive.ts
@@ -0,0 +1,21 @@
+import { Directive, ElementRef, Input, OnInit } from '@angular/core'
+import flatpickr from 'flatpickr'
+import { Options } from 'flatpickr/dist/types/options'
+
+@Directive({
+ selector: '[mwlFlatpickr]',
+ standalone: true,
+})
+export class FlatpickrDirective implements OnInit {
+ @Input() flatpickrOptions: Options = {}
+
+ constructor(private el: ElementRef) {}
+
+ ngOnInit() {
+ this.initFlatpickr()
+ }
+
+ private initFlatpickr() {
+ flatpickr(this.el.nativeElement, this.flatpickrOptions)
+ }
+}
diff --git a/apiferia/src/app/directive/iconify.component.ts b/apiferia/src/app/directive/iconify.component.ts
new file mode 100644
index 00000000..bca55d10
--- /dev/null
+++ b/apiferia/src/app/directive/iconify.component.ts
@@ -0,0 +1,37 @@
+import {
+ Component,
+ CUSTOM_ELEMENTS_SCHEMA,
+ Input,
+ ViewChild,
+ ElementRef,
+ type AfterViewInit,
+} from '@angular/core'
+import { getIcon, loadIcon, buildIcon } from 'iconify-icon'
+import { getIconData, iconToSVG, iconToHTML, replaceIDs } from '@iconify/utils'
+
+@Component({
+ selector: 'ng-iconify',
+ standalone: true,
+ imports: [],
+ template: ` `,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+ styles: `
+ :host(ng-iconify) {
+ display: contents;
+ }
+ `,
+})
+export class IconifyComponent implements AfterViewInit {
+ @Input() icon: string = ''
+ @ViewChild('iconTemplate') iconTemplate!: ElementRef
+
+ svg = ''
+
+ ngAfterViewInit(): void {
+ const builtIcon = buildIcon(getIcon(this.icon))
+ this.svg = iconToHTML(builtIcon.body, builtIcon.attributes)
+ this.iconTemplate.nativeElement.innerHTML = this.svg
+ }
+
+ ngOnInit(): void {}
+}
diff --git a/apiferia/src/app/directive/select-form-input.directive.ts b/apiferia/src/app/directive/select-form-input.directive.ts
new file mode 100644
index 00000000..ca927588
--- /dev/null
+++ b/apiferia/src/app/directive/select-form-input.directive.ts
@@ -0,0 +1,33 @@
+import { Directive, ElementRef, Input, type OnInit } from '@angular/core'
+import Choices, { Options as ChoiceOption } from 'choices.js'
+
+export type SelectOptions = Partial
+
+@Directive({
+ selector: '[selectFormInput]',
+ standalone: true,
+})
+export class SelectFormInputDirective implements OnInit {
+ @Input() className?: string
+ @Input() onChange?: (text: string) => void
+ @Input() options?: SelectOptions
+
+ constructor(private eleRef: ElementRef) {}
+
+ ngOnInit(): void {
+ const choices = new Choices(this.eleRef.nativeElement, {
+ ...this.options,
+ placeholder: true,
+ placeholderValue: 'Type and hit enter',
+ allowHTML: true,
+ shouldSort: false,
+ })
+
+ choices.passedElement.element.addEventListener('change', (e: Event) => {
+ if (!(e.target instanceof HTMLSelectElement)) return
+ if (this.onChange) {
+ this.onChange(e.target.value)
+ }
+ })
+ }
+}
diff --git a/apiferia/src/app/directive/sortable.directive.ts b/apiferia/src/app/directive/sortable.directive.ts
new file mode 100644
index 00000000..7ac041dc
--- /dev/null
+++ b/apiferia/src/app/directive/sortable.directive.ts
@@ -0,0 +1,33 @@
+import { Directive, EventEmitter, Input, Output } from '@angular/core'
+
+export type SortDirection = 'asc' | 'desc' | ''
+const rotate: { [key: string]: SortDirection } = {
+ asc: 'desc',
+ desc: '',
+ '': 'asc',
+}
+
+export interface SortEvent {
+ column: keyof T | ''
+ direction: SortDirection
+}
+
+@Directive({
+ selector: 'th[sortable]',
+ standalone: true,
+ host: {
+ '[class.asc]': 'direction === "asc"',
+ '[class.desc]': 'direction === "desc"',
+ '(click)': 'rotate()',
+ },
+})
+export class NgbdSortableHeader {
+ @Input() sortable: keyof T | '' = ''
+ @Input() direction: SortDirection = ''
+ @Output() sort = new EventEmitter>()
+
+ rotate() {
+ this.direction = rotate[this.direction]
+ this.sort.emit({ column: this.sortable, direction: this.direction })
+ }
+}
diff --git a/apiferia/src/app/helpers/countDown.ts b/apiferia/src/app/helpers/countDown.ts
new file mode 100644
index 00000000..b9a7e580
--- /dev/null
+++ b/apiferia/src/app/helpers/countDown.ts
@@ -0,0 +1,18 @@
+const eventDate = new Date('Jan 17, 2026 12:00:01')
+
+const calculateTimeToEvent = () => {
+ const currentDate = new Date()
+
+ const timeRemaining = eventDate.getTime() - currentDate.getTime()
+
+ const days = Math.floor(timeRemaining / (1000 * 60 * 60 * 24))
+ const hours = Math.floor(
+ (timeRemaining % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)
+ )
+ const minutes = Math.floor((timeRemaining % (1000 * 60 * 60)) / (1000 * 60))
+ const seconds = Math.floor((timeRemaining % (1000 * 60)) / 1000)
+
+ return { days, hours, minutes, seconds }
+}
+
+export default calculateTimeToEvent
diff --git a/apiferia/src/app/helpers/fake-backend.ts b/apiferia/src/app/helpers/fake-backend.ts
new file mode 100644
index 00000000..4fb7a102
--- /dev/null
+++ b/apiferia/src/app/helpers/fake-backend.ts
@@ -0,0 +1,138 @@
+import { User } from "@/app/store/authentication/auth.model"
+import { Injectable } from '@angular/core'
+import {
+ HttpRequest,
+ HttpResponse,
+ HttpHandler,
+ HttpEvent,
+ HttpInterceptor,
+ HTTP_INTERCEPTORS,
+ HttpClient,
+ HttpHeaders,
+} from '@angular/common/http'
+import { Observable, throwError } from 'rxjs'
+import { catchError, map } from 'rxjs/operators'
+import { environment } from '../../environments/environment'
+
+
+@Injectable()
+export class FakeBackendInterceptor implements HttpInterceptor {
+ private apiUrl = environment.apiUrl;
+
+ constructor(private http: HttpClient) {}
+
+ intercept(
+ request: HttpRequest,
+ next: HttpHandler
+ ): Observable> {
+
+ // Solo interceptar llamadas a /api
+ if (!request.url.includes('/api/')) {
+ return next.handle(request);
+ }
+
+ // Obtener el token del localStorage
+ const token = localStorage.getItem('access_token');
+
+ // Construir la URL real
+ const apiEndpoint = request.url.replace('/api/', '/');
+ const fullUrl = `${this.apiUrl}${apiEndpoint}`;
+
+ // Clonar la petición con la nueva URL y headers
+ let headers = new HttpHeaders({
+ 'Content-Type': 'application/json'
+ });
+
+ if (token && !request.url.includes('/auth/')) {
+ headers = headers.set('Authorization', `Bearer ${token}`);
+ }
+
+ const apiReq = request.clone({
+ url: fullUrl,
+ headers: headers
+ });
+
+ // Manejar login especialmente
+ if (request.url.endsWith('/api/login') && request.method === 'POST') {
+ return this.http.post(`${this.apiUrl}/auth/login`, request.body).pipe(
+ map(response => {
+ if (response && response.access_token) {
+ // Guardar token y usuario
+ localStorage.setItem('access_token', response.access_token);
+ localStorage.setItem('currentUser', JSON.stringify(response.user));
+
+ // Retornar en el formato esperado por el template
+ return new HttpResponse({
+ status: 200,
+ body: {
+ ...response.user,
+ token: response.access_token,
+ name: response.user.firstName + ' ' + response.user.lastName
+ }
+ });
+ }
+ return new HttpResponse({ status: 200, body: response });
+ }),
+ catchError(error => {
+ console.error('Login error:', error);
+ return throwError({
+ status: error.status || 400,
+ error: { message: error.error?.message || 'Error al iniciar sesión' }
+ });
+ })
+ );
+ }
+
+ // Manejar registro
+ if (request.url.endsWith('/api/signup') && request.method === 'POST') {
+ const [firstName, lastName] = request.body?.name?.split(' ') || ['', ''];
+ const registerData = {
+ ...request.body,
+ firstName,
+ lastName,
+ role: 'cliente' // Rol por defecto
+ };
+
+ return this.http.post(`${this.apiUrl}/auth/register`, registerData).pipe(
+ map(response => {
+ return new HttpResponse({
+ status: 200,
+ body: response
+ });
+ }),
+ catchError(error => {
+ return throwError({
+ status: error.status || 400,
+ error: { message: error.error?.message || 'Error al registrar usuario' }
+ });
+ })
+ );
+ }
+
+ // Para todas las demás peticiones, enviarlas a la API real
+ return this.http.request(apiReq.method, apiReq.url, {
+ body: apiReq.body,
+ headers: apiReq.headers,
+ observe: 'response',
+ responseType: 'json'
+ }).pipe(
+ map(response => {
+ return response;
+ }),
+ catchError(error => {
+ // Si es error 401, limpiar sesión
+ if (error.status === 401) {
+ localStorage.removeItem('access_token');
+ localStorage.removeItem('currentUser');
+ }
+ return throwError(error);
+ })
+ );
+ }
+}
+
+export let FakeBackendProvider = {
+ provide: HTTP_INTERCEPTORS,
+ useClass: FakeBackendInterceptor,
+ multi: true,
+}
diff --git a/apiferia/src/app/helpers/utils.ts b/apiferia/src/app/helpers/utils.ts
new file mode 100644
index 00000000..1e8a0be9
--- /dev/null
+++ b/apiferia/src/app/helpers/utils.ts
@@ -0,0 +1,35 @@
+import type { MenuItem } from '../common/menu-meta'
+
+export const findAllParent = (menuItems: MenuItem[], menuItem: any): any => {
+ let parents = []
+ const parent = findMenuItem(menuItems, menuItem['parentKey'])
+
+ if (parent) {
+ parents.push(parent['key'])
+ if (parent['parentKey'])
+ parents = [...parents, ...findAllParent(menuItems, parent)]
+ }
+ return parents
+}
+
+export const findMenuItem = (
+ menuItems: MenuItem[],
+ menuItemKey: string
+): any => {
+ if (menuItems && menuItemKey) {
+ for (var i = 0; i < menuItems.length; i++) {
+ if (menuItems[i].key === menuItemKey) {
+ return menuItems[i]
+ }
+ var found = findMenuItem(menuItems[i].subMenu, menuItemKey)
+ if (found) return found
+ }
+ }
+ return null
+}
+
+export function addOrSubtractDaysFromDate(days: number): Date {
+ const result = new Date()
+ result.setDate(result.getDate() + days)
+ return result
+}
diff --git a/apiferia/src/app/layouts/auth-layout/auth-layout.component.spec.ts b/apiferia/src/app/layouts/auth-layout/auth-layout.component.spec.ts
new file mode 100644
index 00000000..eefe4481
--- /dev/null
+++ b/apiferia/src/app/layouts/auth-layout/auth-layout.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { AuthLayoutComponent } from './auth-layout.component'
+
+describe('AuthLayoutComponent', () => {
+ let component: AuthLayoutComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [AuthLayoutComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(AuthLayoutComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/layouts/auth-layout/auth-layout.component.ts b/apiferia/src/app/layouts/auth-layout/auth-layout.component.ts
new file mode 100644
index 00000000..f40b9bf3
--- /dev/null
+++ b/apiferia/src/app/layouts/auth-layout/auth-layout.component.ts
@@ -0,0 +1,31 @@
+import {
+ Component,
+ inject,
+ Renderer2,
+ type OnDestroy,
+ type OnInit,
+} from '@angular/core'
+import { RouterModule } from '@angular/router'
+
+@Component({
+ selector: 'app-auth-layout',
+ standalone: true,
+ imports: [RouterModule],
+ template: ` `,
+ styles: ``,
+})
+export class AuthLayoutComponent implements OnInit, OnDestroy {
+ private renderer = inject(Renderer2)
+
+ ngOnInit(): void {
+ this.renderer.addClass(document.body, 'authentication-bg')
+ }
+
+ ngOnDestroy(): void {
+ this.renderer.removeClass(document.body, 'authentication-bg')
+ }
+}
diff --git a/apiferia/src/app/layouts/footer/footer.component.html b/apiferia/src/app/layouts/footer/footer.component.html
new file mode 100644
index 00000000..2e493342
--- /dev/null
+++ b/apiferia/src/app/layouts/footer/footer.component.html
@@ -0,0 +1,17 @@
+
diff --git a/apiferia/src/app/layouts/footer/footer.component.spec.ts b/apiferia/src/app/layouts/footer/footer.component.spec.ts
new file mode 100644
index 00000000..ab3cb858
--- /dev/null
+++ b/apiferia/src/app/layouts/footer/footer.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { FooterComponent } from './footer.component'
+
+describe('FooterComponent', () => {
+ let component: FooterComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [FooterComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(FooterComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/layouts/footer/footer.component.ts b/apiferia/src/app/layouts/footer/footer.component.ts
new file mode 100644
index 00000000..44bf5ab1
--- /dev/null
+++ b/apiferia/src/app/layouts/footer/footer.component.ts
@@ -0,0 +1,15 @@
+import { credits, currentYear } from '@/app/common/constants'
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
+
+@Component({
+ selector: 'app-footer',
+ standalone: true,
+ imports: [],
+ templateUrl: './footer.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class FooterComponent {
+ year = currentYear
+ credits = credits
+}
diff --git a/apiferia/src/app/layouts/private-layout/private-layout.component.spec.ts b/apiferia/src/app/layouts/private-layout/private-layout.component.spec.ts
new file mode 100644
index 00000000..16f40ce7
--- /dev/null
+++ b/apiferia/src/app/layouts/private-layout/private-layout.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { PrivateLayoutComponent } from './private-layout.component'
+
+describe('PrivateLayoutComponent', () => {
+ let component: PrivateLayoutComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [PrivateLayoutComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(PrivateLayoutComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/layouts/private-layout/private-layout.component.ts b/apiferia/src/app/layouts/private-layout/private-layout.component.ts
new file mode 100644
index 00000000..19469c5c
--- /dev/null
+++ b/apiferia/src/app/layouts/private-layout/private-layout.component.ts
@@ -0,0 +1,30 @@
+import { Component, inject } from '@angular/core'
+import { Store } from '@ngrx/store'
+import { VerticalComponent } from '../vertical/vertical.component'
+
+@Component({
+ selector: 'app-private-layout',
+ standalone: true,
+ imports: [VerticalComponent],
+ template: ` `,
+ styles: ``,
+})
+export class PrivateLayoutComponent {
+ layoutType: any
+
+ private store = inject(Store)
+
+ ngOnInit(): void {
+ this.store.select('layout').subscribe((data) => {
+ this.layoutType = data.LAYOUT
+ document.documentElement.setAttribute('data-bs-theme', data.LAYOUT_THEME)
+
+ document.documentElement.setAttribute('data-menu-color', data.MENU_COLOR)
+ document.documentElement.setAttribute(
+ 'data-topbar-color',
+ data.TOPBAR_COLOR
+ )
+ document.documentElement.setAttribute('data-menu-size', data.MENU_SIZE)
+ })
+ }
+}
diff --git a/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.html b/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.html
new file mode 100644
index 00000000..04758b14
--- /dev/null
+++ b/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.html
@@ -0,0 +1,217 @@
+
+
+
+
+
+
+
+
+
Color Scheme
+
+
+
+
+ Light
+
+
+
+
+ Dark
+
+
+
+
+
+
Topbar Color
+
+
+
+ Light
+
+
+
+
+
+ Dark
+
+
+
+
+
+
Menu Color
+
+
+
+
+ Light
+
+
+
+
+
+
+ Dark
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.spec.ts b/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.spec.ts
new file mode 100644
index 00000000..ffe63b11
--- /dev/null
+++ b/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { RightSidebarComponent } from './right-sidebar.component'
+
+describe('RightSidebarComponent', () => {
+ let component: RightSidebarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [RightSidebarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(RightSidebarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.ts b/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.ts
new file mode 100644
index 00000000..a24f304e
--- /dev/null
+++ b/apiferia/src/app/layouts/right-sidebar/right-sidebar.component.ts
@@ -0,0 +1,82 @@
+import { Component, inject } from '@angular/core'
+import { NgbActiveOffcanvas } from '@ng-bootstrap/ng-bootstrap'
+import { Store } from '@ngrx/store'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import {
+ changemenucolor,
+ changesidebarsize,
+ changetheme,
+ changetopbarcolor,
+ resetState,
+} from '../../store/layout/layout-action'
+import {
+ getLayoutColor,
+ getMenucolor,
+ getSidebarsize,
+ getTopbarcolor,
+} from '../../store/layout/layout-selector'
+
+@Component({
+ selector: 'app-right-sidebar',
+ standalone: true,
+ imports: [SimplebarAngularModule],
+ templateUrl: './right-sidebar.component.html',
+ styles: ``,
+})
+export class RightSidebarComponent {
+ public isRightSidebarOpen: boolean = false
+
+ offcanvas = inject(NgbActiveOffcanvas)
+ store = inject(Store)
+
+ color: any
+ topbar: any
+ menucolor: any
+ sidebarsize: any
+
+ ngOnInit(): void {
+ this.store.select('layout').subscribe((data: any) => {
+ this.color = data.LAYOUT_THEME
+ this.topbar = data.TOPBAR_COLOR
+ this.menucolor = data.MENU_COLOR
+ this.sidebarsize = data.MENU_SIZE
+ })
+ }
+
+ // Change Layout Color
+ changeLayoutColor(color: any) {
+ this.store.dispatch(changetheme({ color }))
+ this.store.select(getLayoutColor).subscribe((color) => {
+ document.documentElement.setAttribute('data-bs-theme', color)
+ })
+ }
+
+ // Change Topbar Color
+ changeTopbar(topbar: any) {
+ this.store.dispatch(changetopbarcolor({ topbar }))
+ this.store.select(getTopbarcolor).subscribe((topbar) => {
+ document.documentElement.setAttribute('data-topbar-color', topbar)
+ })
+ }
+
+ // Change Menu Color
+ changeMenu(menu: any) {
+ this.store.dispatch(changemenucolor({ menu }))
+ this.store.select(getMenucolor).subscribe((menucolor) => {
+ document.documentElement.setAttribute('data-menu-color', menucolor)
+ })
+ }
+
+ // Change Sidebar Size
+ changeSize(size: any) {
+ this.store.dispatch(changesidebarsize({ size }))
+ this.store.select(getSidebarsize).subscribe((size) => {
+ document.documentElement.setAttribute('data-menu-size', size)
+ })
+ }
+
+ // Reset Option
+ reset() {
+ this.store.dispatch(resetState())
+ }
+}
diff --git a/apiferia/src/app/layouts/sidebar/sidebar.component.html b/apiferia/src/app/layouts/sidebar/sidebar.component.html
new file mode 100644
index 00000000..e719258d
--- /dev/null
+++ b/apiferia/src/app/layouts/sidebar/sidebar.component.html
@@ -0,0 +1,159 @@
+
+
+
+
+
+ @if (menu.icon) {
+
+
+
+ }
+ {{ menu.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @if (menu.icon) {
+
+
+
+ {{ menu.label }}
+ } @else {
+ {{ menu.label }}
+ }
+ @if (menu.badge) {
+
+ }
+
+
diff --git a/apiferia/src/app/layouts/sidebar/sidebar.component.spec.ts b/apiferia/src/app/layouts/sidebar/sidebar.component.spec.ts
new file mode 100644
index 00000000..f3962387
--- /dev/null
+++ b/apiferia/src/app/layouts/sidebar/sidebar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SidebarComponent } from './sidebar.component'
+
+describe('SidebarComponent', () => {
+ let component: SidebarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SidebarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SidebarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/layouts/sidebar/sidebar.component.ts b/apiferia/src/app/layouts/sidebar/sidebar.component.ts
new file mode 100644
index 00000000..f05ec676
--- /dev/null
+++ b/apiferia/src/app/layouts/sidebar/sidebar.component.ts
@@ -0,0 +1,201 @@
+import { CUSTOM_ELEMENTS_SCHEMA, Component, inject } from '@angular/core'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { NavigationEnd, Router, RouterModule } from '@angular/router'
+import {
+ NgbCollapse,
+ NgbCollapseModule,
+ NgbTooltipModule,
+} from '@ng-bootstrap/ng-bootstrap'
+import { CommonModule } from '@angular/common'
+import { findAllParent, findMenuItem } from '../../helpers/utils'
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { MENU, type MenuItem } from '@/app/common/menu-meta'
+import { changesidebarsize } from '@/app/store/layout/layout-action'
+import { Store } from '@ngrx/store'
+import { getSidebarsize } from '@/app/store/layout/layout-selector'
+import { basePath } from '@/app/common/constants'
+
+@Component({
+ selector: 'app-sidebar',
+ standalone: true,
+ imports: [
+ SimplebarAngularModule,
+ RouterModule,
+ NgbCollapseModule,
+ CommonModule,
+ NgbTooltipModule,
+ LogoBoxComponent,
+ ],
+ templateUrl: './sidebar.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class SidebarComponent {
+ menuItems: MenuItem[] = []
+ activeMenuItems: string[] = []
+
+ store = inject(Store)
+ router = inject(Router)
+ trimmedURL = this.router.url?.replaceAll(
+ basePath !== '' ? basePath + '/' : '',
+ '/'
+ )
+
+ constructor() {
+ this.router.events.forEach((event) => {
+ if (event instanceof NavigationEnd) {
+ this.trimmedURL = this.router.url?.replaceAll(
+ basePath !== '' ? basePath + '/' : '',
+ '/'
+ )
+ this._activateMenu()
+ setTimeout(() => {
+ this.scrollToActive()
+ }, 200)
+ }
+ })
+ }
+
+ ngOnInit(): void {
+ this.initMenu()
+ }
+
+ initMenu(): void {
+ this.menuItems = MENU
+ }
+
+ ngAfterViewInit() {
+ setTimeout(() => {
+ this._activateMenu()
+ })
+ setTimeout(() => {
+ this.scrollToActive()
+ }, 200)
+ }
+
+ scrollToActive(): void {
+ const activatedItem = document.querySelector('.nav-item li a.active')
+ if (activatedItem) {
+ const simplebarContent = document.querySelector(
+ '.main-nav .simplebar-content-wrapper'
+ )
+ if (simplebarContent) {
+ const activatedItemRect = activatedItem.getBoundingClientRect()
+ const simplebarContentRect = simplebarContent.getBoundingClientRect()
+ const activatedItemOffsetTop =
+ activatedItemRect.top + simplebarContent.scrollTop
+ const centerOffset =
+ activatedItemOffsetTop -
+ simplebarContentRect.top -
+ simplebarContent.clientHeight / 2 +
+ activatedItemRect.height / 2
+ this.scrollTo(simplebarContent, centerOffset, 600)
+ }
+ }
+ }
+
+ easeInOutQuad(t: number, b: number, c: number, d: number): number {
+ t /= d / 2
+ if (t < 1) return (c / 2) * t * t + b
+ t--
+ return (-c / 2) * (t * (t - 2) - 1) + b
+ }
+
+ scrollTo(element: Element, to: number, duration: number): void {
+ const start = element.scrollTop
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+
+ const animateScroll = () => {
+ currentTime += increment
+ const val = this.easeInOutQuad(currentTime, start, change, duration)
+ element.scrollTop = val
+ if (currentTime < duration) {
+ setTimeout(animateScroll, increment)
+ }
+ }
+ animateScroll()
+ }
+
+ _activateMenu(): void {
+ const div = document.querySelector('.navbar-nav')
+
+ let matchingMenuItem = null
+
+ if (div) {
+ let items: any = div.getElementsByClassName('nav-link-ref')
+ for (let i = 0; i < items.length; ++i) {
+ if (
+ this.trimmedURL === items[i].pathname ||
+ (this.trimmedURL.startsWith('/invoice/') &&
+ items[i].pathname === '/invoice/RB6985') ||
+ (this.trimmedURL.startsWith('/ecommerce/product/') &&
+ items[i].pathname === '/ecommerce/product/1')
+ ) {
+ matchingMenuItem = items[i]
+ break
+ }
+ }
+
+ if (matchingMenuItem) {
+ const mid = matchingMenuItem.getAttribute('aria-controls')
+ const activeMt = findMenuItem(this.menuItems, mid)
+
+ if (activeMt) {
+ const matchingObjs = [
+ activeMt['key'],
+ ...findAllParent(this.menuItems, activeMt),
+ ]
+
+ this.activeMenuItems = matchingObjs
+ this.menuItems.forEach((menu: MenuItem) => {
+ menu.collapsed = !matchingObjs.includes(menu.key!)
+ })
+ }
+ }
+ }
+ }
+
+ /**
+ * Returns true or false if given menu item has child or not
+ * @param item menuItem
+ */
+ hasSubmenu(menu: MenuItem): boolean {
+ return menu.subMenu ? true : false
+ }
+
+ /**
+ * toggles open menu
+ * @param menuItem clicked menuitem
+ * @param collapse collpase instance
+ */
+ toggleMenuItem(menuItem: MenuItem, collapse: NgbCollapse): void {
+ collapse.toggle()
+ let openMenuItems: string[]
+ if (!menuItem.collapsed) {
+ openMenuItems = [
+ menuItem['key'],
+ ...findAllParent(this.menuItems, menuItem),
+ ]
+ this.menuItems.forEach((menu: MenuItem) => {
+ if (!openMenuItems.includes(menu.key!)) {
+ menu.collapsed = true
+ }
+ })
+ }
+ }
+
+ changeSidebarSize() {
+ let size = document.documentElement.getAttribute('data-menu-size')
+ if (size == 'sm-hover') {
+ size = 'sm-hover-active'
+ } else {
+ size = 'sm-hover'
+ }
+ this.store.dispatch(changesidebarsize({ size }))
+ this.store.select(getSidebarsize).subscribe((size) => {
+ document.documentElement.setAttribute('data-menu-size', size)
+ })
+ }
+}
diff --git a/apiferia/src/app/layouts/topbar/data.ts b/apiferia/src/app/layouts/topbar/data.ts
new file mode 100644
index 00000000..2fa859be
--- /dev/null
+++ b/apiferia/src/app/layouts/topbar/data.ts
@@ -0,0 +1,164 @@
+import { addOrSubtractDaysFromDate } from '@/app/helpers/utils'
+
+const bitbucketImg = 'assets/images/brands/bitbucket.svg'
+const dribbleImg = 'assets/images/brands/dribbble.svg'
+const dropboxImg = 'assets/images/brands/dropbox.svg'
+const githubImg = 'assets/images/brands/github.svg'
+const slackImg = 'assets/images/brands/slack.svg'
+const smImg3 = 'assets/images/small/img-3.jpg'
+const smImg4 = 'assets/images/small/img-4.jpg'
+const smImg6 = 'assets/images/small/img-6.jpg'
+const avatar1 = 'assets/images/users/avatar-1.jpg'
+const avatar3 = 'assets/images/users/avatar-3.jpg'
+const avatar5 = 'assets/images/users/avatar-5.jpg'
+const avatar6 = 'assets/images/users/avatar-6.jpg'
+const avatar7 = 'assets/images/users/avatar-7.jpg'
+
+export type BootstrapVariantType =
+ | 'primary'
+ | 'secondary'
+ | 'success'
+ | 'danger'
+ | 'warning'
+ | 'info'
+ | 'dark'
+ | 'light'
+
+export type FileType = Partial & {
+ preview?: string
+}
+
+export type ActivityType = {
+ title: string
+ icon?: string
+ variant?: BootstrapVariantType
+ status?: 'completed' | 'latest'
+ files?: FileType[]
+ time: Date
+ type?: 'task' | 'design' | 'achievement'
+ content?: string
+}
+
+export type AppType = {
+ image: string
+ name: string
+ handle: string
+}
+
+export type NotificationType = {
+ from: string
+ content: string
+ icon?: string
+}
+
+export const appsData: AppType[] = [
+ {
+ image: githubImg,
+ name: 'Github',
+ handle: '@reback',
+ },
+ {
+ image: bitbucketImg,
+ name: 'Bitbucket',
+ handle: '@reback',
+ },
+ {
+ image: dribbleImg,
+ name: 'Dribble',
+ handle: '@username',
+ },
+ {
+ image: dropboxImg,
+ name: 'Dropbox',
+ handle: '@username',
+ },
+ {
+ image: slackImg,
+ name: 'Slack',
+ handle: '@reback',
+ },
+]
+
+export const notificationsData: NotificationType[] = [
+ {
+ from: 'Josephine Thompson',
+ content:
+ 'commented on admin panel "Wow 😍! this admin looks good and awesome design"',
+ icon: avatar1,
+ },
+ {
+ from: 'Donoghue Susan',
+ content: 'Hi, How are you? What about our next meeting',
+ },
+ {
+ from: 'Jacob Gines',
+ content: "Answered to your comment on the cash flow forecast's graph 🔔.",
+ icon: avatar3,
+ },
+ {
+ from: 'Shawn Bunch',
+ content: 'Commented on Admin',
+ icon: avatar5,
+ },
+ {
+ from: 'Vanessa R. Davis',
+ content: 'Delivery processing your order is being shipped',
+ },
+]
+
+export const activityStreamData: ActivityType[] = [
+ {
+ title: 'Report-Fix / Update',
+ variant: 'danger',
+ type: 'task',
+ files: [
+ {
+ name: 'Concept.fig',
+ },
+ {
+ name: 'reback.docs',
+ },
+ ],
+ time: addOrSubtractDaysFromDate(0),
+ },
+ {
+ title: 'Project Status',
+ files: [
+ {
+ name: 'UI/UX Figma Design.fig',
+ },
+ ],
+ variant: 'success',
+ type: 'design',
+ status: 'completed',
+ time: addOrSubtractDaysFromDate(1),
+ },
+ {
+ title: 'Reback Application UI v2.0.0',
+ variant: 'primary',
+ content:
+ 'Get access to over 20+ pages including a dashboard layout, charts, kanban board, calendar, and pre-order E-commerce & Marketing pages.',
+ files: [{ name: 'Backup.zip' }],
+ status: 'latest',
+ time: addOrSubtractDaysFromDate(3),
+ },
+ {
+ title: 'Alex Smith Attached Photos',
+ icon: avatar7,
+ time: addOrSubtractDaysFromDate(4),
+ files: [{ preview: smImg6 }, { preview: smImg3 }, { preview: smImg4 }],
+ },
+ {
+ title: 'Rebecca J. added a new team member',
+ icon: avatar6,
+ time: addOrSubtractDaysFromDate(4),
+ content: 'Added a new member to Front Dashboard',
+ },
+ {
+ title: 'Achievements',
+ variant: 'warning',
+ type: 'achievement',
+ time: addOrSubtractDaysFromDate(5),
+ content: 'Earned a "Best Product Award"',
+ },
+]
diff --git a/apiferia/src/app/layouts/topbar/topbar.component.html b/apiferia/src/app/layouts/topbar/topbar.component.html
new file mode 100644
index 00000000..7e84cb31
--- /dev/null
+++ b/apiferia/src/app/layouts/topbar/topbar.component.html
@@ -0,0 +1,380 @@
+
+
+
+
+
+
+
+
+
+ @for (data of activityList; track $index) {
+
+
+
+ @if (data.icon) {
+
+ } @else if (data.type) {
+
+ } @else {
+ {{ data.title.charAt(0).toUpperCase() }}
+ }
+
+
+
+ {{ data.title }}
+ @if (data.status) {
+ {{ data.status }}
+ }
+
+
+ @if (data.files && data.type) {
+
+ Add {{ data.files.length }} files to
+
+
+ {{ data.type }}
+
+ }
+ @if (data.content) {
+
{{ data.content }}
+ }
+ @if (data.files) {
+
+
+ @for (file of data.files; track $index) {
+ @if (file.preview) {
+
+
+
+
+ } @else {
+
+ }
+ }
+
+
+ }
+
{{ data.time.toDateString() }}
+
+
+
+ }
+
+ View All
+
+
+
diff --git a/apiferia/src/app/layouts/topbar/topbar.component.scss b/apiferia/src/app/layouts/topbar/topbar.component.scss
new file mode 100644
index 00000000..e69de29b
diff --git a/apiferia/src/app/layouts/topbar/topbar.component.spec.ts b/apiferia/src/app/layouts/topbar/topbar.component.spec.ts
new file mode 100644
index 00000000..5293e9e4
--- /dev/null
+++ b/apiferia/src/app/layouts/topbar/topbar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { TopbarComponent } from './topbar.component'
+
+describe('TopbarComponent', () => {
+ let component: TopbarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [TopbarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(TopbarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/layouts/topbar/topbar.component.ts b/apiferia/src/app/layouts/topbar/topbar.component.ts
new file mode 100644
index 00000000..797acf4e
--- /dev/null
+++ b/apiferia/src/app/layouts/topbar/topbar.component.ts
@@ -0,0 +1,116 @@
+import { changetheme } from '@/app/store/layout/layout-action'
+import { CommonModule, DOCUMENT } from '@angular/common'
+import {
+ CUSTOM_ELEMENTS_SCHEMA,
+ Component,
+ EventEmitter,
+ Inject,
+ Output,
+ inject,
+ type TemplateRef,
+} from '@angular/core'
+import {
+ NgbDropdownModule,
+ NgbOffcanvas,
+ NgbOffcanvasModule,
+ NgbTooltipModule,
+} from '@ng-bootstrap/ng-bootstrap'
+import { Store } from '@ngrx/store'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { getLayoutColor } from '../../store/layout/layout-selector'
+import { logout } from '@/app/store/authentication/authentication.actions'
+import { Router, RouterLink } from '@angular/router'
+import { activityStreamData, appsData, notificationsData } from './data'
+
+@Component({
+ selector: 'app-topbar',
+ standalone: true,
+ imports: [
+ NgbDropdownModule,
+ SimplebarAngularModule,
+ NgbOffcanvasModule,
+ RouterLink,
+ CommonModule,
+ NgbTooltipModule,
+ ],
+ templateUrl: './topbar.component.html',
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class TopbarComponent {
+ element: any
+
+ router = inject(Router)
+ store = inject(Store)
+ offcanvasService = inject(NgbOffcanvas)
+
+ notificationList = notificationsData
+ appsList = appsData
+ activityList = activityStreamData
+
+ constructor(@Inject(DOCUMENT) private document: any) {}
+ @Output() settingsButtonClicked = new EventEmitter()
+ @Output() mobileMenuButtonClicked = new EventEmitter()
+
+ ngOnInit(): void {
+ this.element = document.documentElement
+ }
+
+ settingMenu() {
+ this.settingsButtonClicked.emit()
+ }
+
+ /**
+ * Toggle the menu bar when having mobile screen
+ */
+ toggleMobileMenu() {
+ // document.getElementById('topnav-hamburger-icon')?.classList.toggle('open');
+ this.mobileMenuButtonClicked.emit()
+ }
+
+ // Change Theme
+ changeTheme() {
+ const color = document.documentElement.getAttribute('data-bs-theme')
+ console.log(color)
+ if (color == 'light') {
+ this.store.dispatch(changetheme({ color: 'dark' }))
+ } else {
+ this.store.dispatch(changetheme({ color: 'light' }))
+ }
+ this.store.select(getLayoutColor).subscribe((color) => {
+ document.documentElement.setAttribute('data-bs-theme', color)
+ })
+ }
+
+ open(content: TemplateRef) {
+ this.offcanvasService.open(content, {
+ position: 'end',
+ panelClass: 'border-0 width-auto',
+ })
+ }
+
+ logout() {
+ this.store.dispatch(logout())
+ }
+
+ getFileExtensionIcon(file: any) {
+ const dotIndex = file.lastIndexOf('.')
+ const extension = file.slice(dotIndex + 1)
+ if (extension == 'docs') {
+ return 'bxs-file-doc'
+ } else if (extension == 'zip') {
+ return 'bxs-file-archive'
+ } else {
+ return 'bxl-figma '
+ }
+ }
+
+ getActivityIcon(type: string) {
+ if (type == 'task') {
+ return 'iconamoon:folder-check-duotone'
+ } else if (type == 'design') {
+ return 'iconamoon:check-circle-1-duotone'
+ } else {
+ return 'iconamoon:certificate-badge-duotone'
+ }
+ }
+}
diff --git a/apiferia/src/app/layouts/vertical/vertical.component.spec.ts b/apiferia/src/app/layouts/vertical/vertical.component.spec.ts
new file mode 100644
index 00000000..e88b0c6b
--- /dev/null
+++ b/apiferia/src/app/layouts/vertical/vertical.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { VerticalComponent } from './vertical.component'
+
+describe('VerticalComponent', () => {
+ let component: VerticalComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [VerticalComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(VerticalComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/layouts/vertical/vertical.component.ts b/apiferia/src/app/layouts/vertical/vertical.component.ts
new file mode 100644
index 00000000..078b5a52
--- /dev/null
+++ b/apiferia/src/app/layouts/vertical/vertical.component.ts
@@ -0,0 +1,107 @@
+import { Component, HostListener, inject, Renderer2 } from '@angular/core'
+import { SidebarComponent } from '../sidebar/sidebar.component'
+import { TopbarComponent } from '../topbar/topbar.component'
+import { FooterComponent } from '../footer/footer.component'
+import { RouterModule } from '@angular/router'
+import { RightSidebarComponent } from '../right-sidebar/right-sidebar.component'
+import { NgbActiveOffcanvas, NgbOffcanvas } from '@ng-bootstrap/ng-bootstrap'
+import { Store } from '@ngrx/store'
+import { changesidebarsize } from '@store/layout/layout-action'
+import { getSidebarsize } from '@store/layout/layout-selector'
+
+@Component({
+ selector: 'app-vertical',
+ standalone: true,
+ imports: [SidebarComponent, TopbarComponent, FooterComponent, RouterModule],
+ template: `
+
+ `,
+ styles: ``,
+ providers: [NgbActiveOffcanvas],
+})
+export class VerticalComponent {
+ private offcanvasService = inject(NgbOffcanvas)
+ private store = inject(Store)
+ private renderer = inject(Renderer2)
+
+ ngOnInit(): void {
+ this.onResize()
+ }
+
+ @HostListener('window:resize', ['$event'])
+ onResize() {
+ if (document.documentElement.clientWidth <= 1140) {
+ this.store.dispatch(changesidebarsize({ size: 'hidden' }))
+ } else {
+ this.store.dispatch(changesidebarsize({ size: 'default' }))
+ document.documentElement.classList.remove('sidebar-enable')
+ const backdrop = document.querySelector('.offcanvas-backdrop')
+ if (backdrop) this.renderer.removeChild(document.body, backdrop)
+ }
+ this.store.select(getSidebarsize).subscribe((size: string) => {
+ this.renderer.setAttribute(
+ document.documentElement,
+ 'data-sidenav-size',
+ size
+ )
+ })
+ }
+
+ onSettingsButtonClicked() {
+ this.offcanvasService.open(RightSidebarComponent, { position: 'end' })
+ }
+
+ onToggleMobileMenu() {
+ this.store.select(getSidebarsize).subscribe((size: any) => {
+ document.documentElement.setAttribute('data-menu-size', size)
+ })
+
+ const size = document.documentElement.getAttribute('data-menu-size')
+
+ document.documentElement.classList.toggle('sidebar-enable')
+ if (size != 'hidden') {
+ if (document.documentElement.classList.contains('sidebar-enable')) {
+ this.store.dispatch(changesidebarsize({ size: 'condensed' }))
+ } else {
+ this.store.dispatch(changesidebarsize({ size: 'default' }))
+ }
+ } else {
+ this.showBackdrop()
+ }
+ }
+
+ showBackdrop() {
+ const backdrop = this.renderer.createElement('div')
+ this.renderer.addClass(backdrop, 'offcanvas-backdrop')
+ this.renderer.addClass(backdrop, 'fade')
+ this.renderer.addClass(backdrop, 'show')
+ this.renderer.appendChild(document.body, backdrop)
+ this.renderer.setStyle(document.body, 'overflow', 'hidden')
+
+ if (window.innerWidth > 1040) {
+ this.renderer.setStyle(document.body, 'paddingRight', '15px')
+ }
+
+ this.renderer.listen(backdrop, 'click', () => {
+ document.documentElement.classList.remove('sidebar-enable')
+ this.renderer.removeChild(document.body, backdrop)
+ this.renderer.setStyle(document.body, 'overflow', null)
+ this.renderer.setStyle(document.body, 'paddingRight', null)
+ })
+ }
+}
diff --git a/apiferia/src/app/store/authentication/auth.model.ts b/apiferia/src/app/store/authentication/auth.model.ts
new file mode 100644
index 00000000..1b08fb6e
--- /dev/null
+++ b/apiferia/src/app/store/authentication/auth.model.ts
@@ -0,0 +1,17 @@
+export class User {
+ id?: string
+ email?: string
+ role?: 'admin' | 'dealer' | 'cliente' | 'aseguradora' | 'financiera' | 'tasador' | 'gps'
+ firstName?: string
+ lastName?: string
+ phone?: string
+ isActive?: boolean
+ createdAt?: Date
+ updatedAt?: Date
+ fullName?: string
+ token?: string
+ // Compatibilidad con el template original
+ username?: string
+ password?: string
+ name?: string
+}
diff --git a/apiferia/src/app/store/authentication/authentication.actions.ts b/apiferia/src/app/store/authentication/authentication.actions.ts
new file mode 100644
index 00000000..cb0b42c9
--- /dev/null
+++ b/apiferia/src/app/store/authentication/authentication.actions.ts
@@ -0,0 +1,21 @@
+import { createAction, props } from '@ngrx/store'
+import type { User } from './auth.model'
+
+// login action
+export const login = createAction(
+ '[Authentication] Login',
+ props<{ email: string; password: string }>()
+)
+export const loginSuccess = createAction(
+ '[Authentication] Login Success',
+ props<{ user: User }>()
+)
+export const loginFailure = createAction(
+ '[Authentication] Login Failure',
+ props<{ error: string }>()
+)
+
+// logout action
+export const logout = createAction('[Authentication] Logout')
+
+export const logoutSuccess = createAction('[Auth] Logout Success')
diff --git a/apiferia/src/app/store/authentication/authentication.effects.ts b/apiferia/src/app/store/authentication/authentication.effects.ts
new file mode 100644
index 00000000..7925bd63
--- /dev/null
+++ b/apiferia/src/app/store/authentication/authentication.effects.ts
@@ -0,0 +1,53 @@
+import { Inject, Injectable } from '@angular/core'
+import { ActivatedRoute, Router } from '@angular/router'
+import { Actions, createEffect, ofType } from '@ngrx/effects'
+import { of } from 'rxjs'
+import { catchError, exhaustMap, map } from 'rxjs/operators'
+import {
+ login,
+ loginFailure,
+ loginSuccess,
+ logout,
+ logoutSuccess,
+} from './authentication.actions'
+import { AuthenticationService } from '@/app/core/services/auth.service'
+
+@Injectable()
+export class AuthenticationEffects {
+ login$ = createEffect(() =>
+ this.actions$.pipe(
+ ofType(login),
+ exhaustMap(({ email, password }) => {
+ return this.AuthenticationService.login(email, password).pipe(
+ map((user) => {
+ if (user) {
+ const returnUrl =
+ this.route.snapshot.queryParams['returnUrl'] || '/'
+ this.router.navigateByUrl(returnUrl)
+ }
+ return loginSuccess({ user })
+ }),
+ catchError((error) => of(loginFailure({ error })))
+ )
+ })
+ )
+ )
+
+ logout$ = createEffect(() =>
+ this.actions$.pipe(
+ ofType(logout),
+ exhaustMap(() => {
+ this.AuthenticationService.logout()
+ this.router.navigate(['/auth/sign-in'])
+ return of(logoutSuccess())
+ })
+ )
+ )
+
+ constructor(
+ @Inject(Actions) private actions$: Actions,
+ private AuthenticationService: AuthenticationService,
+ private router: Router,
+ private route: ActivatedRoute
+ ) {}
+}
diff --git a/apiferia/src/app/store/authentication/authentication.reducer.ts b/apiferia/src/app/store/authentication/authentication.reducer.ts
new file mode 100644
index 00000000..bcf42bd4
--- /dev/null
+++ b/apiferia/src/app/store/authentication/authentication.reducer.ts
@@ -0,0 +1,34 @@
+import { createReducer, on } from '@ngrx/store'
+import {
+ login,
+ loginFailure,
+ loginSuccess,
+ logout,
+} from './authentication.actions'
+import type { User } from './auth.model'
+
+export type AuthenticationState = {
+ isLoggedIn: boolean
+ user: User | null
+ error: string | null
+}
+
+const initialState: AuthenticationState = {
+ isLoggedIn: false,
+ user: null,
+ error: null,
+}
+
+export const authenticationReducer = createReducer(
+ initialState,
+ on(login, (state) => ({ ...state, error: null })),
+ on(loginSuccess, (state, { user }) => ({
+ ...state,
+ isLoggedIn: true,
+ user,
+ error: null,
+ })),
+ on(loginFailure, (state, { error }) => ({ ...state, error })),
+
+ on(logout, (state) => ({ ...state, user: null }))
+)
diff --git a/apiferia/src/app/store/authentication/authentication.selector.ts b/apiferia/src/app/store/authentication/authentication.selector.ts
new file mode 100644
index 00000000..7e8e22e8
--- /dev/null
+++ b/apiferia/src/app/store/authentication/authentication.selector.ts
@@ -0,0 +1,25 @@
+import { createFeatureSelector, createSelector } from '@ngrx/store'
+import { AuthenticationState } from './authentication.reducer'
+
+export const getUserState =
+ createFeatureSelector('authentication')
+
+export const getUser = createSelector(
+ getUserState,
+ (state: AuthenticationState) => state.user
+)
+
+export const getToken = createSelector(
+ getUserState,
+ (state: AuthenticationState) => state.user?.token
+)
+
+export const getisLoggedIn = createSelector(
+ getUserState,
+ (state: AuthenticationState) => state.isLoggedIn
+)
+
+export const getError = createSelector(
+ getUserState,
+ (state: AuthenticationState) => state.error
+)
diff --git a/apiferia/src/app/store/calendar/calendar.actions.ts b/apiferia/src/app/store/calendar/calendar.actions.ts
new file mode 100644
index 00000000..2d949c9a
--- /dev/null
+++ b/apiferia/src/app/store/calendar/calendar.actions.ts
@@ -0,0 +1,67 @@
+import { createAction, props } from '@ngrx/store'
+import { EventInput } from '@fullcalendar/core'
+
+export const fetchCalendar = createAction('[Calendar] Fetch Calendar')
+export const fetchCalendarSuccess = createAction(
+ '[Calendar] Fetch Calendar Success',
+ props<{ events: EventInput[] }>()
+)
+export const fetchCalendarFailure = createAction(
+ '[Data] Fetch Calendar Failure',
+ props<{ error: string }>()
+)
+
+export const addEvent = createAction(
+ '[Calendar] Add Event',
+ props<{ event: EventInput }>()
+)
+export const addEventSuccess = createAction(
+ '[Calendar] Add Event Success',
+ props<{ events: EventInput }>()
+)
+export const addEventFailure = createAction(
+ '[Calendar] Add Event Failure',
+ props<{ error: string }>()
+)
+
+// Add Data
+export const addCalendar = createAction(
+ '[Data] Add Calendar',
+ props<{ events: EventInput }>()
+)
+export const addCalendarSuccess = createAction(
+ '[Data] Add Calendar Success',
+ props<{ events: EventInput }>()
+)
+export const addCalendarFailure = createAction(
+ '[Data] Add Calendar Failure',
+ props<{ error: string }>()
+)
+
+// Update Data
+export const updateCalendar = createAction(
+ '[Data] Update calendar event',
+ props<{ events: EventInput }>()
+)
+export const updateCalendarSuccess = createAction(
+ '[Data] Update calendar event Success',
+ props<{ events: EventInput }>()
+)
+export const updateCalendarFailure = createAction(
+ '[Data] Update calendar event Failure',
+ props<{ error: string }>()
+)
+
+// Delete Data
+export const deleteCalendar = createAction(
+ '[Data] Delete Calendar',
+ props<{ id: string }>()
+)
+export const deleteCalendarSuccess = createAction(
+ '[Data] Delete Calendar Success',
+ props<{ id: string }>()
+)
+export const deleteCalendarFailure = createAction(
+ '[Data] Delete Calendar Failure',
+ props<{ error: string }>()
+)
diff --git a/apiferia/src/app/store/calendar/calendar.effects.ts b/apiferia/src/app/store/calendar/calendar.effects.ts
new file mode 100644
index 00000000..0658f2ab
--- /dev/null
+++ b/apiferia/src/app/store/calendar/calendar.effects.ts
@@ -0,0 +1,75 @@
+import { inject, Injectable } from '@angular/core'
+import { of } from 'rxjs'
+import { Actions, createEffect, ofType } from '@ngrx/effects'
+import { catchError, map, mergeMap, tap } from 'rxjs/operators'
+
+// Action
+import {
+ addCalendar,
+ addCalendarFailure,
+ addCalendarSuccess,
+ deleteCalendar,
+ deleteCalendarFailure,
+ deleteCalendarSuccess,
+ fetchCalendar,
+ fetchCalendarFailure,
+ fetchCalendarSuccess,
+ updateCalendar,
+ updateCalendarFailure,
+ updateCalendarSuccess,
+} from './calendar.actions'
+import { CrudService } from '@/app/core/services/crud.service'
+
+@Injectable()
+export class CalendarEffects {
+ private CrudService = inject(CrudService)
+ private actions$ = inject(Actions)
+
+ fetchEvents$ = createEffect(() =>
+ this.actions$.pipe(
+ ofType(fetchCalendar),
+ mergeMap(() =>
+ this.CrudService.fetchCalendarEvents().pipe(
+ map((events) => fetchCalendarSuccess({ events })),
+ catchError((error) => of(fetchCalendarFailure({ error })))
+ )
+ )
+ )
+ )
+
+ addEvents$ = createEffect(() =>
+ this.actions$.pipe(
+ ofType(addCalendar),
+ mergeMap(({ events }) =>
+ this.CrudService.addCalendarEvents(events).pipe(
+ map(() => addCalendarSuccess({ events })),
+ catchError((error) => of(addCalendarFailure({ error })))
+ )
+ )
+ )
+ )
+
+ updateEvents$ = createEffect(() =>
+ this.actions$.pipe(
+ ofType(updateCalendar),
+ mergeMap(({ events }) =>
+ this.CrudService.updateCalendarEvents(events).pipe(
+ map(() => updateCalendarSuccess({ events })),
+ catchError((error) => of(updateCalendarFailure({ error })))
+ )
+ )
+ )
+ )
+
+ deleteEvents$ = createEffect(() =>
+ this.actions$.pipe(
+ ofType(deleteCalendar),
+ mergeMap(({ id }) =>
+ this.CrudService.deleteCalendarEvents(id).pipe(
+ map(() => deleteCalendarSuccess({ id })),
+ catchError((error) => of(deleteCalendarFailure({ error })))
+ )
+ )
+ )
+ )
+}
diff --git a/apiferia/src/app/store/calendar/calendar.reducer.ts b/apiferia/src/app/store/calendar/calendar.reducer.ts
new file mode 100644
index 00000000..37bb1c1f
--- /dev/null
+++ b/apiferia/src/app/store/calendar/calendar.reducer.ts
@@ -0,0 +1,57 @@
+import { createReducer, on, Action } from '@ngrx/store'
+import { EventInput } from '@fullcalendar/core'
+import {
+ addEvent,
+ fetchCalendar,
+ fetchCalendarSuccess,
+ updateCalendarSuccess,
+ deleteCalendar,
+ addEventSuccess,
+ deleteCalendarSuccess,
+ addCalendarSuccess,
+} from './calendar.actions'
+
+export type CalendarState = {
+ events: EventInput[]
+}
+
+export const initialState: CalendarState = {
+ events: [],
+}
+
+export const calendarReducer = createReducer(
+ initialState,
+ on(fetchCalendar, (state) => {
+ return { ...state }
+ }),
+ on(fetchCalendarSuccess, (state, { events }) => {
+ return { ...state, events }
+ }),
+
+ on(addCalendarSuccess, (state, { events }) => {
+ return { ...state, events: [...state.events, events], error: null }
+ }),
+
+ on(updateCalendarSuccess, (state, { events }) => {
+ return {
+ ...state,
+ events: state.events.map((event) =>
+ event.id == events.id ? events : event
+ ),
+ error: null,
+ }
+ }),
+
+ on(deleteCalendarSuccess, (state, { id }) => {
+ return {
+ ...state,
+ events: state.events.filter((event) => event.id !== id),
+ error: null,
+ }
+ })
+)
+
+// Selector
+export function reducer(state: CalendarState | undefined, action: Action) {
+ return calendarReducer(state, action)
+}
diff --git a/apiferia/src/app/store/calendar/calendar.selectors.ts b/apiferia/src/app/store/calendar/calendar.selectors.ts
new file mode 100644
index 00000000..8c58c111
--- /dev/null
+++ b/apiferia/src/app/store/calendar/calendar.selectors.ts
@@ -0,0 +1,9 @@
+import { createFeatureSelector, createSelector } from '@ngrx/store'
+import { CalendarState } from './calendar.reducer'
+
+export const selectDataState = createFeatureSelector('Calendar')
+
+export const getEvents = createSelector(
+ selectDataState,
+ (state: CalendarState) => state.events
+)
diff --git a/apiferia/src/app/store/calendar/data.ts b/apiferia/src/app/store/calendar/data.ts
new file mode 100644
index 00000000..c60b043b
--- /dev/null
+++ b/apiferia/src/app/store/calendar/data.ts
@@ -0,0 +1,100 @@
+import { EventInput } from '@fullcalendar/core'
+
+export type externalModel = {
+ id: number
+ textClass: string
+ className: string
+ title: string
+}
+
+const defaultEvents: EventInput[] = [
+ {
+ id: '1',
+ title: 'Interview - Backend Engineer',
+ start: new Date(),
+ className: 'bg-primary',
+ },
+ {
+ id: '2',
+ title: 'Meeting with CT Team',
+ start: new Date(Date.now() + 13000000),
+ className: 'bg-warning',
+ },
+ {
+ id: '3',
+ title: 'Meeting with Mr. Reback',
+ start: new Date(Date.now() + 308000000),
+ end: new Date(Date.now() + 338000000),
+ className: 'bg-info',
+ },
+ {
+ id: '4',
+ title: 'Interview - Frontend Engineer',
+ start: new Date(Date.now() + 60570000),
+ end: new Date(Date.now() + 153000000),
+ className: 'bg-secondary',
+ },
+ {
+ id: '5',
+ title: 'Phone Screen - Frontend Engineer',
+ start: new Date(Date.now() + 168000000),
+ className: 'bg-success',
+ },
+ {
+ id: '6',
+ title: 'Buy Design Assets',
+ start: new Date(Date.now() + 330000000),
+ end: new Date(Date.now() + 330800000),
+ className: 'bg-primary',
+ },
+ {
+ id: '7',
+ title: 'Setup Github Repository',
+ start: new Date(Date.now() + 1008000000),
+ end: new Date(Date.now() + 1108000000),
+ className: 'bg-danger',
+ },
+ {
+ id: '8',
+ title: 'Meeting with Mr. Shreyu',
+ start: new Date(Date.now() + 2508000000),
+ end: new Date(Date.now() + 2508000000),
+ className: 'bg-dark',
+ },
+]
+
+// external events
+const externalEvents: externalModel[] = [
+ {
+ id: 1,
+ textClass: 'text-primary',
+ className: 'primary',
+ title: 'Team Building Retreat Meeting ',
+ },
+ {
+ id: 2,
+ textClass: 'text-info',
+ className: 'info',
+ title: 'Product Launch Strategy Meeting',
+ },
+ {
+ id: 3,
+ textClass: 'text-success',
+ className: 'success',
+ title: 'Monthly Sales Review',
+ },
+ {
+ id: 4,
+ textClass: 'text-danger',
+ className: 'danger',
+ title: 'Team Lunch Celebration',
+ },
+ {
+ id: 5,
+ textClass: 'text-warning',
+ className: 'warning',
+ title: 'Marketing Campaign Kickoff',
+ },
+]
+
+export { defaultEvents, externalEvents }
diff --git a/apiferia/src/app/store/index.ts b/apiferia/src/app/store/index.ts
new file mode 100644
index 00000000..aa9aab02
--- /dev/null
+++ b/apiferia/src/app/store/index.ts
@@ -0,0 +1,22 @@
+import { ActionReducerMap } from '@ngrx/store'
+import { LayoutState, layoutReducer } from './layout/layout-reducers'
+import {
+ calendarReducer,
+ type CalendarState,
+} from './calendar/calendar.reducer'
+import {
+ authenticationReducer,
+ type AuthenticationState,
+} from './authentication/authentication.reducer'
+
+export interface RootReducerState {
+ authentication: AuthenticationState
+ layout: LayoutState
+ Calendar: CalendarState
+}
+
+export const rootReducer: ActionReducerMap = {
+ authentication: authenticationReducer,
+ layout: layoutReducer,
+ Calendar: calendarReducer,
+}
diff --git a/apiferia/src/app/store/layout/layout-action.ts b/apiferia/src/app/store/layout/layout-action.ts
new file mode 100644
index 00000000..37eb3db9
--- /dev/null
+++ b/apiferia/src/app/store/layout/layout-action.ts
@@ -0,0 +1,19 @@
+import { createAction, props } from '@ngrx/store'
+
+export const changetheme = createAction(
+ '[Layout] Set Color',
+ props<{ color: string }>()
+)
+export const changetopbarcolor = createAction(
+ '[Layout] Set Topbar',
+ props<{ topbar: string }>()
+)
+export const changemenucolor = createAction(
+ '[Layout] Set Menu',
+ props<{ menu: string }>()
+)
+export const changesidebarsize = createAction(
+ '[Layout] Set size',
+ props<{ size: string }>()
+)
+export const resetState = createAction('[App] Reset State')
diff --git a/apiferia/src/app/store/layout/layout-reducers.ts b/apiferia/src/app/store/layout/layout-reducers.ts
new file mode 100644
index 00000000..11eab9b6
--- /dev/null
+++ b/apiferia/src/app/store/layout/layout-reducers.ts
@@ -0,0 +1,65 @@
+import { Action, createReducer, on } from '@ngrx/store'
+import { localStorageSync } from 'ngrx-store-localstorage'
+import {
+ LAYOUT_COLOR_TYPES,
+ SIDEBAR_SIZE_TYPES,
+ TOPBAR_COLOR_TYPES,
+} from './layout'
+import * as appActions from './layout-action'
+import {
+ changemenucolor,
+ changesidebarsize,
+ changetheme,
+ changetopbarcolor,
+} from './layout-action'
+
+export interface LayoutState {
+ LAYOUT_THEME: string
+ TOPBAR_COLOR: string
+ MENU_COLOR: string
+ MENU_SIZE: string
+}
+
+// IntialState
+export const initialState: LayoutState = {
+ LAYOUT_THEME: LAYOUT_COLOR_TYPES.LIGHTMODE,
+ TOPBAR_COLOR: TOPBAR_COLOR_TYPES.LIGHT,
+ MENU_COLOR: TOPBAR_COLOR_TYPES.LIGHT,
+ MENU_SIZE: SIDEBAR_SIZE_TYPES.DEFAULT,
+}
+
+// Reducer
+export const layoutReducer = createReducer(
+ initialState,
+ on(changetheme, (state, action) => ({
+ ...state,
+ LAYOUT_THEME: action.color,
+ })),
+ on(changetopbarcolor, (state, action) => ({
+ ...state,
+ TOPBAR_COLOR: action.topbar,
+ })),
+ on(changemenucolor, (state, action) => ({
+ ...state,
+ MENU_COLOR: action.menu,
+ })),
+ on(changesidebarsize, (state, action) => ({
+ ...state,
+ MENU_SIZE: action.size,
+ })),
+ on(appActions.resetState, () => initialState)
+)
+
+// Configuration for localStorageSync
+export function localStorageSyncReducer(reducer: any) {
+ return localStorageSync({ keys: ['app'], rehydrate: true })(reducer)
+}
+
+// Selector
+export function reducer(state: LayoutState | undefined, action: Action) {
+ return layoutReducer(state, action)
+}
+
+export const rootReducer = localStorageSyncReducer(layoutReducer)
+
+const metaReducers = [rootReducer]
diff --git a/apiferia/src/app/store/layout/layout-selector.ts b/apiferia/src/app/store/layout/layout-selector.ts
new file mode 100644
index 00000000..edcc1ecf
--- /dev/null
+++ b/apiferia/src/app/store/layout/layout-selector.ts
@@ -0,0 +1,24 @@
+import { createFeatureSelector, createSelector } from '@ngrx/store'
+import { LayoutState } from './layout-reducers'
+
+export const getLayoutState = createFeatureSelector('layout')
+
+export const getLayoutColor = createSelector(
+ getLayoutState,
+ (state: LayoutState) => state.LAYOUT_THEME
+)
+
+export const getTopbarcolor = createSelector(
+ getLayoutState,
+ (state: LayoutState) => state.TOPBAR_COLOR
+)
+
+export const getMenucolor = createSelector(
+ getLayoutState,
+ (state: LayoutState) => state.MENU_COLOR
+)
+
+export const getSidebarsize = createSelector(
+ getLayoutState,
+ (state: LayoutState) => state.MENU_SIZE
+)
diff --git a/apiferia/src/app/store/layout/layout.ts b/apiferia/src/app/store/layout/layout.ts
new file mode 100644
index 00000000..f7e26029
--- /dev/null
+++ b/apiferia/src/app/store/layout/layout.ts
@@ -0,0 +1,41 @@
+export enum LAYOUT_TYPES {
+ VERTICAL = 'vertical',
+ HORIZONTAL = 'horizontal',
+}
+
+export enum LAYOUT_COLOR_TYPES {
+ LIGHTMODE = 'light',
+ DARKMODE = 'dark',
+}
+
+export enum LAYOUT_MODE_TYPES {
+ FLUID = 'fluid',
+ BOXED = 'boxed',
+ DETACHED = 'detached',
+}
+
+export enum TOPBAR_COLOR_TYPES {
+ LIGHT = 'light',
+ DARK = 'dark',
+ BRAND = 'brand',
+}
+
+export enum MENU_COLOR_TYPES {
+ LIGHT = 'light',
+ DARK = 'dark',
+ BRAND = 'brand',
+}
+
+export enum SIDEBAR_SIZE_TYPES {
+ DEFAULT = 'default',
+ COMPACT = 'compact',
+ CONDENSED = 'condensed',
+ HOVER = 'sm-hover',
+ FULL = 'full',
+ FULLSCREEN = 'fullscreen',
+}
+
+export enum LAYOUT_POSITION_TYPES {
+ FIXED = 'fixed',
+ SCROLLABLE = 'scrollable',
+}
diff --git a/apiferia/src/app/views/advanced-ui/advanced.route.ts b/apiferia/src/app/views/advanced-ui/advanced.route.ts
new file mode 100644
index 00000000..7b0815f4
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/advanced.route.ts
@@ -0,0 +1,34 @@
+import { Route } from '@angular/router'
+import { RatingsComponent } from './ratings/ratings.component'
+import { SweetalertComponent } from './sweetalert/sweetalert.component'
+import { SwiperComponent } from './swiper/swiper.component'
+import { ScrollbarComponent } from './scrollbar/scrollbar.component'
+import { ToastifyComponent } from './toastify/toastify.component'
+
+export const ADVANCED_ROUTES: Route[] = [
+ {
+ path: 'ratings',
+ component: RatingsComponent,
+ data: { title: 'Ratings' },
+ },
+ {
+ path: 'alert',
+ component: SweetalertComponent,
+ data: { title: 'Sweet Alert' },
+ },
+ {
+ path: 'swiper',
+ component: SwiperComponent,
+ data: { title: 'Swiper Slider' },
+ },
+ {
+ path: 'scrollbar',
+ component: ScrollbarComponent,
+ data: { title: 'Scrollbar' },
+ },
+ {
+ path: 'toastify',
+ component: ToastifyComponent,
+ data: { title: 'Toastify' },
+ },
+]
diff --git a/apiferia/src/app/views/advanced-ui/ratings/ratings.component.html b/apiferia/src/app/views/advanced-ui/ratings/ratings.component.html
new file mode 100644
index 00000000..6231b217
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/ratings/ratings.component.html
@@ -0,0 +1,214 @@
+
+
+
+
+
+
+
+
+ Rater js is the best star rater for the browser. No dependencies.
+ Unlimited number of stars
+
+
+
Usage
+
+ To use Rating, follow the instructions from its documentation over
+
+ here
+
+
+
+
+
+
+
+ Basic Rater Example
+ #
+
+
+
+
+
+
+
+
+
+ Rater with Step Example
+ #
+
+
+
+
+
+ @if (fill > 0) {
+
+ } @else {
+
+ }
+
+
+
+
+
+
+
+
+
+ Custom Messages Example
+ #
+
+
+
+
+
+ @if (fill > 0) {
+
+ } @else {
+
+ }
+
+
+
+
+
+
+
+
+
+ ReadOnly Example
+ #
+
+
+
+
+
+ @if (fill > 0) {
+
+ } @else {
+
+ }
+
+
+
+
+
+
+
+
+
+ On Hover Event Example
+ #
+
+
+
+
+
+
+ @if (fill > 0) {
+
+ } @else {
+
+ }
+
+
+
+
{{
+ hoverSelected
+ }}
+
+
+
+
+
+
+
+
+ Clear/Reset Rater Example
+ #
+
+
+
+
+
+
+
+ @if (fill > 0) {
+
+ } @else {
+
+ }
+
+
+
+ Reset
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/advanced-ui/ratings/ratings.component.spec.ts b/apiferia/src/app/views/advanced-ui/ratings/ratings.component.spec.ts
new file mode 100644
index 00000000..ce18a7a0
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/ratings/ratings.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { RatingsComponent } from './ratings.component'
+
+describe('RatingsComponent', () => {
+ let component: RatingsComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [RatingsComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(RatingsComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/advanced-ui/ratings/ratings.component.ts b/apiferia/src/app/views/advanced-ui/ratings/ratings.component.ts
new file mode 100644
index 00000000..0638fd6d
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/ratings/ratings.component.ts
@@ -0,0 +1,37 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import {
+ FormControl,
+ FormsModule,
+ ReactiveFormsModule,
+ Validators,
+} from '@angular/forms'
+import { NgbRatingModule } from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'app-ratings',
+ standalone: true,
+ imports: [
+ PageTitleComponent,
+ NgbRatingModule,
+ ReactiveFormsModule,
+ UIExamplesListComponent,
+ ],
+ templateUrl: './ratings.component.html',
+ styles: ``,
+})
+export class RatingsComponent {
+ basicRating = 5
+ rating = 3
+ stepRating = 0
+ currentRate = 2
+ selected = 0
+ hovered = 0
+ hoverSelected = 1
+ readonly = 3.5
+ ariaValueText(current: number, max: number) {
+ return `${current} out of ${max} hearts`
+ }
+ ctrl = new FormControl(null, Validators.required)
+}
diff --git a/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.html b/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.html
new file mode 100644
index 00000000..bdfd1a1c
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.html
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+ Default Scroll Example
+ #
+
+
+ Just use tag
+ ngx-simplebar and add max-height: **px oh
+ fix height
+
+
+
+
+ SimpleBar does only one thing: replace the browser's default
+ scrollbar with a custom CSS-styled one without losing performances.
+ Unlike some popular plugins, SimpleBar doesn't mimic scroll with
+ Javascript, causing janks and strange scrolling behaviours... You
+ keep the awesomeness of native scrolling...with a custom scrollbar!
+
+ SimpleBar
+ does NOT implement a custom scroll behaviour . It
+ keeps the
+ native
+ overflow: auto
+ scroll and
+ only replace the scrollbar visual appearance.
+
+ Design it as you want
+
+ SimpleBar uses pure CSS to style the scrollbar. You can easily
+ customize it as you want! Or even have multiple style on the same
+ page...or just keep the default style ("Mac OS" scrollbar style).
+
+ Lightweight and performant
+
+ Only 6kb minified. SimpleBar doesn't use Javascript to handle
+ scrolling. You keep the performances/behaviours of the native
+ scroll.
+
+ Supported everywhere
+
+ SimpleBar has been tested on the following browsers: Chrome,
+ Firefox, Safari, Edge, IE11.
+
+
+
+
+
+
+
+
+
+ RTL Position
+ #
+
+
+ Just add tag ngx-simplebar and use data attribute
+ data-simplebar-direction='rtl'
+ and add max-height: **px oh fix height
+
+
+
+ SimpleBar does only one thing: replace the browser's default
+ scrollbar with a custom CSS-styled one without losing performances.
+ Unlike some popular plugins, SimpleBar doesn't mimic scroll with
+ Javascript, causing janks and strange scrolling behaviours... You
+ keep the awesomeness of native scrolling...with a custom scrollbar!
+
+ SimpleBar
+ does NOT implement a custom scroll behaviour . It
+ keeps the
+ native
+ overflow: auto
+ scroll and
+ only replace the scrollbar visual appearance.
+
+ Design it as you want
+
+ SimpleBar uses pure CSS to style the scrollbar. You can easily
+ customize it as you want! Or even have multiple style on the same
+ page...or just keep the default style ("Mac OS" scrollbar style).
+
+ Lightweight and performant
+
+ Only 6kb minified. SimpleBar doesn't use Javascript to handle
+ scrolling. You keep the performances/behaviours of the native
+ scroll.
+
+ Supported everywhere
+
+ SimpleBar has been tested on the following browsers: Chrome,
+ Firefox, Safari, Edge, IE11.
+
+
+
+
+
+
+
+
+
+ Scroll Size
+ #
+
+
+ Just add a tag ngx-simplebar and use data attribute use
+ data attribute data-simplebar-lg and add
+ max-height: **px oh fix height
+
+
+
+ SimpleBar does only one thing: replace the browser's default
+ scrollbar with a custom CSS-styled one without losing performances.
+ Unlike some popular plugins, SimpleBar doesn't mimic scroll with
+ Javascript, causing janks and strange scrolling behaviours... You
+ keep the awesomeness of native scrolling...with a custom scrollbar!
+
+ SimpleBar
+ does NOT implement a custom scroll behaviour . It
+ keeps the
+ native
+ overflow: auto
+ scroll and
+ only replace the scrollbar visual appearance.
+
+ Design it as you want
+
+ SimpleBar uses pure CSS to style the scrollbar. You can easily
+ customize it as you want! Or even have multiple style on the same
+ page...or just keep the default style ("Mac OS" scrollbar style).
+
+ Lightweight and performant
+
+ Only 6kb minified. SimpleBar doesn't use Javascript to handle
+ scrolling. You keep the performances/behaviours of the native
+ scroll.
+
+ Supported everywhere
+
+ SimpleBar has been tested on the following browsers: Chrome,
+ Firefox, Safari, Edge, IE11.
+
+
+
+
+
+
+
+
+
+ Scroll Color
+ #
+
+
+ Just add a tag ngx-simplebar and use data attribute
+ data-simplebar data-simplebar-*
+ and add max-height: **px oh fix height
+
+
+
+
+ SimpleBar does only one thing: replace the browser's default
+ scrollbar with a custom CSS-styled one without losing performances.
+ Unlike some popular plugins, SimpleBar doesn't mimic scroll with
+ Javascript, causing janks and strange scrolling behaviours... You
+ keep the awesomeness of native scrolling...with a custom scrollbar!
+
+ SimpleBar
+ does NOT implement a custom scroll behaviour . It
+ keeps the
+ native
+ overflow: auto
+ scroll and
+ only replace the scrollbar visual appearance.
+
+ Design it as you want
+
+ SimpleBar uses pure CSS to style the scrollbar. You can easily
+ customize it as you want! Or even have multiple style on the same
+ page...or just keep the default style ("Mac OS" scrollbar style).
+
+ Lightweight and performant
+
+ Only 6kb minified. SimpleBar doesn't use Javascript to handle
+ scrolling. You keep the performances/behaviours of the native
+ scroll.
+
+ Supported everywhere
+
+ SimpleBar has been tested on the following browsers: Chrome,
+ Firefox, Safari, Edge, IE11.
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.spec.ts b/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.spec.ts
new file mode 100644
index 00000000..c3e93c12
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ScrollbarComponent } from './scrollbar.component'
+
+describe('ScrollbarComponent', () => {
+ let component: ScrollbarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ScrollbarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ScrollbarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.ts b/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.ts
new file mode 100644
index 00000000..27865188
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/scrollbar/scrollbar.component.ts
@@ -0,0 +1,17 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { SimplebarAngularModule } from 'simplebar-angular'
+
+@Component({
+ selector: 'app-scrollbar',
+ standalone: true,
+ imports: [
+ PageTitleComponent,
+ SimplebarAngularModule,
+ UIExamplesListComponent,
+ ],
+ templateUrl: './scrollbar.component.html',
+ styles: ``,
+})
+export class ScrollbarComponent {}
diff --git a/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.html b/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.html
new file mode 100644
index 00000000..7d7ab547
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.html
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+ A beautiful, responsive, customizable, accessible (WAI-ARIA)
+ replacement for JavaScript's popup boxes
+
+
+
Usage
+
+ To use SweetAlert, follow the instructions from its documentation
+ over
+ here
+
+
+
+
+
+
+
+ Basic#
+
+
+
+
+ Click me
+
+
+
+
+
+
+
+
+ A Title with a Text Under#
+
+
+
+
+ Click me
+
+
+
+
+
+
+
+
+ Message#
+
+
+
+
+ Success
+
+
+ Warning
+
+
+ Info
+
+
+ Error
+
+
+
+
+
+
+
+
+ Long content Images Message#
+
+
+
+
+ Click me
+
+
+
+
+
+
+
+
+ Parameter#
+
+
+
+
+ Click me
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.spec.ts b/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.spec.ts
new file mode 100644
index 00000000..29eb42ca
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SweetalertComponent } from './sweetalert.component'
+
+describe('SweetalertComponent', () => {
+ let component: SweetalertComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SweetalertComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SweetalertComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.ts b/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.ts
new file mode 100644
index 00000000..86ba18b5
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/sweetalert/sweetalert.component.ts
@@ -0,0 +1,146 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import Swal from 'sweetalert2'
+
+@Component({
+ selector: 'app-sweetalert',
+ standalone: true,
+ imports: [PageTitleComponent, UIExamplesListComponent],
+ templateUrl: './sweetalert.component.html',
+ styles: ``,
+})
+export class SweetalertComponent {
+ basicMessage() {
+ Swal.fire({
+ title: 'Any fool can use a computer',
+ confirmButtonColor: '#1c84ee',
+ showCloseButton: false,
+ })
+ }
+
+ titleText() {
+ Swal.fire({
+ title: 'The Internet?',
+ text: 'That thing is still around?',
+ icon: 'question',
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs mt-2',
+ },
+ buttonsStyling: false,
+ showCloseButton: false,
+ })
+ }
+
+ success() {
+ Swal.fire({
+ title: 'Good job!',
+ text: 'You clicked the button!',
+ icon: 'success',
+ showCancelButton: true,
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs me-2 mt-2',
+ cancelButton: 'btn btn-danger w-xs mt-2',
+ },
+ buttonsStyling: false,
+ showCloseButton: false,
+ })
+ }
+
+ danger() {
+ Swal.fire({
+ title: 'Oops...',
+ text: 'Something went wrong!',
+ icon: 'error',
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs mt-2',
+ },
+ buttonsStyling: false,
+ footer: 'Why do I have this issue? ',
+ showCloseButton: false,
+ })
+ }
+
+ info() {
+ Swal.fire({
+ title: 'Oops...',
+ text: 'Something went wrong!',
+ icon: 'info',
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs mt-2',
+ },
+ buttonsStyling: false,
+ footer: 'Why do I have this issue? ',
+ showCloseButton: false,
+ })
+ }
+ warning() {
+ Swal.fire({
+ title: 'Oops...',
+ text: 'Something went wrong!',
+ icon: 'warning',
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs mt-2',
+ },
+
+ buttonsStyling: false,
+ footer: 'Why do I have this issue? ',
+ showCloseButton: false,
+ })
+ }
+
+ longContent() {
+ Swal.fire({
+ imageUrl: 'https://placeholder.pics/svg/300x1500',
+ imageHeight: 1500,
+ imageAlt: 'A tall image',
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs mt-2',
+ },
+ buttonsStyling: false,
+ showCloseButton: false,
+ })
+ }
+
+ parameter() {
+ Swal.fire({
+ title: 'Are you sure?',
+ text: "You won't be able to revert this!",
+ icon: 'warning',
+ showCancelButton: true,
+ confirmButtonText: 'Yes, delete it!',
+ cancelButtonText: 'No, cancel!',
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs me-2 mt-2',
+ cancelButton: 'btn btn-danger w-xs mt-2',
+ },
+ buttonsStyling: false,
+ showCloseButton: false,
+ }).then(function (result) {
+ if (result.value) {
+ Swal.fire({
+ title: 'Deleted!',
+ text: 'Your file has been deleted.',
+ icon: 'success',
+ customClass: {
+ confirmButton: 'btn btn-primary w-xs mt-2',
+ },
+ buttonsStyling: false,
+ })
+ } else if (
+ // Read more about handling dismissals
+ result.dismiss === Swal.DismissReason.cancel
+ ) {
+ Swal.fire({
+ title: 'Cancelled',
+ text: 'Your imaginary file is safe :)',
+ icon: 'error',
+ customClass: {
+ confirmButton: 'btn btn-primary mt-2',
+ },
+ buttonsStyling: false,
+ })
+ }
+ })
+ }
+}
diff --git a/apiferia/src/app/views/advanced-ui/swiper/swiper.component.html b/apiferia/src/app/views/advanced-ui/swiper/swiper.component.html
new file mode 100644
index 00000000..d8a437ea
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/swiper/swiper.component.html
@@ -0,0 +1,567 @@
+
+
+
+
+
+
+
+
+ Swiper is the most modern slider with hardware accelerated transitions
+ and amazing native behavior.
+
+
+
Usage
+
+ To use Swiper, follow the instructions from its documentation over
+
+ here
+
+
+
+
+
+
+
+ Default Swiper
+ #
+
+
+ Use
+ [config]="swiperConfig" init="false"
+ attribute to set a default swiper.
+
+
+
+
+
+
+
+
+ Navigation & Pagination Swiper
+ #
+
+
+ Use
+ [config]="swiperNavigation" init="false"
+ attribute to set a swiper with navigation and pagination.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use
+ init="false" [config]="swiperPagination"
+ attribute to set a swiper with dynamic and pagination.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Effect Fade Swiper
+ #
+
+
+ Use
+ [config]="swiperfadeEffect" init="false"
+ attribute to set a swiper with fade effect.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Effect Creative Swiper
+ #
+
+
+ Use
+ [config]="swiperCreativeEffect" init="false"
+ attribute to set a swiper with creative custom effect.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Effect Flip Swiper
+ #
+
+
+ Use
+ [config]="swiperFlip" init="false"
+ attribute to set a swiper with flip custom effect.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Use
+ [config]="swiperScroll" init="false"
+ attribute to set a swiper with scrollbar pagination.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Vertical Swiper
+ #
+
+
+ Use
+ [config]="verticalConfig" init="false"
+ attribute to set a swiper with vertical pagination.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Mousewheel Control Swiper
+ #
+
+
+ Use
+ init="false" [config]="swiperMouseWheel"
+ attribute to set a swiper with mousewheel scroll.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Responsive Breakpoints Swiper
+ #
+
+
+ Use
+ init="false" [config]="resposiveConfig"
+ attribute to set a responsive swiper.
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/advanced-ui/swiper/swiper.component.spec.ts b/apiferia/src/app/views/advanced-ui/swiper/swiper.component.spec.ts
new file mode 100644
index 00000000..bd6b5e67
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/swiper/swiper.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SwiperComponent } from './swiper.component'
+
+describe('SwiperComponent', () => {
+ let component: SwiperComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SwiperComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SwiperComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/advanced-ui/swiper/swiper.component.ts b/apiferia/src/app/views/advanced-ui/swiper/swiper.component.ts
new file mode 100644
index 00000000..621f8330
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/swiper/swiper.component.ts
@@ -0,0 +1,187 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { CUSTOM_ELEMENTS_SCHEMA, Component } from '@angular/core'
+import { SwiperOptions } from 'swiper/types'
+import {
+ Autoplay,
+ EffectCreative,
+ EffectFade,
+ EffectFlip,
+ Mousewheel,
+ Navigation,
+ Pagination,
+ Scrollbar,
+} from 'swiper/modules'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { register } from 'swiper/element'
+import { SwiperDirective } from '@/app/components/swiper-directive.component'
+
+register()
+
+@Component({
+ selector: 'app-swiper',
+ standalone: true,
+ imports: [PageTitleComponent, UIExamplesListComponent, SwiperDirective],
+ templateUrl: './swiper.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class SwiperComponent {
+ swiperConfig: SwiperOptions = {
+ loop: true,
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ }
+
+ swiperNavigation: SwiperOptions = {
+ modules: [Autoplay, Pagination, Navigation],
+ loop: true,
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ pagination: {
+ clickable: true,
+ el: '.basic-pagination',
+ },
+ navigation: {
+ nextEl: '.basic-next',
+ prevEl: '.basic-prev',
+ },
+ }
+
+ swiperPagination: SwiperOptions = {
+ modules: [Autoplay, Pagination],
+ loop: true,
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ pagination: {
+ clickable: true,
+ el: '.dynamic-pagination',
+ dynamicBullets: true,
+ },
+ }
+
+ swiperfadeEffect: SwiperOptions = {
+ modules: [Pagination, Autoplay, EffectFade],
+ loop: true,
+ effect: 'fade',
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ pagination: {
+ clickable: true,
+ el: '.effect-pagination',
+ },
+ }
+
+ swiperCreativeEffect: SwiperOptions = {
+ modules: [Autoplay, Pagination, EffectCreative],
+ loop: true,
+ grabCursor: true,
+ effect: 'creative',
+ // EffectCreative: {
+ // prev: {
+ // shadow: true,
+ // translate: [0, 0, -400],
+ // },
+ // next: {
+ // translate: ["100%", 0, 0],
+ // },
+ // },
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ pagination: {
+ el: '.creative-pagination',
+ clickable: true,
+ },
+ }
+
+ swiperFlip: SwiperOptions = {
+ modules: [EffectFlip, Pagination],
+ loop: true,
+ effect: 'flip',
+ grabCursor: true,
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ pagination: {
+ el: '.swiper-flip',
+ clickable: true,
+ },
+ }
+
+ swiperScroll: SwiperOptions = {
+ modules: [Autoplay, Scrollbar, Navigation],
+ loop: true,
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ scrollbar: {
+ el: '.swiper-scrollbar',
+ hide: true,
+ },
+ navigation: {
+ nextEl: '.swiper-button-next',
+ prevEl: '.swiper-button-prev',
+ },
+ }
+
+ verticalConfig: SwiperOptions = {
+ modules: [Autoplay, Pagination],
+ loop: true,
+ direction: 'vertical',
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ pagination: {
+ el: '.vertical-pagination',
+ clickable: true,
+ },
+ }
+
+ swiperMouseWheel: SwiperOptions = {
+ modules: [Autoplay, Pagination, Mousewheel],
+ loop: true,
+ direction: 'vertical',
+ mousewheel: true,
+ autoplay: {
+ delay: 2500,
+ disableOnInteraction: false,
+ },
+ pagination: {
+ el: '.mouse-wheel-pagination',
+ clickable: true,
+ },
+ }
+
+ resposiveConfig: SwiperOptions = {
+ modules: [Pagination],
+ loop: true,
+ slidesPerView: 1,
+ spaceBetween: 10,
+ pagination: {
+ el: '.responsive-pagination',
+ clickable: true,
+ },
+ breakpoints: {
+ 768: {
+ slidesPerView: 2,
+ spaceBetween: 40,
+ },
+ 1200: {
+ slidesPerView: 3,
+ spaceBetween: 50,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/advanced-ui/toastify/toastify.component.html b/apiferia/src/app/views/advanced-ui/toastify/toastify.component.html
new file mode 100644
index 00000000..6fcb9b66
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/toastify/toastify.component.html
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
Better notification messages
+
+
Usage
+
+ To use Toastify, follow the instructions from its documentation over
+
+ here
+
+
+
+
+
+
+
+ Basic Toastify JS Example
+ #
+
+
+
+
+
+ Default
+
+
+
+ Success
+
+
+
+ Warning
+
+
+
+ Error
+
+
+
+
+
+
+
+
+
+ Display Position Example
+ #
+
+
+
+
+
+ Top Left
+
+
+
+ Top Center
+
+
+
+ Top Right
+
+
+
+ Bottom Left
+
+
+
+ Bottom Center
+
+
+
+ Bottom Right
+
+
+
+
+
+
+
+
+
+ Offset, Close Button & Duration Example
+ #
+
+
+
+
+
+ Offset Position
+
+
+
+ Close icon Display
+
+
+
+ Duration
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/advanced-ui/toastify/toastify.component.spec.ts b/apiferia/src/app/views/advanced-ui/toastify/toastify.component.spec.ts
new file mode 100644
index 00000000..5d80f4f2
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/toastify/toastify.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ToastifyComponent } from './toastify.component'
+
+describe('ToastifyComponent', () => {
+ let component: ToastifyComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ToastifyComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ToastifyComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/advanced-ui/toastify/toastify.component.ts b/apiferia/src/app/views/advanced-ui/toastify/toastify.component.ts
new file mode 100644
index 00000000..feddb926
--- /dev/null
+++ b/apiferia/src/app/views/advanced-ui/toastify/toastify.component.ts
@@ -0,0 +1,66 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { ToastrService } from 'ngx-toastr'
+
+@Component({
+ selector: 'app-toastify',
+ standalone: true,
+ imports: [PageTitleComponent, UIExamplesListComponent],
+ templateUrl: './toastify.component.html',
+ styles: ``,
+})
+export class ToastifyComponent {
+ constructor(public toastService: ToastrService) {}
+
+ default() {
+ this.toastService.show('Welcome Back! This is a Toast Notification', '', {
+ toastClass: 'btn-light text-bg-primary px-3 py-2 mt-2 rounded-1',
+ positionClass: 'toast-top-right',
+ })
+ }
+
+ success(position: any) {
+ this.toastService.show('Your application was successfully sent', '', {
+ toastClass: 'btn-light text-bg-success px-3 py-2 mt-2 rounded-1',
+ positionClass: position,
+ })
+ }
+
+ warning() {
+ this.toastService.show('Warning ! Something went wrong try again', '', {
+ toastClass: 'btn-light text-bg-warning px-3 py-2 mt-2 rounded-1',
+ positionClass: 'toast-top-center',
+ })
+ }
+
+ error() {
+ this.toastService.show('Error ! An error occurred.', '', {
+ toastClass: 'btn-light text-bg-danger px-3 py-2 mt-2 rounded-1',
+ positionClass: 'toast-top-center',
+ })
+ }
+
+ positionToast(position: any) {
+ this.toastService.success(
+ 'Welcome Back ! This is a Toast Notification',
+ '',
+ {
+ timeOut: 3000,
+ closeButton: true,
+ toastClass: 'btn-light text-bg-success px-3 py-2 mt-2 rounded-1',
+ positionClass: position,
+ tapToDismiss: true,
+ }
+ )
+ }
+
+ durationToast(position: any) {
+ this.toastService.show('Toast Duration 5s', '', {
+ timeOut: 5000,
+ positionClass: position,
+ toastClass: 'btn-light text-bg-success px-3 py-2 mt-2 rounded-1',
+ closeButton: false,
+ })
+ }
+}
diff --git a/apiferia/src/app/views/apps/apps.route.ts b/apiferia/src/app/views/apps/apps.route.ts
new file mode 100644
index 00000000..74532def
--- /dev/null
+++ b/apiferia/src/app/views/apps/apps.route.ts
@@ -0,0 +1,34 @@
+import { Route } from '@angular/router'
+import { ChatComponent } from './chat/chat.component'
+import { ContactsComponent } from './contacts/contacts.component'
+import { EmailComponent } from './email/email.component'
+import { SocialComponent } from './social/social.component'
+import { TodoComponent } from './todo/todo.component'
+
+export const APPS_ROUTES: Route[] = [
+ {
+ path: 'chat',
+ component: ChatComponent,
+ data: { title: 'Chat' },
+ },
+ {
+ path: 'email',
+ component: EmailComponent,
+ data: { title: 'Email' },
+ },
+ {
+ path: 'todo',
+ component: TodoComponent,
+ data: { title: 'To do' },
+ },
+ {
+ path: 'social',
+ component: SocialComponent,
+ data: { title: 'Social' },
+ },
+ {
+ path: 'contacts',
+ component: ContactsComponent,
+ data: { title: 'Contacts' },
+ },
+]
diff --git a/apiferia/src/app/views/apps/chat/chat.component.html b/apiferia/src/app/views/apps/chat/chat.component.html
new file mode 100644
index 00000000..9091754f
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/chat.component.html
@@ -0,0 +1,17 @@
+
diff --git a/apiferia/src/app/views/apps/chat/chat.component.spec.ts b/apiferia/src/app/views/apps/chat/chat.component.spec.ts
new file mode 100644
index 00000000..0281adcc
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/chat.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ChatComponent } from './chat.component'
+
+describe('ChatComponent', () => {
+ let component: ChatComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ChatComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ChatComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/chat/chat.component.ts b/apiferia/src/app/views/apps/chat/chat.component.ts
new file mode 100644
index 00000000..51d8cf22
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/chat.component.ts
@@ -0,0 +1,19 @@
+import { Component } from '@angular/core'
+import { ContactsComponent } from './components/contacts/contacts.component'
+import { ChatListComponent } from './components/chat-list/chat-list.component'
+import type { ContactType, GroupType, UserContactType } from './data'
+
+@Component({
+ selector: 'app-chat',
+ standalone: true,
+ imports: [ContactsComponent, ChatListComponent],
+ templateUrl: './chat.component.html',
+ styles: ``,
+})
+export class ChatComponent {
+ profileDetail!: ContactType | GroupType | UserContactType
+
+ receiveDataFromChild(data: ContactType | GroupType | UserContactType) {
+ this.profileDetail = data
+ }
+}
diff --git a/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.html b/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.html
new file mode 100644
index 00000000..93374696
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.html
@@ -0,0 +1,435 @@
+
+
+
+
+
+ @for (chat of messagesList; track $index) {
+
+ @for (msg of chat.msg; track msg) {
+
+ @if (chat.isSender) {
+
+
+
+ @if (msg.isMedia && msg.mediaContend) {
+
+ } @else {
+
{{ msg.text }}
+ }
+
+
+ } @else {
+
+
+ @if (msg.isMedia && msg.mediaContend) {
+
+ } @else if (msg.img) {
+ @for (img of msg.img; track $index) {
+
+
+
+ }
+ } @else {
+
{{ msg.text }}
+ }
+
+
+
+ }
+
+ @if (chat.timeStamp && chat.msg.length - 1 === $index) {
+ {{ chat.timeStamp }}
+ @if (chat.isRead) {
+
+ }
+ }
+
+
+ }
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Gaston Lapierre
+
Calling...
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.spec.ts b/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.spec.ts
new file mode 100644
index 00000000..bcc3bf81
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ChatListComponent } from './chat-list.component'
+
+describe('ChatListComponent', () => {
+ let component: ChatListComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ChatListComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ChatListComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.ts b/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.ts
new file mode 100644
index 00000000..8f5a21cd
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/chat-list/chat-list.component.ts
@@ -0,0 +1,174 @@
+import {
+ Component,
+ inject,
+ Input,
+ ViewChild,
+ type TemplateRef,
+} from '@angular/core'
+import {
+ MessageData,
+ type ContactType,
+ type GroupType,
+ type UserContactType,
+} from '../../data'
+import { CommonModule } from '@angular/common'
+import {
+ SimplebarAngularModule,
+ type SimplebarAngularComponent,
+} from 'simplebar-angular'
+import {
+ NgbDropdownModule,
+ NgbModal,
+ NgbOffcanvas,
+} from '@ng-bootstrap/ng-bootstrap'
+import { ProfileComponent } from '../profile/profile.component'
+import { ContactsComponent } from '../contacts/contacts.component'
+import {
+ FormsModule,
+ ReactiveFormsModule,
+ UntypedFormBuilder,
+ Validators,
+ type UntypedFormGroup,
+} from '@angular/forms'
+import { PickerModule } from '@ctrl/ngx-emoji-mart'
+import type { EmojiEvent } from '@ctrl/ngx-emoji-mart/ngx-emoji'
+
+@Component({
+ selector: 'chat-list',
+ standalone: true,
+ imports: [
+ CommonModule,
+ SimplebarAngularModule,
+ NgbDropdownModule,
+ FormsModule,
+ ReactiveFormsModule,
+ PickerModule,
+ ],
+ templateUrl: './chat-list.component.html',
+ styles: ``,
+})
+export class ChatListComponent {
+ @Input() profileDetail!: ContactType | GroupType | UserContactType
+
+ messagesList = MessageData
+ formData!: UntypedFormGroup
+ submitted = false
+ emoji = ''
+
+ public offCanvas = inject(NgbOffcanvas)
+ private modalService = inject(NgbModal)
+ public formBuilder = inject(UntypedFormBuilder)
+
+ @ViewChild('scrollRef', { static: false })
+ scrollRef!: SimplebarAngularComponent
+
+ ngOnInit(): void {
+ // Validation
+ this.formData = this.formBuilder.group({
+ message: ['', [Validators.required]],
+ })
+ }
+
+ getProfileImage(): string | undefined {
+ if ('image' in this.profileDetail) {
+ return this.profileDetail.image
+ }
+ return undefined
+ }
+
+ ngAfterViewInit() {
+ this.scrollRef.SimpleBar.getScrollElement().scrollTop = 300
+ this.onListScroll()
+ }
+
+ onListScroll() {
+ if (this.scrollRef !== undefined) {
+ setTimeout(() => {
+ this.scrollRef.SimpleBar.getScrollElement().scrollTop =
+ this.scrollRef.SimpleBar.getScrollElement().scrollHeight
+ }, 100)
+ }
+ }
+
+ openProfile() {
+ const divElement = document.getElementById('chatArea')!
+ const offcanvasRef = this.offCanvas.open(ProfileComponent, {
+ panelClass: 'position-absolute shadow border-start show',
+ position: 'end',
+ container: divElement,
+ backdrop: false,
+ scroll: true,
+ })
+ offcanvasRef.componentInstance.profileDetail = this.profileDetail
+ }
+
+ open(content: TemplateRef) {
+ this.modalService.open(content, { size: 'sm', centered: true })
+ }
+
+ openContactMenu() {
+ this.offCanvas.open(ContactsComponent, {
+ panelClass: 'chatOffcanvas',
+ })
+ }
+
+ get form() {
+ return this.formData.controls
+ }
+
+ messageSend() {
+ const message = this.formData.get('message')!.value
+ if (this.formData.valid && message) {
+ this.messagesList.push({
+ id: this.messagesList.length + 1,
+ msg: [{ text: message }],
+ timeStamp: new Date().getHours() + ':' + new Date().getMinutes(),
+ isSender: true,
+ })
+ setTimeout(() => {
+ this.messagesList.push({
+ id: this.messagesList.length + 1,
+ msg: [{ text: 'Server is not connected 😔' }],
+ timeStamp: new Date().getHours() + ':' + new Date().getMinutes(),
+ isSender: false,
+ })
+ this.onListScroll()
+ }, 1000)
+ } else {
+ this.submitted = true
+ }
+
+ this.onListScroll()
+ setTimeout(() => {
+ this.formData.reset()
+ }, 500)
+ }
+
+ // Emoji Picker
+ showEmojiPicker = false
+ sets = [
+ 'native',
+ 'google',
+ 'twitter',
+ 'facebook',
+ 'emojione',
+ 'apple',
+ 'messenger',
+ ]
+ set = 'twitter'
+ toggleEmojiPicker() {
+ this.showEmojiPicker = !this.showEmojiPicker
+ }
+
+ addEmoji(event: EmojiEvent) {
+ const { emoji } = this
+ let text
+ if (emoji) {
+ text = `${emoji}${event.emoji.native}`
+ } else {
+ text = `${event.emoji.native}`
+ }
+ this.emoji = text
+ this.showEmojiPicker = false
+ }
+}
diff --git a/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.html b/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.html
new file mode 100644
index 00000000..65c06210
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.html
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+ @for (usr of userData; track $index) {
+
+
+
+
+
+ }
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.spec.ts b/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.spec.ts
new file mode 100644
index 00000000..5653938e
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ContactsComponent } from './contacts.component'
+
+describe('ContactsComponent', () => {
+ let component: ContactsComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ContactsComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ContactsComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.ts b/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.ts
new file mode 100644
index 00000000..93f9afb2
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/contacts/contacts.component.ts
@@ -0,0 +1,83 @@
+import { SwiperDirective } from '@/app/components/swiper-directive.component'
+import {
+ Component,
+ CUSTOM_ELEMENTS_SCHEMA,
+ EventEmitter,
+ inject,
+ Output,
+ type OnInit,
+} from '@angular/core'
+import { register } from 'swiper/element'
+import {
+ ContactList,
+ GroupList,
+ UserContact,
+ UserList,
+ type ContactType,
+ type GroupType,
+ type UserContactType,
+} from '../../data'
+import type { SwiperOptions } from 'swiper/types'
+import { NgbNavModule, NgbOffcanvas } from '@ng-bootstrap/ng-bootstrap'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { SettingComponent } from '../setting/setting.component'
+import { FormsModule } from '@angular/forms'
+register()
+
+@Component({
+ selector: 'chat-contacts',
+ standalone: true,
+ imports: [SwiperDirective, NgbNavModule, SimplebarAngularModule, FormsModule],
+ templateUrl: './contacts.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class ContactsComponent implements OnInit {
+ userData = UserList
+ contactData = ContactList
+ groupData = GroupList
+ userContactList = UserContact
+ searchText: string = ''
+
+ @Output() profileDetail = new EventEmitter<
+ ContactType | GroupType | UserContactType
+ >()
+
+ private offcanvasService = inject(NgbOffcanvas)
+
+ ngOnInit(): void {
+ // Fetch Data
+ const data = this.contactData[2]
+ this.profileDetail.emit(data)
+ }
+
+ swiperConfig: SwiperOptions = {
+ slidesPerView: 6.3,
+ loop: true,
+ }
+
+ openSetting(divId: string) {
+ const divElement = document.getElementById(divId)!
+ if (this.offcanvasService.hasOpenOffcanvas()) {
+ this.offcanvasService.open(SettingComponent)
+ } else {
+ this.offcanvasService.open(SettingComponent, {
+ container: divElement,
+ panelClass: 'position-absolute shadow w-100',
+ backdrop: false,
+ })
+ }
+ }
+
+ getDetail(user: ContactType | GroupType | UserContactType) {
+ const data = user
+ this.profileDetail.emit(data)
+ }
+
+ searchContact() {
+ this.contactData = ContactList.filter(
+ (user) =>
+ user.name.toLowerCase().indexOf(this.searchText.toLowerCase()) >= 0
+ )
+ }
+}
diff --git a/apiferia/src/app/views/apps/chat/components/profile/profile.component.html b/apiferia/src/app/views/apps/chat/components/profile/profile.component.html
new file mode 100644
index 00000000..dd8a79f1
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/profile/profile.component.html
@@ -0,0 +1,110 @@
+
+
+
+
+ @if (profileDetail.image) {
+
+ } @else {
+
+ {{ profileDetail.name.charAt(0) }}
+
+ }
+
+
{{ profileDetail.name }}
+
+ Send Email
+
+
+ Last Interacted:
+ Online
+
+
+
+
+
+
+
+ Phone Number:
+
+
+1 456 9595 9594
+
+
+ Location:
+
+
California, USA
+
+
+ Languages:
+
+
English, German, Spanish
+
+
+ Groups:
+
+
+ Work
+ Friends
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/chat/components/profile/profile.component.spec.ts b/apiferia/src/app/views/apps/chat/components/profile/profile.component.spec.ts
new file mode 100644
index 00000000..1cca759b
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/profile/profile.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ProfileComponent } from './profile.component'
+
+describe('ProfileComponent', () => {
+ let component: ProfileComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ProfileComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ProfileComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/chat/components/profile/profile.component.ts b/apiferia/src/app/views/apps/chat/components/profile/profile.component.ts
new file mode 100644
index 00000000..2224bc1a
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/profile/profile.component.ts
@@ -0,0 +1,23 @@
+import { Component, inject, Input } from '@angular/core'
+import { NgbActiveOffcanvas } from '@ng-bootstrap/ng-bootstrap'
+import type { ContactType } from '../../data'
+import { SimplebarAngularModule } from 'simplebar-angular'
+
+@Component({
+ selector: 'app-profile',
+ standalone: true,
+ imports: [SimplebarAngularModule],
+ templateUrl: './profile.component.html',
+ styles: `
+ :host {
+ display: contents !important;
+ }
+ `,
+})
+export class ProfileComponent {
+ activeOffcanvas = inject(NgbActiveOffcanvas)
+
+ @Input() profileDetail!: ContactType
+
+ ngOnInit() {}
+}
diff --git a/apiferia/src/app/views/apps/chat/components/setting/setting.component.html b/apiferia/src/app/views/apps/chat/components/setting/setting.component.html
new file mode 100644
index 00000000..de67f660
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/setting/setting.component.html
@@ -0,0 +1,477 @@
+
+
+ Setting
+
+
+
+
+
+
Gaston Lapierre
+
+ Hey there! I am using Reback Chat.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Display
+
+
+
Chat Setting
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Messages
+
+
+
Groups
+
+
+
Calls
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Media auto-download
+
+ Voice message are always automatically downloaded
+
+
+
+
Media upload quality
+
+ Choose the quality of media files to be sent
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/chat/components/setting/setting.component.spec.ts b/apiferia/src/app/views/apps/chat/components/setting/setting.component.spec.ts
new file mode 100644
index 00000000..42a3f6fb
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/setting/setting.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SettingComponent } from './setting.component'
+
+describe('SettingComponent', () => {
+ let component: SettingComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SettingComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SettingComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/chat/components/setting/setting.component.ts b/apiferia/src/app/views/apps/chat/components/setting/setting.component.ts
new file mode 100644
index 00000000..89a58b4f
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/components/setting/setting.component.ts
@@ -0,0 +1,21 @@
+import { Component, inject } from '@angular/core'
+import {
+ NgbAccordionModule,
+ NgbActiveOffcanvas,
+} from '@ng-bootstrap/ng-bootstrap'
+import { SimplebarAngularModule } from 'simplebar-angular'
+
+@Component({
+ selector: 'app-setting',
+ standalone: true,
+ imports: [SimplebarAngularModule, NgbAccordionModule],
+ templateUrl: './setting.component.html',
+ styles: `
+ :host {
+ display: contents !important;
+ }
+ `,
+})
+export class SettingComponent {
+ activeOffcanvas = inject(NgbActiveOffcanvas)
+}
diff --git a/apiferia/src/app/views/apps/chat/data.ts b/apiferia/src/app/views/apps/chat/data.ts
new file mode 100644
index 00000000..7db85485
--- /dev/null
+++ b/apiferia/src/app/views/apps/chat/data.ts
@@ -0,0 +1,299 @@
+import { currentYear } from '@/app/common/constants'
+
+type UserType = {
+ name: string
+ image: string
+}
+
+export type ContactType = {
+ image?: string
+ name: string
+ lastMsg: string
+ time: string
+ isRead: boolean
+}
+
+export type GroupType = {
+ name: string
+ badge?: number
+}
+
+export type UserContactType = {
+ name: string
+ image?: string
+ status: string
+}
+
+type MediaContendType = {
+ title: string
+ type: string
+ size: string
+}
+
+type MessageType = {
+ text?: string
+ img?: string[]
+ isMedia?: boolean
+ mediaContend?: MediaContendType
+}
+
+export type ChatMsgType = {
+ id: number
+ msg: MessageType[]
+ timeStamp?: string
+ isSender: boolean
+ isRead?: boolean
+}
+
+export const UserList: UserType[] = [
+ {
+ name: '',
+ image: 'assets/images/users/avatar-1.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-2.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-3.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-4.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-5.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-6.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-7.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-8.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-9.jpg',
+ },
+ {
+ name: '',
+ image: 'assets/images/users/avatar-10.jpg',
+ },
+]
+
+export const ContactList: ContactType[] = [
+ {
+ image: 'assets/images/users/avatar-2.jpg',
+ name: 'Gaston Lapierre',
+ lastMsg: 'How are you today?',
+ time: '10:20am',
+ isRead: true,
+ },
+ {
+ name: 'Fantina LeBatelier',
+ time: '11:03am',
+ lastMsg: "Hey! a reminder for tomorrow's meeting...",
+ image: 'assets/images/users/avatar-3.jpg',
+ isRead: true,
+ },
+ {
+ name: 'Gilbert Chicoine',
+ time: 'now',
+ lastMsg: 'typing...',
+ image: 'assets/images/users/avatar-4.jpg',
+ isRead: false,
+ },
+ {
+ name: 'Mignonette Brodeur',
+ time: 'Yesterday',
+ lastMsg: "Are we going to have this week's planning meeting today?",
+ image: 'assets/images/users/avatar-5.jpg',
+ isRead: true,
+ },
+ {
+ name: 'Thomas Menard',
+ time: 'Yesterday',
+ lastMsg: 'Please check this template...',
+ image: 'assets/images/users/avatar-6.jpg',
+ isRead: true,
+ },
+ {
+ name: 'Melisande Lapointe',
+ time: 'Yesterday',
+ lastMsg: 'Are free for 10 minutes? would like to discuss something...',
+ image: 'assets/images/users/avatar-7.jpg',
+ isRead: true,
+ },
+ {
+ name: 'Danielle Despins',
+ time: '7/8/21',
+ lastMsg: 'How are you?',
+ image: 'assets/images/users/avatar-8.jpg',
+ isRead: true,
+ },
+ {
+ name: 'Onfroi Pichette',
+ time: '7/8/21',
+ lastMsg: 'whats going on?',
+ image: 'assets/images/users/avatar-9.jpg',
+ isRead: true,
+ },
+ {
+ name: 'Kari Boisvert',
+ time: '7/8/21',
+ lastMsg: 'Would you like to join us?',
+ image: 'assets/images/users/avatar-10.jpg',
+ isRead: false,
+ },
+]
+
+export const GroupList: GroupType[] = [
+ {
+ name: 'General',
+ },
+ {
+ name: 'Company',
+ badge: 33,
+ },
+ {
+ name: 'Life Suckers',
+ badge: 17,
+ },
+ {
+ name: 'Drama Club',
+ },
+ {
+ name: 'Unknown Friends',
+ },
+ {
+ name: 'Family Ties',
+ badge: 65,
+ },
+ {
+ name: '2Good4U',
+ },
+]
+
+export const UserContact: UserContactType[] = [
+ {
+ name: 'Gaston Lapierre',
+ image: 'assets/images/users/avatar-2.jpg',
+ status: '',
+ },
+ {
+ name: 'Fantina LeBatelier',
+ image: 'assets/images/users/avatar-3.jpg',
+ status: '** no status **',
+ },
+ {
+ name: 'Gilbert Chicoine',
+ image: 'assets/images/users/avatar-4.jpg',
+ status: '|| Karma ||',
+ },
+ {
+ name: 'Mignonette Brodeur',
+ image: 'assets/images/users/avatar-5.jpg',
+ status: 'Hey there! I am using Chat.',
+ },
+ {
+ name: 'Thomas Menard',
+ image: 'assets/images/users/avatar-6.jpg',
+ status: 'TM',
+ },
+ {
+ name: 'Melisande Lapointe',
+ image: 'assets/images/users/avatar-7.jpg',
+ status: 'Available',
+ },
+ {
+ name: 'Danielle Despins',
+ image: 'assets/images/users/avatar-8.jpg',
+ status: 'Hey there! I am using Chat.',
+ },
+]
+
+export const MessageData: ChatMsgType[] = [
+ {
+ id: 1,
+ msg: [{ text: 'Hey 😊' }],
+ timeStamp: '8:20 am',
+ isSender: false,
+ },
+ {
+ id: 2,
+ msg: [{ text: 'Hi' }],
+ timeStamp: '8:20 am',
+ isSender: true,
+ isRead: true,
+ },
+ {
+ id: 3,
+ msg: [
+ {
+ text: "Hi Gaston, thanks for joining the meeting. Let's dive into our quarterly performance review.",
+ },
+ ],
+ isSender: false,
+ },
+ {
+ id: 4,
+ msg: [
+ {
+ text: `Hi Gilbert, thanks for having me. I'm ready to discuss how things have been going.`,
+ },
+ ],
+ timeStamp: '8:25 am',
+ isSender: true,
+ isRead: true,
+ },
+ {
+ id: 5,
+ msg: [
+ {
+ img: [
+ 'assets/images/small/img-1.jpg',
+ 'assets/images/small/img-2.jpg',
+ 'assets/images/small/img-3.jpg',
+ ],
+ },
+ ],
+ timeStamp: '8:26 am',
+ isSender: false,
+ },
+ {
+ id: 6,
+ msg: [
+ {
+ isMedia: true,
+ mediaContend: {
+ title: 'financial-report-' + currentYear + '.zip',
+ type: 'bxs-file-archive',
+ size: '2.3 MB',
+ },
+ },
+ {
+ text: 'I appreciate your honesty. Can you elaborate on some of those challenges? I want to understand how we can support you better in the future.',
+ },
+ ],
+ timeStamp: '8:27 am',
+ isSender: true,
+ isRead: true,
+ },
+ {
+ id: 7,
+ msg: [
+ {
+ text: `Thanks, Emily. I appreciate your support. Overall, I'm optimistic about our team's performance and looking forward to tackling new challenges in the next quarter.`,
+ },
+ ],
+ timeStamp: '8:29 am',
+ isSender: false,
+ },
+]
diff --git a/apiferia/src/app/views/apps/contacts/contacts.component.html b/apiferia/src/app/views/apps/contacts/contacts.component.html
new file mode 100644
index 00000000..8e5cbb45
--- /dev/null
+++ b/apiferia/src/app/views/apps/contacts/contacts.component.html
@@ -0,0 +1,39 @@
+
+
+
+ @for (data of contactList; track $index) {
+
+ }
+
diff --git a/apiferia/src/app/views/apps/contacts/contacts.component.spec.ts b/apiferia/src/app/views/apps/contacts/contacts.component.spec.ts
new file mode 100644
index 00000000..5653938e
--- /dev/null
+++ b/apiferia/src/app/views/apps/contacts/contacts.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ContactsComponent } from './contacts.component'
+
+describe('ContactsComponent', () => {
+ let component: ContactsComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ContactsComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ContactsComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/contacts/contacts.component.ts b/apiferia/src/app/views/apps/contacts/contacts.component.ts
new file mode 100644
index 00000000..1138cd43
--- /dev/null
+++ b/apiferia/src/app/views/apps/contacts/contacts.component.ts
@@ -0,0 +1,15 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component } from '@angular/core'
+import { contactData } from './data'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'app-contacts',
+ standalone: true,
+ imports: [PageTitleComponent, RouterLink],
+ templateUrl: './contacts.component.html',
+ styles: ``,
+})
+export class ContactsComponent {
+ contactList = contactData
+}
diff --git a/apiferia/src/app/views/apps/contacts/data.ts b/apiferia/src/app/views/apps/contacts/data.ts
new file mode 100644
index 00000000..b087ab99
--- /dev/null
+++ b/apiferia/src/app/views/apps/contacts/data.ts
@@ -0,0 +1,69 @@
+export type ContactType = {
+ name: string
+ location: string
+ phone: string
+ profile_image: string
+}
+
+export const contactData: ContactType[] = [
+ {
+ name: 'Anna M. Hines',
+ location: 'Burr Ridge/Illinois',
+ phone: '555-1564-261',
+ profile_image: 'assets/images/users/avatar-1.jpg',
+ },
+ {
+ name: 'Candice F. Gilmore',
+ location: 'Roselle/Illinois',
+ phone: '755-5532-588',
+ profile_image: 'assets/images/users/avatar-2.jpg',
+ },
+ {
+ name: 'Vanessa R. Davis',
+ location: 'Wann/Oklahoma',
+ phone: '441-5558-183',
+ profile_image: 'assets/images/users/avatar-3.jpg',
+ },
+ {
+ name: 'Judith H. Fritsche',
+ location: 'SULLIVAN/Kentucky',
+ phone: '305-5579-759',
+ profile_image: 'assets/images/users/avatar-4.jpg',
+ },
+ {
+ name: 'Peter T. Smith',
+ location: 'Yreka/California',
+ phone: '655-5187-93',
+ profile_image: 'assets/images/users/avatar-5.jpg',
+ },
+ {
+ name: 'Emmanuel J. Delcid',
+ location: 'Atlanta/Georgia',
+ phone: '693-5553-637',
+ profile_image: 'assets/images/users/avatar-6.jpg',
+ },
+ {
+ name: 'William J. Cook',
+ location: 'Rosenberg/Texas',
+ phone: '855-5446-150',
+ profile_image: 'assets/images/users/avatar-7.jpg',
+ },
+ {
+ name: 'Martin R. Peters',
+ location: 'Youngstown/Ohio',
+ phone: '455-5943-13',
+ profile_image: 'assets/images/users/avatar-8.jpg',
+ },
+ {
+ name: 'Paul M. Schubert',
+ location: 'Austin/Texas',
+ phone: '035-5531-64',
+ profile_image: 'assets/images/users/avatar-9.jpg',
+ },
+ {
+ name: 'Janet J. Champine',
+ location: 'Nashville/Tennessee',
+ phone: '115-5592-916',
+ profile_image: 'assets/images/users/avatar-10.jpg',
+ },
+]
diff --git a/apiferia/src/app/views/apps/email/components/compose/compose.component.html b/apiferia/src/app/views/apps/email/components/compose/compose.component.html
new file mode 100644
index 00000000..bf9bd7a5
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/compose/compose.component.html
@@ -0,0 +1,261 @@
+
+
+
+
+ Compose
+
+
+
+
+
+
+
+ FREE
+
+
Storage
+
+
7.02 GB (46%) of 15 GB used
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/email/components/compose/compose.component.spec.ts b/apiferia/src/app/views/apps/email/components/compose/compose.component.spec.ts
new file mode 100644
index 00000000..a13e1856
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/compose/compose.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ComposeComponent } from './compose.component'
+
+describe('ComposeComponent', () => {
+ let component: ComposeComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ComposeComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ComposeComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/email/components/compose/compose.component.ts b/apiferia/src/app/views/apps/email/components/compose/compose.component.ts
new file mode 100644
index 00000000..e75cab9b
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/compose/compose.component.ts
@@ -0,0 +1,63 @@
+import { Component, inject, type TemplateRef } from '@angular/core'
+import {
+ NgbActiveOffcanvas,
+ NgbDropdownModule,
+ NgbModal,
+ NgbModalModule,
+ NgbOffcanvas,
+ NgbProgressbarModule,
+} from '@ng-bootstrap/ng-bootstrap'
+import { SharedDataService } from '../filter.service'
+import { QuillModule } from 'ngx-quill'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { CommonModule } from '@angular/common'
+
+@Component({
+ selector: 'email-compose',
+ standalone: true,
+ imports: [
+ NgbModalModule,
+ QuillModule,
+ NgbDropdownModule,
+ NgbProgressbarModule,
+ SimplebarAngularModule,
+ CommonModule,
+ ],
+ templateUrl: './compose.component.html',
+ styles: `
+ :host(email-compose) {
+ display: contents !important;
+ }
+ `,
+})
+export class ComposeComponent {
+ public sharedDataService = inject(SharedDataService)
+ private modalService = inject(NgbModal)
+ activeOffcanvas = inject(NgbOffcanvas)
+
+ ngOnInit() {}
+
+ updateData(key: string, type: string) {
+ this.sharedDataService.updateData(key, type)
+ }
+
+ open(content: TemplateRef) {
+ this.modalService.open(content, { size: 'lg', windowClass: 'compose-mail' })
+ }
+
+ editorConfig = {
+ toolbar: [
+ [{ font: [] }],
+ ['bold', 'italic', 'underline'],
+ [{ color: [] }],
+ [
+ { list: 'ordered' },
+ { list: 'bullet' },
+ { indent: '-1' },
+ { indent: '+1' },
+ ],
+ ['direction', { align: [] }],
+ ['link', 'image', 'video'],
+ ],
+ }
+}
diff --git a/apiferia/src/app/views/apps/email/components/detail/detail.component.html b/apiferia/src/app/views/apps/email/components/detail/detail.component.html
new file mode 100644
index 00000000..d9efd765
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/detail/detail.component.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
Hi Jorge, How are you?
+
+
+
+
+
+
+ 07:23 AM
+
Jonathan Smith
+ From: jonathan@domain.com
+
+
+
+
Hi Jorge...
+
+
+ Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean
+ commodo ligula eget dolor. Aenean massa. Cum sociis natoque
+ penatibus et magnis dis parturient montes, nascetur ridiculus mus.
+ Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
+
+
+ Nulla consequat massa quis enim. Donec pede justo, fringilla vel,
+ aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
+ imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede
+ mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum
+ semper nisi.
+
+
+ Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu,
+ consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in,
+ viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus
+ varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies
+ nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui.
+ Etiam rhoncus. Maecenas tempus, tellus eget condimentum rhoncus, sem
+ quam semper libero, sit amet adipiscing sem neque sed ipsum. Nam
+ quam nunc, blandit vel, luctus pulvinar,
+
+
+
+
+
+
+ Attachments (3)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Send
+
+
+
diff --git a/apiferia/src/app/views/apps/email/components/detail/detail.component.spec.ts b/apiferia/src/app/views/apps/email/components/detail/detail.component.spec.ts
new file mode 100644
index 00000000..855312ae
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/detail/detail.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { DetailComponent } from './detail.component'
+
+describe('DetailComponent', () => {
+ let component: DetailComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [DetailComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(DetailComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/email/components/detail/detail.component.ts b/apiferia/src/app/views/apps/email/components/detail/detail.component.ts
new file mode 100644
index 00000000..e3f3631e
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/detail/detail.component.ts
@@ -0,0 +1,48 @@
+import { Component, inject } from '@angular/core'
+import { FormsModule } from '@angular/forms'
+import {
+ NgbActiveOffcanvas,
+ NgbTooltipModule,
+} from '@ng-bootstrap/ng-bootstrap'
+import { QuillModule } from 'ngx-quill'
+import { SimplebarAngularModule } from 'simplebar-angular'
+
+@Component({
+ selector: 'app-detail',
+ standalone: true,
+ imports: [QuillModule, FormsModule, SimplebarAngularModule, NgbTooltipModule],
+ templateUrl: './detail.component.html',
+ styles: `
+ :host {
+ display: contents !important;
+ }
+ `,
+})
+export class DetailComponent {
+ activeOffcanvas = inject(NgbActiveOffcanvas)
+
+ content = `This is an Air-mode editable area.
+
+
+ Select a text to reveal the toolbar.
+ Edit rich document on-the-fly, so elastic!
+
+
+ End of air-mode area
`
+
+ editorConfig = {
+ toolbar: [
+ [{ font: [] }],
+ ['bold', 'italic', 'underline'],
+ [{ color: [] }],
+ [
+ { list: 'ordered' },
+ { list: 'bullet' },
+ { indent: '-1' },
+ { indent: '+1' },
+ ],
+ ['direction', { align: [] }],
+ ['link', 'image', 'video'],
+ ],
+ }
+}
diff --git a/apiferia/src/app/views/apps/email/components/email-list/email-list.component.html b/apiferia/src/app/views/apps/email/components/email-list/email-list.component.html
new file mode 100644
index 00000000..03ead25d
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/email-list/email-list.component.html
@@ -0,0 +1,210 @@
+
+ @if (emailTab == 'inbox') {
+
+ } @else {
+
+ }
+
+
+
+
+
+
Showing 1 - 20 of 289
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @if (emailTab == 'draft') {
+
+
+
You don't have any saved drafts.
+
+ Saving a draft allows you to keep a message you aren't ready to send
+ yet.
+
+
+
+ }
+ @if (emailTab == 'trash') {
+
+
+
+ Messages that have been in Trash more than 30 days will be
+ automatically deleted.
+ Empty Trash Now
+
+
+
+ }
+
+ @for (mail of emailList; track $index) {
+
+
+
+
+
+
+ @if (emailTab != 'isTrash') {
+
+ }
+
+ @if (emailTab == 'isTrash') {
+
+ }
+
{{ mail.sender }}
+
+
+
+ }
+
+
+
diff --git a/apiferia/src/app/views/apps/email/components/email-list/email-list.component.spec.ts b/apiferia/src/app/views/apps/email/components/email-list/email-list.component.spec.ts
new file mode 100644
index 00000000..378229a8
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/email-list/email-list.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { EmailListComponent } from './email-list.component'
+
+describe('EmailListComponent', () => {
+ let component: EmailListComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [EmailListComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(EmailListComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/email/components/email-list/email-list.component.ts b/apiferia/src/app/views/apps/email/components/email-list/email-list.component.ts
new file mode 100644
index 00000000..0ee57016
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/email-list/email-list.component.ts
@@ -0,0 +1,60 @@
+import { Component, inject, type OnInit } from '@angular/core'
+import { emailData } from '../../data'
+import { CommonModule } from '@angular/common'
+import {
+ NgbDropdownModule,
+ NgbNavModule,
+ NgbOffcanvas,
+ type NgbNavChangeEvent,
+} from '@ng-bootstrap/ng-bootstrap'
+import { SharedDataService } from '../filter.service'
+import { DetailComponent } from '../detail/detail.component'
+
+@Component({
+ selector: 'email-list',
+ standalone: true,
+ imports: [CommonModule, NgbNavModule, NgbDropdownModule],
+ templateUrl: './email-list.component.html',
+ styles: ``,
+})
+export class EmailListComponent implements OnInit {
+ emailList = emailData
+ emailTab!: string
+ public sharedDataService = inject(SharedDataService)
+ public offcanvasService = inject(NgbOffcanvas)
+
+ ngOnInit(): void {
+ this.sharedDataService.key$.subscribe((data) => {
+ this.emailTab = data?.key!
+ if (data && data.type == 'label' && data.key) {
+ this.emailList = emailData.filter((item) => item.type == data.key)
+ } else if (data && data.type == 'type' && data.key != 'inbox') {
+ this.emailList = emailData.filter(
+ (item) => (item as any)[data.key] === true
+ )
+ } else {
+ this.emailList = emailData
+ }
+ })
+ this.emailTab = 'inbox'
+ }
+
+ typeFilter(event: NgbNavChangeEvent) {
+ if (event.nextId == 'primary') {
+ this.emailList = emailData
+ } else {
+ this.emailList = emailData.filter((item) => item.type == event.nextId)
+ }
+ }
+
+ openDetail() {
+ const divContainer = document.getElementById('detailDiv')!
+ this.offcanvasService.open(DetailComponent, {
+ panelClass: 'mail-read position-absolute shadow show',
+ backdrop: false,
+ position: 'end',
+ container: divContainer,
+ scroll: true,
+ })
+ }
+}
diff --git a/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.html b/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.html
new file mode 100644
index 00000000..a8eac532
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.html
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ More
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.spec.ts b/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.spec.ts
new file mode 100644
index 00000000..1fe9ff28
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { EmailTopbarComponent } from './email-topbar.component'
+
+describe('EmailTopbarComponent', () => {
+ let component: EmailTopbarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [EmailTopbarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(EmailTopbarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.ts b/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.ts
new file mode 100644
index 00000000..f121d7af
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/email-topbar/email-topbar.component.ts
@@ -0,0 +1,22 @@
+import { Component, inject } from '@angular/core'
+import { EmailListComponent } from '../email-list/email-list.component'
+import {
+ NgbDropdownModule,
+ NgbOffcanvas,
+ NgbTooltipModule,
+} from '@ng-bootstrap/ng-bootstrap'
+import { ComposeComponent } from '../compose/compose.component'
+
+@Component({
+ selector: 'email-topbar',
+ standalone: true,
+ imports: [EmailListComponent, NgbDropdownModule, NgbTooltipModule],
+ templateUrl: './email-topbar.component.html',
+ styles: ``,
+})
+export class EmailTopbarComponent {
+ private offcanvasService = inject(NgbOffcanvas)
+ openSidebar() {
+ this.offcanvasService.open(ComposeComponent)
+ }
+}
diff --git a/apiferia/src/app/views/apps/email/components/filter.service.ts b/apiferia/src/app/views/apps/email/components/filter.service.ts
new file mode 100644
index 00000000..1b31de98
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/components/filter.service.ts
@@ -0,0 +1,21 @@
+import { Injectable } from '@angular/core'
+import { BehaviorSubject } from 'rxjs'
+import type { EmailType } from '../data'
+
+type EmailKey = keyof EmailType | string
+
+@Injectable({
+ providedIn: 'root',
+})
+export class SharedDataService {
+ private keySubject = new BehaviorSubject<{
+ key: EmailKey
+ type: string
+ } | null>(null)
+ public key$ = this.keySubject.asObservable()
+
+ updateData(key: EmailKey, type: string) {
+ const newData = { key: key, type: type }
+ this.keySubject.next(newData)
+ }
+}
diff --git a/apiferia/src/app/views/apps/email/data.ts b/apiferia/src/app/views/apps/email/data.ts
new file mode 100644
index 00000000..934bedea
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/data.ts
@@ -0,0 +1,218 @@
+export type EmailType = {
+ id: string
+ sender: string
+ subject: string
+ message: string
+ date: string
+ status: string
+ isStarred: boolean
+ isImportant: boolean
+ isSent: boolean
+ isTrash: boolean
+ attachType?: string
+ attachments?: string[]
+ badge?: string
+ type: string
+}
+
+export const emailData: EmailType[] = [
+ {
+ id: 'InboxChk1',
+ sender: 'Daniel J. Olsen',
+ subject:
+ 'Lucas Kriebel (@Daniel J. Olsen) has sent you a direct message on Twitter!',
+ message:
+ '@Daniel J. Olsen - Very cool :) Nicklas, You have a new direct message.',
+ date: '11:49 am',
+ status: 'unread',
+ isStarred: false,
+ isImportant: true,
+ isSent: false,
+ isTrash: false,
+ type: 'social',
+ },
+ {
+ id: 'InboxChk2',
+ sender: 'Jack P. Roldan',
+ subject: 'Images',
+ message: '',
+ attachType: 'image',
+ attachments: ['IMG_201', 'IMG_202', 'IMG_203'],
+ badge: '+5',
+ date: 'Feb 21',
+ status: 'read',
+ isStarred: true,
+ isImportant: true,
+ isSent: true,
+ isTrash: true,
+ type: 'promotions',
+ },
+ {
+ id: 'InboxChk3',
+ sender: 'Betty C. Cox (11)',
+ subject: 'Train/Bus',
+ message:
+ "Yes ok, great! I'm not stuck in Stockholm anymore, we're making progress.",
+ date: 'Feb 19',
+ status: 'read',
+ isStarred: false,
+ isImportant: false,
+ isSent: false,
+ isTrash: false,
+ type: 'updates',
+ },
+ {
+ id: 'InboxChk4',
+ sender: 'Medium',
+ subject: "This Week's Top Stories",
+ message:
+ "Our top pick for you on Medium this week The Man Who Destroyed America's Ego",
+ date: 'Feb 28',
+ status: 'unread',
+ isStarred: false,
+ isImportant: false,
+ isSent: true,
+ isTrash: true,
+ type: 'forums',
+ },
+ {
+ id: 'InboxChk5',
+ sender: 'Death to Stock',
+ subject: '(no subject)',
+ message: '',
+ attachType: 'pdf',
+ attachments: ['dashboard.pdf', 'pages-data.pdf'],
+ date: 'Feb 28',
+ status: 'read',
+ isStarred: true,
+ isImportant: false,
+ isSent: false,
+ isTrash: false,
+ type: 'social',
+ },
+ {
+ id: 'InboxChk6',
+ sender: 'Revibe',
+ subject: '(no subject)',
+ message: '',
+ attachType: 'doc',
+ attachments: ['doc1.doc', 'doc2.doc', 'doc3.doc', 'doc4.doc'],
+ date: 'Feb 27',
+ status: 'read',
+ isStarred: false,
+ isImportant: true,
+ isSent: false,
+ isTrash: true,
+ type: 'promotions',
+ },
+ {
+ id: 'InboxChk7',
+ sender: 'Erik, me (5)',
+ subject: 'Regarding our meeting',
+ message: "That's great, see you on Thursday!",
+ date: 'Feb 24',
+ status: 'read',
+ isStarred: true,
+ isImportant: false,
+ isSent: true,
+ isTrash: false,
+ type: 'social',
+ },
+ {
+ id: 'InboxChk8',
+ sender: 'KanbanFlow',
+ subject: "Task assigned: Clone ARP's website",
+ message: 'You have been assigned a task by Alex@Work on the board Web.',
+ date: 'Feb 24',
+ status: 'read',
+ isStarred: true,
+ isImportant: false,
+ isSent: true,
+ isTrash: false,
+ type: 'updates',
+ },
+ {
+ id: 'InboxChk9',
+ sender: 'Tobias Berggren',
+ subject: "Let's go fishing!",
+ message:
+ "Hey, You wanna join me and Fred at the lake tomorrow? It'll be awesome.",
+ date: 'Feb 23',
+ status: 'read',
+ isStarred: false,
+ isImportant: true,
+ isSent: true,
+ isTrash: false,
+ type: 'updates',
+ },
+ {
+ id: 'InboxChk10',
+ sender: 'Charukaw, me (7)',
+ subject: 'Hey man',
+ message: "Nah man sorry i don't. Should i get it?",
+ date: 'Feb 23',
+ status: 'read',
+ isStarred: true,
+ isImportant: true,
+ isSent: true,
+ isTrash: false,
+ type: 'forums',
+ },
+ {
+ id: 'InboxChk11',
+ sender: 'Stack Exchange',
+ subject: '1 new items in your Stackexchange inbox',
+ message:
+ 'The following items were added to your Stack Exchange global inbox since you last checked it.',
+ date: 'Feb 21',
+ status: 'read',
+ isStarred: true,
+ isImportant: false,
+ isSent: true,
+ isTrash: true,
+ type: 'social',
+ },
+ {
+ id: 'InboxChk12',
+ sender: 'Google Drive Team',
+ subject: 'You can now use your storage in Google Drive',
+ message:
+ 'Hey Nicklas Sandell! Thank you for purchasing extra storage space in Google Drive.',
+ date: 'Feb 20',
+ status: 'read',
+ isStarred: true,
+ isImportant: false,
+ isSent: false,
+ isTrash: true,
+ type: 'promotions',
+ },
+ {
+ id: 'InboxChk13',
+ sender: 'Peter, me (3)',
+ subject: 'Hello',
+ message:
+ 'Trip home from Colombo has been arranged, then Jenna will come get me from Stockholm. :)',
+ date: 'Mar 6',
+ status: 'read',
+ isStarred: false,
+ isImportant: true,
+ isSent: true,
+ isTrash: true,
+ type: 'updates',
+ },
+ {
+ id: 'InboxChk14',
+ sender: 'me, Susanna (7)',
+ subject:
+ "Since you asked... and i'm inconceivably bored at the train station",
+ message:
+ "Alright thanks. I'll have to re-book that somehow, i'll get back to you.",
+ date: 'Mar 6',
+ status: 'read',
+ isStarred: false,
+ isImportant: false,
+ isSent: false,
+ isTrash: true,
+ type: 'forums',
+ },
+]
diff --git a/apiferia/src/app/views/apps/email/email.component.html b/apiferia/src/app/views/apps/email/email.component.html
new file mode 100644
index 00000000..d2319344
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/email.component.html
@@ -0,0 +1,18 @@
+
+
+
diff --git a/apiferia/src/app/views/apps/email/email.component.spec.ts b/apiferia/src/app/views/apps/email/email.component.spec.ts
new file mode 100644
index 00000000..b62bc85d
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/email.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { EmailComponent } from './email.component'
+
+describe('EmailComponent', () => {
+ let component: EmailComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [EmailComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(EmailComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/email/email.component.ts b/apiferia/src/app/views/apps/email/email.component.ts
new file mode 100644
index 00000000..7e3c2293
--- /dev/null
+++ b/apiferia/src/app/views/apps/email/email.component.ts
@@ -0,0 +1,14 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component } from '@angular/core'
+import { ComposeComponent } from './components/compose/compose.component'
+import { EmailListComponent } from './components/email-list/email-list.component'
+import { EmailTopbarComponent } from './components/email-topbar/email-topbar.component'
+
+@Component({
+ selector: 'app-email',
+ standalone: true,
+ imports: [PageTitleComponent, ComposeComponent, EmailTopbarComponent],
+ templateUrl: './email.component.html',
+ styles: ``,
+})
+export class EmailComponent {}
diff --git a/apiferia/src/app/views/apps/social/components/event/event.component.html b/apiferia/src/app/views/apps/social/components/event/event.component.html
new file mode 100644
index 00000000..a7722af5
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/event/event.component.html
@@ -0,0 +1,41 @@
+
+
+ @for (data of events; track $index) {
+
+
+
+
+
+ {{ data.date }}
+
+
+
+ {{ data.location }}
+
+
+
+
+
+ }
+
+
diff --git a/apiferia/src/app/views/apps/social/components/event/event.component.spec.ts b/apiferia/src/app/views/apps/social/components/event/event.component.spec.ts
new file mode 100644
index 00000000..2831bedb
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/event/event.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { EventComponent } from './event.component'
+
+describe('EventComponent', () => {
+ let component: EventComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [EventComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(EventComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/event/event.component.ts b/apiferia/src/app/views/apps/social/components/event/event.component.ts
new file mode 100644
index 00000000..2cae9bce
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/event/event.component.ts
@@ -0,0 +1,13 @@
+import { Component } from '@angular/core'
+import { EventList } from '../../data'
+
+@Component({
+ selector: 'social-event',
+ standalone: true,
+ imports: [],
+ templateUrl: './event.component.html',
+ styles: ``,
+})
+export class EventComponent {
+ events = EventList
+}
diff --git a/apiferia/src/app/views/apps/social/components/feed/feed.component.html b/apiferia/src/app/views/apps/social/components/feed/feed.component.html
new file mode 100644
index 00000000..46337704
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/feed/feed.component.html
@@ -0,0 +1,438 @@
+
+
+
+
+
+
Create Post
+
+
+
+
+
+
+
+
+
+
+ @for (feed of feedList; track $index) {
+
+
+
+
+
+
+
+
+
+ {{ feed.timestamp }}
+
+
+
+
+
+
+ {{ feed.content }}
+
+
+ @if (feed.images) {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+
+ @if (feed.video) {
+
+ }
+
+
+
+ @if (feed.commentList) {
+
+ }
+
+ @if (feed.isReply) {
+
+
+
+
+
+
+ }
+
+
+ }
+
+
+
+ Loading
+
+
diff --git a/apiferia/src/app/views/apps/social/components/feed/feed.component.spec.ts b/apiferia/src/app/views/apps/social/components/feed/feed.component.spec.ts
new file mode 100644
index 00000000..4219f215
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/feed/feed.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { FeedComponent } from './feed.component'
+
+describe('FeedComponent', () => {
+ let component: FeedComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [FeedComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(FeedComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/feed/feed.component.ts b/apiferia/src/app/views/apps/social/components/feed/feed.component.ts
new file mode 100644
index 00000000..6d40e8e9
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/feed/feed.component.ts
@@ -0,0 +1,23 @@
+import { ChangeDetectionStrategy, Component, inject } from '@angular/core'
+import { FeedData, FriendRequest } from '../../data'
+import { NgbDropdownModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'
+import { DomSanitizer, type SafeResourceUrl } from '@angular/platform-browser'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'social-feed',
+ standalone: true,
+ imports: [NgbDropdownModule, NgbTooltipModule, RouterLink],
+ templateUrl: './feed.component.html',
+ styles: ``,
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class FeedComponent {
+ feedList = FeedData
+
+ private sanitizer = inject(DomSanitizer)
+
+ sanitizeUrl(url: string): SafeResourceUrl {
+ return this.sanitizer.bypassSecurityTrustResourceUrl(url)
+ }
+}
diff --git a/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.html b/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.html
new file mode 100644
index 00000000..db1dd882
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.html
@@ -0,0 +1,152 @@
+
+
+
+
+ All Friends
+
+
+
+ @for (friend of friendList; track $index) {
+
+
+
+
+
+
+
+
+
+
+ {{ friend.mutual > 0 ? friend.mutual : 'no' }} mutual
+ friends
+
+
+
+
+
+
+ }
+
+
+
+
+
+
+ Pending Requests ({{ pendingList.length }})
+
+
+
+ @for (friend of pendingList; track $index) {
+
+
+
+
+
+
+
+
+
+
+ {{ friend.mutual > 0 ? friend.mutual : 'no' }} mutual
+ friends
+
+
+
+
+
+
+ }
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.spec.ts b/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.spec.ts
new file mode 100644
index 00000000..7ea9c685
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { FriendFeedComponent } from './friend-feed.component'
+
+describe('FriendFeedComponent', () => {
+ let component: FriendFeedComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [FriendFeedComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(FriendFeedComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.ts b/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.ts
new file mode 100644
index 00000000..505d4ab3
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/friend-feed/friend-feed.component.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core'
+import { FriendRequest, PendingRequest } from '../../data'
+import { NgbDropdownModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'social-friend-feed',
+ standalone: true,
+ imports: [NgbDropdownModule, NgbNavModule],
+ templateUrl: './friend-feed.component.html',
+ styles: ``,
+})
+export class FriendFeedComponent {
+ friendList = FriendRequest
+ pendingList = PendingRequest
+}
diff --git a/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.html b/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.html
new file mode 100644
index 00000000..b5112db9
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.html
@@ -0,0 +1,93 @@
+
+
+
Friends
+
+
+
+
Pending Request (2)
+
+ @for (request of pendingRequestList; track $index; let last = $last) {
+
+ @if (!last) {
+
+ }
+ }
+
+
+
Friends Request
+
+ @for (request of friendRequestList; track $index; let last = $last) {
+
+
+
+
+
+
+
+
+ {{ request.mutual > 0 ? request.mutual : 'no' }} mutual friends
+
+
+
+ }
+
+
+
diff --git a/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.spec.ts b/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.spec.ts
new file mode 100644
index 00000000..d4d18b9c
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { FriendListComponent } from './friend-list.component'
+
+describe('FriendListComponent', () => {
+ let component: FriendListComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [FriendListComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(FriendListComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.ts b/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.ts
new file mode 100644
index 00000000..6f607fff
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/friend-list/friend-list.component.ts
@@ -0,0 +1,21 @@
+import { Component } from '@angular/core'
+import { FriendRequest, PendingRequest } from '../../data'
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+import { CommonModule } from '@angular/common'
+import { SimplebarAngularModule } from 'simplebar-angular'
+
+@Component({
+ selector: 'social-friend-list',
+ standalone: true,
+ imports: [NgbDropdownModule, CommonModule, SimplebarAngularModule],
+ templateUrl: './friend-list.component.html',
+ styles: `
+ :host {
+ display: contents !important;
+ }
+ `,
+})
+export class FriendListComponent {
+ pendingRequestList = PendingRequest
+ friendRequestList = FriendRequest.slice(0, 5)
+}
diff --git a/apiferia/src/app/views/apps/social/components/groups/groups.component.html b/apiferia/src/app/views/apps/social/components/groups/groups.component.html
new file mode 100644
index 00000000..7b3833c7
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/groups/groups.component.html
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
Groups you have joined
+
+ @for (join of joinedGroup; track $index) {
+
+
+
+
+
+
+ }
+
+
+
+ Create New Group
+
+
+
+
+
+ @for (group of groupList; track $index) {
+
+ }
+
+
Friends Group
+
+ @for (friend of friendsGroup; track $index) {
+
+ }
+
+
Suggested For You
+
+ @for (data of suggestedGroup; track $index) {
+
+ }
+
+
diff --git a/apiferia/src/app/views/apps/social/components/groups/groups.component.spec.ts b/apiferia/src/app/views/apps/social/components/groups/groups.component.spec.ts
new file mode 100644
index 00000000..7ce6a410
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/groups/groups.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { GroupsComponent } from './groups.component'
+
+describe('GroupsComponent', () => {
+ let component: GroupsComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [GroupsComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(GroupsComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/groups/groups.component.ts b/apiferia/src/app/views/apps/social/components/groups/groups.component.ts
new file mode 100644
index 00000000..86eb27a7
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/groups/groups.component.ts
@@ -0,0 +1,23 @@
+import { Component } from '@angular/core'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import {
+ friendsGroup,
+ groupList,
+ joinedGroup,
+ suggestedGroup,
+} from '../../data'
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'social-groups',
+ standalone: true,
+ imports: [SimplebarAngularModule, NgbDropdownModule],
+ templateUrl: './groups.component.html',
+ styles: ``,
+})
+export class GroupsComponent {
+ groupList = groupList
+ friendsGroup = friendsGroup
+ suggestedGroup = suggestedGroup
+ joinedGroup = joinedGroup
+}
diff --git a/apiferia/src/app/views/apps/social/components/memories/memories.component.html b/apiferia/src/app/views/apps/social/components/memories/memories.component.html
new file mode 100644
index 00000000..b59bf586
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/memories/memories.component.html
@@ -0,0 +1,731 @@
+
+
+
+
+
+
+
+
+
+
+
+ about 2 minuts ago
+
+
+
+
+
+
Story based around the idea of time lapse, animation to post soon!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Martin R. Peters
+
+ Post: 07 Feb, 2021 06:00AM
+
+
+
+
+
+
+
+
+
+
+ The quick, brown fox jumps over a lazy dog. DJs flock by when MTV ax
+ quiz prog. Junk MTV quiz graced by fox whelps. Bawds jog, flick
+ quartz, vex nymphs.
+
+
+
+
+
+
+
+
+
DJs flock
+
+ One morning, when Gregor Samsa woke from troubled dreams, he
+ found himself transformed in his bed into a horrible vermin.
+ He lay on his armour-like back, and if he lifted his head.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UI / UX Design Tutorial – Wireframe, Mockup & Design in Figma
+
+
1 days ago
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Tour the Harvard Law School Library
+
1 days ago
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How to Chair a Meeting Well - Part 1
+
3 days ago
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Travelling through North East India
+
3 days ago
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/social/components/memories/memories.component.spec.ts b/apiferia/src/app/views/apps/social/components/memories/memories.component.spec.ts
new file mode 100644
index 00000000..a4f0736e
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/memories/memories.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { MemoriesComponent } from './memories.component'
+
+describe('MemoriesComponent', () => {
+ let component: MemoriesComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [MemoriesComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(MemoriesComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/memories/memories.component.ts b/apiferia/src/app/views/apps/social/components/memories/memories.component.ts
new file mode 100644
index 00000000..3250da10
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/memories/memories.component.ts
@@ -0,0 +1,12 @@
+import { Component } from '@angular/core'
+import { RouterLink } from '@angular/router'
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'social-memories',
+ standalone: true,
+ imports: [NgbDropdownModule, RouterLink],
+ templateUrl: './memories.component.html',
+ styles: ``,
+})
+export class MemoriesComponent {}
diff --git a/apiferia/src/app/views/apps/social/components/saved/saved.component.html b/apiferia/src/app/views/apps/social/components/saved/saved.component.html
new file mode 100644
index 00000000..605cfa5d
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/saved/saved.component.html
@@ -0,0 +1,742 @@
+
+
+
+
+
+
+
+
+
2 Photos
+
+ Post by
+ Sharlene H. Smith
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1 Photo
+
+ Post by
+ Victoria P. Miller
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Thought of the Day
+
+ Post by
+ Dallas C. Payne
+
+
+
+
+
+
+
+ “Not only must we be good, but we must also be good for something.”
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Video
+
+ Post by
+ Florence A. Lopez
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Bernadette
+
5 hours ago
+
+
+
+
+
+
Cant go wrong with Bernadette Clothes
+
Affordable Price and Top Quality
+
COD Available, 10 days return policy
+
#Clothes #Trendy #Shirts
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Vanessa Mall
+
5 hours ago
+
+
+
+
+
+
Cant go wrong with Vanessa Mall
+
Affordable Price and Top Quality
+
COD Available, no return policy
+
#Grocery #HomeMaterial #Foods #Market
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Bat Cave, North Carolina.
+
5 hours ago
+
+
+
+
+
+
Land of elves in Norse mythology.
+
The "otherworld" of Welsh mythology.
+
The city in which King Arthur reigned.
+
#Travelling #Nature
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Eternal Library
+
5 hours ago
+
+
+
+
+
+
Academic Library
+
Special Library.
+
Public Library.
+
#LoveReading #Book
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/social/components/saved/saved.component.spec.ts b/apiferia/src/app/views/apps/social/components/saved/saved.component.spec.ts
new file mode 100644
index 00000000..c9143164
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/saved/saved.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SavedComponent } from './saved.component'
+
+describe('SavedComponent', () => {
+ let component: SavedComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SavedComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SavedComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/saved/saved.component.ts b/apiferia/src/app/views/apps/social/components/saved/saved.component.ts
new file mode 100644
index 00000000..d1152303
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/saved/saved.component.ts
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core'
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'social-saved',
+ standalone: true,
+ imports: [NgbDropdownModule],
+ templateUrl: './saved.component.html',
+ styles: ``,
+})
+export class SavedComponent {}
diff --git a/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.html b/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.html
new file mode 100644
index 00000000..0897e8b9
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.html
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+ {{ profileDetail.name }}
+
+
+ {{ profileDetail.location }}
+
+
+ {{ profileDetail.about }}
+
+
+
+
+
+
{{ profileDetail.post }}
+ Post
+
+
+
{{ profileDetail.followers }}
+ Followers
+
+
+
{{ profileDetail.following }}
+ Following
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.spec.ts b/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.spec.ts
new file mode 100644
index 00000000..bb6c7a6c
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SocialMenuComponent } from './social-menu.component'
+
+describe('SocialMenuComponent', () => {
+ let component: SocialMenuComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SocialMenuComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SocialMenuComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.ts b/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.ts
new file mode 100644
index 00000000..c000cb0e
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/components/social-menu/social-menu.component.ts
@@ -0,0 +1,37 @@
+import {
+ Component,
+ EventEmitter,
+ inject,
+ Input,
+ Output,
+ type OnInit,
+} from '@angular/core'
+import { EventData, ProfileDetail } from '../../data'
+import { CommonModule } from '@angular/common'
+import { SharedService } from '../../shared.service'
+
+@Component({
+ selector: 'social-menu',
+ standalone: true,
+ imports: [CommonModule],
+ templateUrl: './social-menu.component.html',
+ styles: ``,
+})
+export class SocialMenuComponent implements OnInit {
+ profileDetail = ProfileDetail
+ eventList = EventData
+
+ activeTab: string = 'feed'
+
+ public sharedService = inject(SharedService)
+
+ ngOnInit(): void {
+ this.sharedService.activeTab$.subscribe((tab) => {
+ this.activeTab = tab
+ })
+ }
+
+ changeTab(tab: string) {
+ this.sharedService.setActiveTab(tab)
+ }
+}
diff --git a/apiferia/src/app/views/apps/social/data.ts b/apiferia/src/app/views/apps/social/data.ts
new file mode 100644
index 00000000..adeffc34
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/data.ts
@@ -0,0 +1,316 @@
+import { currentYear } from '@/app/common/constants'
+
+export type ProfileType = {
+ image: string
+ name: string
+ location: string
+ about: string
+ post: number
+ followers: string
+ following: number
+}
+
+export type EventType = {
+ icon?: string
+ image?: string
+ title: string
+ date?: string
+ location?: string
+}
+
+export type FriendRequestType = {
+ profile: string
+ name: string
+ mutual: number
+}
+
+export type CommentType = {
+ author: string
+ avatar: string
+ timestamp: string
+ comment: string
+ like?: number
+ children?: CommentType[]
+}
+
+export type FeedType = {
+ author: string
+ avatar: string
+ timestamp: string
+ content: string
+ likes?: string
+ comments?: number
+ images?: string[]
+ commentList?: CommentType[]
+ views?: string
+ video?: string
+ isReply?: boolean
+}
+
+export type GroupType = {
+ image: string
+ title: string
+ caption?: string
+ member?: string
+}
+
+export const ProfileDetail: ProfileType = {
+ image: 'assets/images/users/avatar-1.jpg',
+ name: 'Gatson Keller',
+ location: 'California, USA',
+ about:
+ "Hi I'm Cynthia Price,has been the industry's standard dummy text To an English person.",
+ post: 389,
+ followers: '5K',
+ following: 210,
+}
+
+export const EventData: EventType[] = [
+ {
+ icon: 'bx-cake',
+ title: "Aarya's birthday today",
+ },
+ {
+ icon: 'bx-heart',
+ title: "Penda's wedding tomorrow",
+ },
+ {
+ icon: 'bx-bookmark',
+ title: 'Meeting with Big B',
+ },
+]
+
+export const FeedData: FeedType[] = [
+ {
+ author: 'Jeremy Tomlinson',
+ avatar: 'assets/images/users/avatar-3.jpg',
+ timestamp: 'about 2 minutes ago',
+ content:
+ 'Story based around the idea of time lapse, animation to post soon!',
+ images: [
+ 'assets/images/app-social/post-1.jpg',
+ 'assets/images/app-social/post-2.jpg',
+ 'assets/images/app-social/post-4.jpg',
+ 'assets/images/app-social/post-3.jpg',
+ ],
+ likes: '1.5k',
+ comments: 521,
+ isReply: true,
+ },
+ {
+ author: 'Thelma Fridley',
+ avatar: 'assets/images/users/avatar-4.jpg',
+ timestamp: 'about 1 hour ago',
+ content:
+ '🌟✨ Just spent the most amazing weekend camping in the wilderness! 🏕️🌲 Nothing beats disconnecting from the hustle and bustle of city life and reconnecting with nature.',
+ likes: '1.5k',
+ comments: 521,
+ commentList: [
+ {
+ author: 'Jeremy Tomlinson',
+ avatar: 'assets/images/users/avatar-3.jpg',
+ timestamp: '3 hours ago',
+ comment: 'Nice work, makes me think of The Money Pit.',
+ like: 2,
+ children: [
+ {
+ author: 'Kathleen Thomas',
+ avatar: 'assets/images/users/avatar-4.jpg',
+ timestamp: '5 hours ago',
+ comment:
+ "i'm in the middle of a timelapse animation myself! (Very different though.) Awesome stuff.",
+ },
+ ],
+ },
+ ],
+ },
+ {
+ author: 'Jonathan Tiner',
+ avatar: 'assets/images/users/avatar-6.jpg',
+ timestamp: 'about 11 hour ago',
+ content:
+ 'The parallax is a little odd but O.o that house build is awesome!!',
+ video: 'https://player.vimeo.com/video/87993762',
+ views: '3.5k',
+ comments: 521,
+ },
+]
+
+export const PendingRequest: FriendRequestType[] = [
+ {
+ profile: 'assets/images/users/avatar-2.jpg',
+ name: 'Daniel J. Olsen',
+ mutual: 46,
+ },
+ {
+ profile: 'assets/images/users/avatar-3.jpg',
+ name: 'Jack P. Roldan',
+ mutual: 23,
+ },
+]
+
+export const FriendRequest: FriendRequestType[] = [
+ {
+ profile: 'assets/images/users/avatar-5.jpg',
+ name: 'Victoria P. Miller',
+ mutual: 0,
+ },
+ {
+ profile: 'assets/images/users/avatar-6.jpg',
+ name: 'Dallas C. Payne',
+ mutual: 856,
+ },
+ {
+ profile: 'assets/images/users/avatar-7.jpg',
+ name: 'Florence A. Lopez',
+ mutual: 52,
+ },
+ {
+ profile: 'assets/images/users/avatar-8.jpg',
+ name: 'Gail A. Nix',
+ mutual: 12,
+ },
+ {
+ profile: 'assets/images/users/avatar-9.jpg',
+ name: 'Lynne J. Petty',
+ mutual: 0,
+ },
+ {
+ profile: 'assets/images/users/avatar-5.jpg',
+ name: 'Victoria P. Miller',
+ mutual: 0,
+ },
+ {
+ profile: 'assets/images/users/avatar-6.jpg',
+ name: 'Dallas C. Payne',
+ mutual: 856,
+ },
+ {
+ profile: 'assets/images/users/avatar-7.jpg',
+ name: 'Florence A. Lopez',
+ mutual: 52,
+ },
+ {
+ profile: 'assets/images/users/avatar-8.jpg',
+ name: 'Gail A. Nix',
+ mutual: 12,
+ },
+ {
+ profile: 'assets/images/users/avatar-9.jpg',
+ name: 'Lynne J. Petty',
+ mutual: 0,
+ },
+]
+
+export const EventList: EventType[] = [
+ {
+ image: 'assets/images/app-social/group-2.jpg',
+ date: 'Fri 22 - 26 oct, ' + currentYear,
+ title: 'Musical Event : Des Moines',
+ location: '4436 Southern Avenue, Iowa-50309',
+ },
+ {
+ image: 'assets/images/app-social/group-5.jpg',
+ date: 'Fri 22 - 26 oct, ' + currentYear,
+ title: 'Antisocial Darwinism : Evansville',
+ location: '1265 Lucy Lane, Indiana-47710',
+ },
+ {
+ image: 'assets/images/app-social/group-6.jpg',
+ date: 'Fri 22 - 26 oct, ' + currentYear,
+ title: 'Balls of the Bull Festival : Dallas',
+ location: '1422 Liberty Street, Texas-75204',
+ },
+ {
+ image: 'assets/images/app-social/group-7.jpg',
+ date: 'Fri 22 - 26 oct, ' + currentYear,
+ title: 'Belch Blanket Babylon : LA Follette',
+ location: '2542 Cedar Street, Tennessee-37766',
+ },
+]
+
+export const groupList: GroupType[] = [
+ {
+ image: 'assets/images/app-social/group-7.jpg',
+ title: 'UI / UX Design',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+ {
+ image: 'assets/images/app-social/group-8.jpg',
+ title: 'Travelling The World',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+ {
+ image: 'assets/images/app-social/group-9.jpg',
+ title: 'Music Circle',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+]
+
+export const friendsGroup: GroupType[] = [
+ {
+ image: 'assets/images/app-social/group-1.jpg',
+ title: 'Interior Design & Architech',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+ {
+ image: 'assets/images/app-social/group-2.jpg',
+ title: 'Event Management',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+ {
+ image: 'assets/images/app-social/group-5.jpg',
+ title: 'Commercial University, Daryaganj, Delhi.',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+ {
+ image: 'assets/images/app-social/group-6.jpg',
+ title: 'Tourist Place of Potland',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+]
+
+export const suggestedGroup: GroupType[] = [
+ {
+ image: 'assets/images/app-social/group-3.jpg',
+ title: 'Promote Your Business',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+ {
+ image: 'assets/images/app-social/group-4.jpg',
+ title: 'The Greasy Mullets',
+ caption:
+ "Some quick example text to build on the card title and make up the bulk of the card's content.",
+ },
+]
+
+export const joinedGroup: GroupType[] = [
+ {
+ image: 'assets/images/app-social/group-6.jpg',
+ title: 'Tourist Place of Portland',
+ member: '2K+ members',
+ },
+ {
+ image: 'assets/images/app-social/group-7.jpg',
+ title: 'UI / UX Design',
+ member: '1.4K members',
+ },
+ {
+ image: 'assets/images/app-social/group-8.jpg',
+ title: 'Travelling The World',
+ member: '23M members',
+ },
+ {
+ image: 'assets/images/app-social/group-9.jpg',
+ title: 'Music Circle',
+ member: '26K members',
+ },
+]
diff --git a/apiferia/src/app/views/apps/social/shared.service.ts b/apiferia/src/app/views/apps/social/shared.service.ts
new file mode 100644
index 00000000..ad2325e0
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/shared.service.ts
@@ -0,0 +1,14 @@
+import { Injectable } from '@angular/core'
+import { BehaviorSubject } from 'rxjs'
+
+@Injectable({
+ providedIn: 'root',
+})
+export class SharedService {
+ private activeTabSubject = new BehaviorSubject('feed')
+ activeTab$ = this.activeTabSubject.asObservable()
+
+ setActiveTab(tab: string) {
+ this.activeTabSubject.next(tab)
+ }
+}
diff --git a/apiferia/src/app/views/apps/social/social.component.html b/apiferia/src/app/views/apps/social/social.component.html
new file mode 100644
index 00000000..29ab51e5
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/social.component.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Gatson Keller
+
+
+
+
+
+
+
+
+ @if (activeTab == 'feed') {
+
+ }
+ @if (activeTab == 'friends') {
+
+ }
+ @if (activeTab == 'events') {
+
+ }
+ @if (activeTab == 'groups') {
+
+ }
+ @if (activeTab == 'saved') {
+
+ }
+ @if (activeTab == 'memories') {
+
+ }
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/social/social.component.spec.ts b/apiferia/src/app/views/apps/social/social.component.spec.ts
new file mode 100644
index 00000000..8636628f
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/social.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SocialComponent } from './social.component'
+
+describe('SocialComponent', () => {
+ let component: SocialComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SocialComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SocialComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/social/social.component.ts b/apiferia/src/app/views/apps/social/social.component.ts
new file mode 100644
index 00000000..1d72d680
--- /dev/null
+++ b/apiferia/src/app/views/apps/social/social.component.ts
@@ -0,0 +1,57 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component, inject, Input, type OnInit } from '@angular/core'
+import { NgbNavModule, NgbOffcanvas } from '@ng-bootstrap/ng-bootstrap'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { EventComponent } from './components/event/event.component'
+import { FeedComponent } from './components/feed/feed.component'
+import { FriendFeedComponent } from './components/friend-feed/friend-feed.component'
+import { FriendListComponent } from './components/friend-list/friend-list.component'
+import { GroupsComponent } from './components/groups/groups.component'
+import { MemoriesComponent } from './components/memories/memories.component'
+import { SavedComponent } from './components/saved/saved.component'
+import { SocialMenuComponent } from './components/social-menu/social-menu.component'
+import { SharedService } from './shared.service'
+
+@Component({
+ selector: 'app-social',
+ standalone: true,
+ imports: [
+ PageTitleComponent,
+ FeedComponent,
+ FriendListComponent,
+ NgbNavModule,
+ FriendFeedComponent,
+ EventComponent,
+ GroupsComponent,
+ SavedComponent,
+ MemoriesComponent,
+ SimplebarAngularModule,
+ SocialMenuComponent,
+ ],
+ templateUrl: './social.component.html',
+ styles: ``,
+})
+export class SocialComponent implements OnInit {
+ activeTab: string = 'feed'
+
+ public offcanvasService = inject(NgbOffcanvas)
+ public sharedService = inject(SharedService)
+
+ ngOnInit() {
+ this.sharedService.activeTab$.subscribe((tab) => {
+ this.activeTab = tab
+ })
+ }
+
+ openMenuOffcanvas() {
+ this.offcanvasService.open(SocialMenuComponent)
+ }
+
+ openFriendOffcanvas() {
+ this.offcanvasService.open(FriendListComponent, { position: 'end' })
+ }
+
+ changeTab(tab: string) {
+ this.sharedService.setActiveTab(tab)
+ }
+}
diff --git a/apiferia/src/app/views/apps/todo/data.ts b/apiferia/src/app/views/apps/todo/data.ts
new file mode 100644
index 00000000..8223b9c1
--- /dev/null
+++ b/apiferia/src/app/views/apps/todo/data.ts
@@ -0,0 +1,150 @@
+import { currentYear } from '@/app/common/constants'
+
+export type UserType = {
+ name: string
+ avatar: string
+}
+
+export type TodoType = {
+ task_name: string
+ create_date: string
+ time: string
+ due_date: string
+ assigned: UserType
+ status: string
+ priority: string
+ checked: boolean
+}
+
+export const TodoData: TodoType[] = [
+ {
+ task_name: 'Review system logs for any reported errors',
+ create_date: '23 April, ' + currentYear,
+ time: '05:09 PM',
+ due_date: '30 April, ' + currentYear,
+ assigned: {
+ name: 'Sean Kemper',
+ avatar: 'assets/images/users/avatar-2.jpg',
+ },
+ status: 'In-progress',
+ priority: 'High',
+ checked: false,
+ },
+ {
+ task_name: 'Conduct user testing to identify potential bugs',
+ create_date: '14 May, ' + currentYear,
+ time: '10:51 AM',
+ due_date: '25 Aug, ' + currentYear,
+ assigned: {
+ name: 'Victoria Sullivan',
+ avatar: 'assets/images/users/avatar-3.jpg',
+ },
+ status: 'Pending',
+ priority: 'Low',
+ checked: true,
+ },
+ {
+ task_name: 'Gather feedback from stakeholders regarding any issues',
+ create_date: '12 April, ' + currentYear,
+ time: '12:09 PM',
+ due_date: '28 April, ' + currentYear,
+ assigned: {
+ name: 'Liam Martinez',
+ avatar: 'assets/images/users/avatar-4.jpg',
+ },
+ status: 'In-progress',
+ priority: 'High',
+ checked: false,
+ },
+ {
+ task_name: 'Prioritize bugs based on severity and impact',
+ create_date: '10 April, ' + currentYear,
+ time: '10:09 PM',
+ due_date: '15 April, ' + currentYear,
+ assigned: {
+ name: 'Emma Johnson',
+ avatar: 'assets/images/users/avatar-5.jpg',
+ },
+ status: 'Completed',
+ priority: 'Medium',
+ checked: false,
+ },
+ {
+ task_name: 'Investigate and analyze the root cause of each bug',
+ create_date: '22 May, ' + currentYear,
+ time: '03:41 PM',
+ due_date: '05 July, ' + currentYear,
+ assigned: {
+ name: 'Olivia Thompson',
+ avatar: 'assets/images/users/avatar-1.jpg',
+ },
+ status: 'Pending',
+ priority: 'Low',
+ checked: false,
+ },
+ {
+ task_name: 'Develop and implement fixes for the identified bugs',
+ create_date: '18 May, ' + currentYear,
+ time: '09:09 AM',
+ due_date: '30 April, ' + currentYear,
+ assigned: {
+ name: 'Noah Garcia',
+ avatar: 'assets/images/users/avatar-6.jpg',
+ },
+ status: 'Completed',
+ priority: 'Low',
+ checked: false,
+ },
+ {
+ task_name: 'Complete any recurring tasks',
+ create_date: '05 April, ' + currentYear,
+ time: '08:50 AM',
+ due_date: '22 April, ' + currentYear,
+ assigned: {
+ name: 'Sophia Davis',
+ avatar: 'assets/images/users/avatar-7.jpg',
+ },
+ status: 'New',
+ priority: 'High',
+ checked: false,
+ },
+ {
+ task_name: 'Check emails and respond',
+ create_date: '15 Jun, ' + currentYear,
+ time: '11:09 PM',
+ due_date: '01 Aug, ' + currentYear,
+ assigned: {
+ name: 'Isabella Lopez',
+ avatar: 'assets/images/users/avatar-8.jpg',
+ },
+ status: 'Pending',
+ priority: 'Low',
+ checked: false,
+ },
+ {
+ task_name: 'Review schedule for the day',
+ create_date: '22 April, ' + currentYear,
+ time: '05:09 PM',
+ due_date: '30 April, ' + currentYear,
+ assigned: {
+ name: 'Ava Wilson',
+ avatar: 'assets/images/users/avatar-9.jpg',
+ },
+ status: 'In-progress',
+ priority: 'Medium',
+ checked: true,
+ },
+ {
+ task_name: 'Daily stand-up meeting',
+ create_date: '23 April, ' + currentYear,
+ time: '12:09 PM',
+ due_date: '30 April, ' + currentYear,
+ assigned: {
+ name: 'Oliver Lee',
+ avatar: 'assets/images/users/avatar-10.jpg',
+ },
+ status: 'In-progress',
+ priority: 'High',
+ checked: false,
+ },
+]
diff --git a/apiferia/src/app/views/apps/todo/todo.component.html b/apiferia/src/app/views/apps/todo/todo.component.html
new file mode 100644
index 00000000..8e4df0de
--- /dev/null
+++ b/apiferia/src/app/views/apps/todo/todo.component.html
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+ Task Name
+ Created Date
+ Due Date
+ Assigned
+ Status
+ Priority
+ Action
+
+
+
+
+ @for (data of todo$ | async; track $index) {
+
+
+
+
+
+ {{
+ data.task_name
+ }}
+
+
+
+
+ {{ data.create_date }}
+ {{ data.time }}
+
+ {{ data.due_date }}
+ @if (data.assigned) {
+
+
+
+
+
+ {{ data.assigned.name }}
+
+
+
+
+ }
+
+ {{ data.status }}
+
+
+ {{ data.priority }}
+
+
+
+
+
+
+
+
+
+
+ }
+
+
+
+
+
+
+
+ Showing
+ {{ (total$ | async)! }}
+ of
+ {{ tableService.endIndex }}
+ tasks
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/todo/todo.component.spec.ts b/apiferia/src/app/views/apps/todo/todo.component.spec.ts
new file mode 100644
index 00000000..b25f2bb9
--- /dev/null
+++ b/apiferia/src/app/views/apps/todo/todo.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { TodoComponent } from './todo.component'
+
+describe('TodoComponent', () => {
+ let component: TodoComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [TodoComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(TodoComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/todo/todo.component.ts b/apiferia/src/app/views/apps/todo/todo.component.ts
new file mode 100644
index 00000000..6798933a
--- /dev/null
+++ b/apiferia/src/app/views/apps/todo/todo.component.ts
@@ -0,0 +1,31 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component, inject } from '@angular/core'
+import { TodoData, type TodoType } from './data'
+import { CommonModule } from '@angular/common'
+import type { Observable } from 'rxjs'
+import { TableService } from '@/app/core/services/table.service'
+import { NgbPaginationModule } from '@ng-bootstrap/ng-bootstrap'
+import { FormsModule } from '@angular/forms'
+
+@Component({
+ selector: 'app-todo',
+ standalone: true,
+ imports: [PageTitleComponent, CommonModule, NgbPaginationModule, FormsModule],
+ templateUrl: './todo.component.html',
+ styles: ``,
+})
+export class TodoComponent {
+ todo$: Observable
+ total$: Observable
+
+ public tableService = inject(TableService)
+
+ constructor() {
+ this.todo$ = this.tableService.items$
+ this.total$ = this.tableService.total$
+ }
+
+ ngOnInit(): void {
+ this.tableService.setItems(TodoData, 10)
+ }
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.html b/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.html
new file mode 100644
index 00000000..fdd90a2f
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.html
@@ -0,0 +1,33 @@
+
+
Conversions
+
+
+
+
+
+ View Details
+
+
+
diff --git a/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.spec.ts
new file mode 100644
index 00000000..ef305a7b
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ConversationComponent } from './conversation.component'
+
+describe('ConversationComponent', () => {
+ let component: ConversationComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ConversationComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ConversationComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.ts b/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.ts
new file mode 100644
index 00000000..5787c49e
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/conversation/conversation.component.ts
@@ -0,0 +1,78 @@
+import type { ChartOptions } from '@/app/common/apexchart.model'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'widget-conversation',
+ standalone: true,
+ imports: [NgApexchartsModule],
+ templateUrl: './conversation.component.html',
+ styles: ``,
+})
+export class ConversationComponent {
+ conversationChart: Partial = {
+ chart: {
+ height: 292,
+ type: 'radialBar',
+ },
+ plotOptions: {
+ radialBar: {
+ startAngle: -135,
+ endAngle: 135,
+ dataLabels: {
+ name: {
+ fontSize: '14px',
+ color: 'undefined',
+ offsetY: 100,
+ },
+ value: {
+ offsetY: 55,
+ fontSize: '20px',
+ color: undefined,
+ formatter: function (val: number) {
+ return val + '%'
+ },
+ },
+ },
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ margin: 0,
+ },
+ },
+ },
+ fill: {
+ gradient: {
+ shade: 'dark',
+ shadeIntensity: 0.2,
+ inverseColors: false,
+ opacityFrom: 1,
+ opacityTo: 1,
+ stops: [0, 50, 65, 91],
+ },
+ },
+ stroke: {
+ dashArray: 4,
+ },
+ colors: ['#7f56da', '#22c55e'],
+ series: [65.2],
+ labels: ['Returning Customer'],
+ responsive: [
+ {
+ breakpoint: 380,
+ options: {
+ chart: {
+ height: 180,
+ },
+ },
+ },
+ ],
+ grid: {
+ padding: {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/performance/performance.component.html b/apiferia/src/app/views/apps/widgets/components/performance/performance.component.html
new file mode 100644
index 00000000..dd668173
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/performance/performance.component.html
@@ -0,0 +1,44 @@
+
+
+
Performance
+
+
+ ALL
+
+
+ 1M
+
+
+ 6M
+
+
+ 1Y
+
+
+
+
+
+
+ We regret to inform you that our server is currently experiencing technical
+ difficulties.
+
+
+
+
diff --git a/apiferia/src/app/views/apps/widgets/components/performance/performance.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/performance/performance.component.spec.ts
new file mode 100644
index 00000000..a0f897b6
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/performance/performance.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { PerformanceComponent } from './performance.component'
+
+describe('PerformanceComponent', () => {
+ let component: PerformanceComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [PerformanceComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(PerformanceComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/performance/performance.component.ts b/apiferia/src/app/views/apps/widgets/components/performance/performance.component.ts
new file mode 100644
index 00000000..c69683c8
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/performance/performance.component.ts
@@ -0,0 +1,144 @@
+import type { ChartOptions } from '@/app/common/apexchart.model'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'widget-performance',
+ standalone: true,
+ imports: [NgApexchartsModule],
+ templateUrl: './performance.component.html',
+ styles: ``,
+})
+export class PerformanceComponent {
+ performanceChart: Partial = {
+ series: [
+ {
+ name: 'Page Views',
+ type: 'bar',
+ data: [34, 65, 46, 68, 49, 61, 42, 44, 78, 52, 63, 67],
+ },
+ {
+ name: 'Clicks',
+ type: 'area',
+ data: [8, 12, 7, 17, 21, 11, 5, 9, 7, 29, 12, 35],
+ },
+ ],
+ chart: {
+ height: 313,
+ type: 'line',
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ dashArray: [0, 0],
+ width: [0, 2],
+ curve: 'smooth',
+ },
+ fill: {
+ opacity: [1, 1],
+ type: ['solid', 'gradient'],
+ gradient: {
+ type: 'vertical',
+ inverseColors: false,
+ opacityFrom: 0.5,
+ opacityTo: 0,
+ stops: [0, 90],
+ },
+ },
+ markers: {
+ size: [0, 0],
+ strokeWidth: 2,
+ hover: {
+ size: 4,
+ },
+ },
+ xaxis: {
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ],
+ axisTicks: {
+ show: false,
+ },
+ axisBorder: {
+ show: false,
+ },
+ },
+ yaxis: {
+ min: 0,
+ axisBorder: {
+ show: false,
+ },
+ },
+ grid: {
+ show: true,
+ strokeDashArray: 3,
+ xaxis: {
+ lines: {
+ show: false,
+ },
+ },
+ yaxis: {
+ lines: {
+ show: true,
+ },
+ },
+ padding: {
+ top: 0,
+ right: -2,
+ bottom: 0,
+ left: 10,
+ },
+ },
+ legend: {
+ show: true,
+ horizontalAlign: 'center',
+ offsetX: 0,
+ offsetY: 5,
+ itemMargin: {
+ horizontal: 10,
+ vertical: 0,
+ },
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '30%',
+ barHeight: '70%',
+ borderRadius: 3,
+ },
+ },
+ colors: ['#7f56da', '#22c55e'],
+ tooltip: {
+ shared: true,
+ y: [
+ {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return y.toFixed(1) + 'k'
+ }
+ return y
+ },
+ },
+ {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return y.toFixed(1) + 'k'
+ }
+ return y
+ },
+ },
+ ],
+ },
+ }
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.html b/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.html
new file mode 100644
index 00000000..843e7436
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.html
@@ -0,0 +1,56 @@
+
+
+
+
+
Recent Project Summary
+
+
+
+
+
+
+ Project
+ Client
+ Team
+ Deadline
+ Work Progress
+
+
+
+
+ @for (data of projectsList; track $index) {
+
+ {{ data.project }}
+ {{ data.client }}
+
+ @for (team of data.team; track team) {
+
+
+
+ }
+
+ {{ data.deadline }}
+
+
+
+
+ }
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.spec.ts
new file mode 100644
index 00000000..857ee4dd
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { RecentProjectComponent } from './recent-project.component'
+
+describe('RecentProjectComponent', () => {
+ let component: RecentProjectComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [RecentProjectComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(RecentProjectComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.ts b/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.ts
new file mode 100644
index 00000000..50640440
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/recent-project/recent-project.component.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core'
+import { RecentProject } from '../../data'
+import { NgbProgressbarModule } from '@ng-bootstrap/ng-bootstrap'
+import { SimplebarAngularModule } from 'simplebar-angular'
+
+@Component({
+ selector: 'widget-recent-project',
+ standalone: true,
+ imports: [NgbProgressbarModule, SimplebarAngularModule],
+ templateUrl: './recent-project.component.html',
+ styles: ``,
+})
+export class RecentProjectComponent {
+ projectsList = RecentProject
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.html b/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.html
new file mode 100644
index 00000000..d7fc878e
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.html
@@ -0,0 +1,49 @@
+
+
+
+
Today's Schedules
+ @for (schedule of scheduleList; track $index; let last = $last) {
+
+
+
+
+
+ {{ schedule.title }}
+
+
+ {{ schedule.duration }}
+
+
+
+
+ }
+
+
diff --git a/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.spec.ts
new file mode 100644
index 00000000..c73c150d
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ScheduleComponent } from './schedule.component'
+
+describe('ScheduleComponent', () => {
+ let component: ScheduleComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ScheduleComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ScheduleComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.ts b/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.ts
new file mode 100644
index 00000000..b849400e
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/schedule/schedule.component.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core'
+import { ScheduleData } from '../../data'
+import { NgbAlertModule, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+import { CommonModule } from '@angular/common'
+
+@Component({
+ selector: 'widget-schedule',
+ standalone: true,
+ imports: [NgbAlertModule, CommonModule, NgbDropdownModule],
+ templateUrl: './schedule.component.html',
+ styles: ``,
+})
+export class ScheduleComponent {
+ scheduleList = ScheduleData
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.html b/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.html
new file mode 100644
index 00000000..81a3d82d
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.html
@@ -0,0 +1,54 @@
+
+
+
+
+
+ @for (data of friendList; track $index; let last = $last) {
+
+
+
+
+
+
+
+ {{ data.mutual > 0 ? data.mutual : 'no' }} mutual friends
+
+
+
+
+ }
+
+
+
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.spec.ts
new file mode 100644
index 00000000..c2d9ba11
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { WidgetFriendRequestComponent } from './widget-friend-request.component'
+
+describe('WidgetFriendRequestComponent', () => {
+ let component: WidgetFriendRequestComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [WidgetFriendRequestComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(WidgetFriendRequestComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.ts b/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.ts
new file mode 100644
index 00000000..29a13de3
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-friend-request/widget-friend-request.component.ts
@@ -0,0 +1,16 @@
+import { Component } from '@angular/core'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { FriendRequest } from '../../../social/data'
+import { CommonModule } from '@angular/common'
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'widget-friend-request',
+ standalone: true,
+ imports: [SimplebarAngularModule, CommonModule, NgbDropdownModule],
+ templateUrl: './widget-friend-request.component.html',
+ styles: ``,
+})
+export class WidgetFriendRequestComponent {
+ friendList = FriendRequest
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.html b/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.html
new file mode 100644
index 00000000..c1275be2
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.html
@@ -0,0 +1,27 @@
+
+ @for (data of stateList; track $index) {
+
+
+
+
+
+
+
+
+ {{ data.title }}
+
+
+ {{ data.amount }}
+
+
+
+
+
+
+
+ }
+
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.spec.ts
new file mode 100644
index 00000000..714d1667
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { WidgetState2Component } from './widget-state2.component'
+
+describe('WidgetState2Component', () => {
+ let component: WidgetState2Component
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [WidgetState2Component],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(WidgetState2Component)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.ts b/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.ts
new file mode 100644
index 00000000..0876f4de
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-state2/widget-state2.component.ts
@@ -0,0 +1,13 @@
+import { Component } from '@angular/core'
+import { State2Data } from '../../data'
+
+@Component({
+ selector: 'widget-state2',
+ standalone: true,
+ imports: [],
+ templateUrl: './widget-state2.component.html',
+ styles: ``,
+})
+export class WidgetState2Component {
+ stateList = State2Data
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.html b/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.html
new file mode 100644
index 00000000..8cf9e841
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.html
@@ -0,0 +1,53 @@
+
+ @for (data of stateList; track $index) {
+
+
+
+
+
+
+
+
+ {{ data.title }}
+
+
+ {{ data.amount }}
+
+
+
+
+
+
+
+
+
+ }
+
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.spec.ts
new file mode 100644
index 00000000..99f9d3c1
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { WidgetState3Component } from './widget-state3.component'
+
+describe('WidgetState3Component', () => {
+ let component: WidgetState3Component
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [WidgetState3Component],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(WidgetState3Component)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.ts b/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.ts
new file mode 100644
index 00000000..eaa2dd77
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-state3/widget-state3.component.ts
@@ -0,0 +1,14 @@
+import { Component } from '@angular/core'
+import { State2Data } from '../../data'
+import { CommonModule } from '@angular/common'
+
+@Component({
+ selector: 'widget-state3',
+ standalone: true,
+ imports: [CommonModule],
+ templateUrl: './widget-state3.component.html',
+ styles: ``,
+})
+export class WidgetState3Component {
+ stateList = State2Data
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.html b/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.html
new file mode 100644
index 00000000..ddd06b3a
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+ @for (
+ task of taskList;
+ track $index;
+ let first = $first;
+ let last = $last
+ ) {
+
+
+ {{
+ task.task_name
+ }}
+
+ }
+
+
+
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.spec.ts
new file mode 100644
index 00000000..b3f6d31f
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { WidgetTaskComponent } from './widget-task.component'
+
+describe('WidgetTaskComponent', () => {
+ let component: WidgetTaskComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [WidgetTaskComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(WidgetTaskComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.ts b/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.ts
new file mode 100644
index 00000000..d33cf47d
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-task/widget-task.component.ts
@@ -0,0 +1,15 @@
+import { Component } from '@angular/core'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { TodoData } from '../../../todo/data'
+import { CommonModule } from '@angular/common'
+
+@Component({
+ selector: 'widget-task',
+ standalone: true,
+ imports: [SimplebarAngularModule, CommonModule],
+ templateUrl: './widget-task.component.html',
+ styles: ``,
+})
+export class WidgetTaskComponent {
+ taskList = TodoData
+}
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.html b/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.html
new file mode 100644
index 00000000..654d3607
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+ @for (data of transactions; track $index) {
+
+ {{ data.date }}
+ ${{ data.amount }}
+
+ {{ data.status }}
+
+ {{ data.description }}
+
+ }
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.spec.ts b/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.spec.ts
new file mode 100644
index 00000000..c9176f61
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { WidgetTransactionComponent } from './widget-transaction.component'
+
+describe('WidgetTransactionComponent', () => {
+ let component: WidgetTransactionComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [WidgetTransactionComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(WidgetTransactionComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.ts b/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.ts
new file mode 100644
index 00000000..549a7a4c
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/components/widget-transaction/widget-transaction.component.ts
@@ -0,0 +1,15 @@
+import { TransactionsList } from '@/app/views/dashboards/sales/data'
+import { CommonModule } from '@angular/common'
+import { Component } from '@angular/core'
+import { SimplebarAngularModule } from 'simplebar-angular'
+
+@Component({
+ selector: 'widget-transaction',
+ standalone: true,
+ imports: [SimplebarAngularModule, CommonModule],
+ templateUrl: './widget-transaction.component.html',
+ styles: ``,
+})
+export class WidgetTransactionComponent {
+ transactions = TransactionsList
+}
diff --git a/apiferia/src/app/views/apps/widgets/data.ts b/apiferia/src/app/views/apps/widgets/data.ts
new file mode 100644
index 00000000..4176e129
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/data.ts
@@ -0,0 +1,158 @@
+import { currentYear } from '@/app/common/constants'
+
+export type ProjectType = {
+ project: string
+ client: string
+ team: string[]
+ deadline: string
+ progressValue: number
+ progressType: string
+}
+
+export type ScheduleType = {
+ time: string
+ title: string
+ type: string
+ duration: string
+}
+
+export type StateType = {
+ icon: string
+ iconColor: string
+ title: string
+ amount: string
+ badge: string
+ badgeColor: string
+}
+
+export const RecentProject: ProjectType[] = [
+ {
+ project: 'Zelogy',
+ client: 'Daniel Olsen',
+ team: [
+ 'assets/images/users/avatar-2.jpg',
+ 'assets/images/users/avatar-3.jpg',
+ 'assets/images/users/avatar-4.jpg',
+ ],
+ deadline: '12 April ' + currentYear,
+ progressValue: 33,
+ progressType: 'primary',
+ },
+ {
+ project: 'Shiaz',
+ client: 'Jack Roldan',
+ team: [
+ 'assets/images/users/avatar-1.jpg',
+ 'assets/images/users/avatar-5.jpg',
+ ],
+ deadline: '10 April ' + currentYear,
+ progressValue: 74,
+ progressType: 'success',
+ },
+ {
+ project: 'Holderick',
+ client: 'Betty Cox',
+ team: [
+ 'assets/images/users/avatar-5.jpg',
+ 'assets/images/users/avatar-2.jpg',
+ 'assets/images/users/avatar-3.jpg',
+ ],
+ deadline: '31 March ' + currentYear,
+ progressValue: 50,
+ progressType: 'warning',
+ },
+ {
+ project: 'Feyvux',
+ client: 'Carlos Johnson',
+ team: [
+ 'assets/images/users/avatar-3.jpg',
+ 'assets/images/users/avatar-7.jpg',
+ 'assets/images/users/avatar-6.jpg',
+ ],
+ deadline: '25 March ' + currentYear,
+ progressValue: 92,
+ progressType: 'primary',
+ },
+ {
+ project: 'Xavlox',
+ client: 'Lorraine Cox',
+ team: ['assets/images/users/avatar-7.jpg'],
+ deadline: '22 March ' + currentYear,
+ progressValue: 48,
+ progressType: 'danger',
+ },
+ {
+ project: 'Mozacav',
+ client: 'Delores Young',
+ team: [
+ 'assets/images/users/avatar-3.jpg',
+ 'assets/images/users/avatar-4.jpg',
+ 'assets/images/users/avatar-2.jpg',
+ ],
+ deadline: '15 March ' + currentYear,
+ progressValue: 21,
+ progressType: 'primary',
+ },
+]
+
+export const ScheduleData: ScheduleType[] = [
+ {
+ time: '09:00',
+ title: 'Setup Github Repository',
+ type: 'primary',
+ duration: '09:00 - 10:00',
+ },
+ {
+ time: '10:00',
+ title: 'Design Review - Reback Admin',
+ type: 'success',
+ duration: '10:00 - 10:30',
+ },
+ {
+ time: '11:00',
+ title: 'Meeting with BD Team',
+ type: 'info',
+ duration: '11:00 - 12:30',
+ },
+ {
+ time: '01:00',
+ title: 'Meeting with Design Studio',
+ type: 'warning',
+ duration: '01:00 - 02:00',
+ },
+]
+
+export const State2Data: StateType[] = [
+ {
+ icon: 'bx-layer',
+ iconColor: 'primary',
+ title: 'Campaign Sent',
+ amount: '13, 647',
+ badge: '2.3',
+ badgeColor: 'success',
+ },
+ {
+ icon: 'bx-award',
+ iconColor: 'success',
+ title: 'New Leads',
+ amount: '9, 526',
+ badge: '8.1',
+ badgeColor: 'success',
+ },
+ {
+ icon: 'bxs-backpack',
+ iconColor: 'danger',
+ title: 'Deals',
+ amount: '976',
+ badge: '0.3',
+ badgeColor: 'danger',
+ },
+ {
+ icon: 'bx-dollar-circle',
+ iconColor: 'warning',
+ title: 'Booked Revenue',
+ amount: '$123',
+ badge: '10.6',
+ badgeColor: 'danger',
+ },
+]
diff --git a/apiferia/src/app/views/apps/widgets/widgets.component.html b/apiferia/src/app/views/apps/widgets/widgets.component.html
new file mode 100644
index 00000000..c1794c84
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/widgets.component.html
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/apps/widgets/widgets.component.spec.ts b/apiferia/src/app/views/apps/widgets/widgets.component.spec.ts
new file mode 100644
index 00000000..6f57ed8b
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/widgets.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { WidgetsComponent } from './widgets.component'
+
+describe('WidgetsComponent', () => {
+ let component: WidgetsComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [WidgetsComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(WidgetsComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/apps/widgets/widgets.component.ts b/apiferia/src/app/views/apps/widgets/widgets.component.ts
new file mode 100644
index 00000000..9a0eaf44
--- /dev/null
+++ b/apiferia/src/app/views/apps/widgets/widgets.component.ts
@@ -0,0 +1,33 @@
+import { Component } from '@angular/core'
+import { ConversationComponent } from './components/conversation/conversation.component'
+import { PerformanceComponent } from './components/performance/performance.component'
+import { WidgetState2Component } from './components/widget-state2/widget-state2.component'
+import { WidgetState3Component } from './components/widget-state3/widget-state3.component'
+import { WidgetFriendRequestComponent } from './components/widget-friend-request/widget-friend-request.component'
+import { WidgetTaskComponent } from './components/widget-task/widget-task.component'
+import { WidgetTransactionComponent } from './components/widget-transaction/widget-transaction.component'
+import { RecentProjectComponent } from './components/recent-project/recent-project.component'
+import { ScheduleComponent } from './components/schedule/schedule.component'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { StateCardComponent } from '@/app/components/state-card/state-card.component'
+
+@Component({
+ selector: 'app-widgets',
+ standalone: true,
+ imports: [
+ PageTitleComponent,
+ ConversationComponent,
+ PerformanceComponent,
+ StateCardComponent,
+ WidgetState2Component,
+ WidgetState3Component,
+ WidgetFriendRequestComponent,
+ WidgetTaskComponent,
+ WidgetTransactionComponent,
+ RecentProjectComponent,
+ ScheduleComponent,
+ ],
+ templateUrl: './widgets.component.html',
+ styles: ``,
+})
+export class WidgetsComponent {}
diff --git a/apiferia/src/app/views/auth/auth.route.ts b/apiferia/src/app/views/auth/auth.route.ts
new file mode 100644
index 00000000..b5027e3d
--- /dev/null
+++ b/apiferia/src/app/views/auth/auth.route.ts
@@ -0,0 +1,52 @@
+import { Route } from '@angular/router'
+import { SigninComponent } from './signin/signin.component'
+import { Signin2Component } from './signin2/signin2.component'
+import { SignupComponent } from './signup/signup.component'
+import { Signup2Component } from './signup2/signup2.component'
+import { ResetPassComponent } from './reset-pass/reset-pass.component'
+import { ResetPass2Component } from './reset-pass2/reset-pass2.component'
+import { LockScreenComponent } from './lock-screen/lock-screen.component'
+import { LockScreen2Component } from './lock-screen2/lock-screen2.component'
+
+export const AUTH_ROUTES: Route[] = [
+ {
+ path: 'sign-in',
+ component: SigninComponent,
+ data: { title: 'Sign In' },
+ },
+ {
+ path: 'sign-in-2',
+ component: Signin2Component,
+ data: { title: 'Sign In 2' },
+ },
+ {
+ path: 'sign-up',
+ component: SignupComponent,
+ data: { title: 'Sign Up' },
+ },
+ {
+ path: 'sign-up-2',
+ component: Signup2Component,
+ data: { title: 'Sign Up 2' },
+ },
+ {
+ path: 'reset-pass',
+ component: ResetPassComponent,
+ data: { title: 'Reset Password' },
+ },
+ {
+ path: 'reset-pass-2',
+ component: ResetPass2Component,
+ data: { title: 'Reset Password 2' },
+ },
+ {
+ path: 'lock-screen',
+ component: LockScreenComponent,
+ data: { title: 'Lock Screen' },
+ },
+ {
+ path: 'lock-screen-2',
+ component: LockScreen2Component,
+ data: { title: 'Lock Screen 2' },
+ },
+]
diff --git a/apiferia/src/app/views/auth/lock-screen/lock-screen.component.html b/apiferia/src/app/views/auth/lock-screen/lock-screen.component.html
new file mode 100644
index 00000000..9799c699
--- /dev/null
+++ b/apiferia/src/app/views/auth/lock-screen/lock-screen.component.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Hi ! Gaston
+
+ Enter your password to access the admin.
+
+
+
+
+
+
+
+
+
+
+ Not you? return
+ Sign In
+
+
+
diff --git a/apiferia/src/app/views/auth/lock-screen/lock-screen.component.spec.ts b/apiferia/src/app/views/auth/lock-screen/lock-screen.component.spec.ts
new file mode 100644
index 00000000..a78c01eb
--- /dev/null
+++ b/apiferia/src/app/views/auth/lock-screen/lock-screen.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { LockScreenComponent } from './lock-screen.component'
+
+describe('LockScreenComponent', () => {
+ let component: LockScreenComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [LockScreenComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(LockScreenComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/lock-screen/lock-screen.component.ts b/apiferia/src/app/views/auth/lock-screen/lock-screen.component.ts
new file mode 100644
index 00000000..a9733cf1
--- /dev/null
+++ b/apiferia/src/app/views/auth/lock-screen/lock-screen.component.ts
@@ -0,0 +1,12 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { Component } from '@angular/core'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'app-lock-screen',
+ standalone: true,
+ imports: [LogoBoxComponent, RouterLink],
+ templateUrl: './lock-screen.component.html',
+ styles: ``,
+})
+export class LockScreenComponent {}
diff --git a/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.html b/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.html
new file mode 100644
index 00000000..93c566f2
--- /dev/null
+++ b/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
Hi ! Gaston
+
+ Enter your password to access the admin.
+
+
+
+
+
+
+ Not you? return
+ Sign In
+
+
+
diff --git a/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.spec.ts b/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.spec.ts
new file mode 100644
index 00000000..71805b2c
--- /dev/null
+++ b/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { LockScreen2Component } from './lock-screen2.component'
+
+describe('LockScreen2Component', () => {
+ let component: LockScreen2Component
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [LockScreen2Component],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(LockScreen2Component)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.ts b/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.ts
new file mode 100644
index 00000000..b2e3f93e
--- /dev/null
+++ b/apiferia/src/app/views/auth/lock-screen2/lock-screen2.component.ts
@@ -0,0 +1,12 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { Component } from '@angular/core'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'app-lock-screen2',
+ standalone: true,
+ imports: [LogoBoxComponent, RouterLink],
+ templateUrl: './lock-screen2.component.html',
+ styles: ``,
+})
+export class LockScreen2Component {}
diff --git a/apiferia/src/app/views/auth/reset-pass/reset-pass.component.html b/apiferia/src/app/views/auth/reset-pass/reset-pass.component.html
new file mode 100644
index 00000000..c3602bd1
--- /dev/null
+++ b/apiferia/src/app/views/auth/reset-pass/reset-pass.component.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Reset Password
+
+ Enter your email address and we'll send you an email with
+ instructions to reset your password.
+
+
+
+
+
+
+
+
+
+
+ Back to
+ Sign In
+
+
+
diff --git a/apiferia/src/app/views/auth/reset-pass/reset-pass.component.spec.ts b/apiferia/src/app/views/auth/reset-pass/reset-pass.component.spec.ts
new file mode 100644
index 00000000..d3711939
--- /dev/null
+++ b/apiferia/src/app/views/auth/reset-pass/reset-pass.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ResetPassComponent } from './reset-pass.component'
+
+describe('ResetPassComponent', () => {
+ let component: ResetPassComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ResetPassComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ResetPassComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/reset-pass/reset-pass.component.ts b/apiferia/src/app/views/auth/reset-pass/reset-pass.component.ts
new file mode 100644
index 00000000..6b0f62ce
--- /dev/null
+++ b/apiferia/src/app/views/auth/reset-pass/reset-pass.component.ts
@@ -0,0 +1,12 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { Component } from '@angular/core'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'app-reset-pass',
+ standalone: true,
+ imports: [LogoBoxComponent, RouterLink],
+ templateUrl: './reset-pass.component.html',
+ styles: ``,
+})
+export class ResetPassComponent {}
diff --git a/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.html b/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.html
new file mode 100644
index 00000000..ee98912e
--- /dev/null
+++ b/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
Reset Password
+
+ Enter your email address and we'll send you an email with instructions
+ to reset your password.
+
+
+
+
+
+
+
+ Back to
+ Sign In
+
+
+
diff --git a/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.spec.ts b/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.spec.ts
new file mode 100644
index 00000000..3ac596a6
--- /dev/null
+++ b/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ResetPass2Component } from './reset-pass2.component'
+
+describe('ResetPass2Component', () => {
+ let component: ResetPass2Component
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ResetPass2Component],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ResetPass2Component)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.ts b/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.ts
new file mode 100644
index 00000000..0bb7bebc
--- /dev/null
+++ b/apiferia/src/app/views/auth/reset-pass2/reset-pass2.component.ts
@@ -0,0 +1,12 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { Component } from '@angular/core'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'app-reset-pass2',
+ standalone: true,
+ imports: [LogoBoxComponent, RouterLink],
+ templateUrl: './reset-pass2.component.html',
+ styles: ``,
+})
+export class ResetPass2Component {}
diff --git a/apiferia/src/app/views/auth/signin/signin.component.html b/apiferia/src/app/views/auth/signin/signin.component.html
new file mode 100644
index 00000000..bc1207a3
--- /dev/null
+++ b/apiferia/src/app/views/auth/signin/signin.component.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Sign In
+
+ Enter your email address and password to access admin panel.
+
+
+
+
+
+
+
+
+
+
+ Don't have an account?
+ Sign Up
+
+
+
diff --git a/apiferia/src/app/views/auth/signin/signin.component.spec.ts b/apiferia/src/app/views/auth/signin/signin.component.spec.ts
new file mode 100644
index 00000000..5f508a3d
--- /dev/null
+++ b/apiferia/src/app/views/auth/signin/signin.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SigninComponent } from './signin.component'
+
+describe('SigninComponent', () => {
+ let component: SigninComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SigninComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SigninComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/signin/signin.component.ts b/apiferia/src/app/views/auth/signin/signin.component.ts
new file mode 100644
index 00000000..f79d32d6
--- /dev/null
+++ b/apiferia/src/app/views/auth/signin/signin.component.ts
@@ -0,0 +1,56 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { SocialBtnComponent } from '@/app/components/social-btn/social-btn.component'
+import { login } from '@/app/store/authentication/authentication.actions'
+import { Component, inject, type OnInit } from '@angular/core'
+import {
+ FormsModule,
+ ReactiveFormsModule,
+ UntypedFormBuilder,
+ Validators,
+ type UntypedFormGroup,
+} from '@angular/forms'
+import { RouterModule } from '@angular/router'
+import { Store } from '@ngrx/store'
+
+@Component({
+ selector: 'app-signin',
+ standalone: true,
+ imports: [
+ SocialBtnComponent,
+ LogoBoxComponent,
+ FormsModule,
+ ReactiveFormsModule,
+ RouterModule,
+ ],
+ templateUrl: './signin.component.html',
+ styles: ``,
+})
+export class SigninComponent implements OnInit {
+ signInForm!: UntypedFormGroup
+ submitted: boolean = false
+
+ public fb = inject(UntypedFormBuilder)
+ public store = inject(Store)
+
+ ngOnInit(): void {
+ this.signInForm = this.fb.group({
+ email: ['reback@techzaa.in', [Validators.required, Validators.email]],
+ password: ['123456', [Validators.required]],
+ })
+ }
+
+ get formValues() {
+ return this.signInForm.controls
+ }
+
+ login() {
+ this.submitted = true
+ if (this.signInForm.valid) {
+ const email = this.formValues['email'].value // Get the username from the form
+ const password = this.formValues['password'].value // Get the password from the form
+
+ // Login Api
+ this.store.dispatch(login({ email: email, password: password }))
+ }
+ }
+}
diff --git a/apiferia/src/app/views/auth/signin2/signin2.component.html b/apiferia/src/app/views/auth/signin2/signin2.component.html
new file mode 100644
index 00000000..0a4da6d9
--- /dev/null
+++ b/apiferia/src/app/views/auth/signin2/signin2.component.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
Sign In
+
+ Enter your email address and password to access admin panel.
+
+
+
+
+
+
+
+ New here?
+ Sign Up
+
+
+
diff --git a/apiferia/src/app/views/auth/signin2/signin2.component.spec.ts b/apiferia/src/app/views/auth/signin2/signin2.component.spec.ts
new file mode 100644
index 00000000..98d2c421
--- /dev/null
+++ b/apiferia/src/app/views/auth/signin2/signin2.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { Signin2Component } from './signin2.component'
+
+describe('Signin2Component', () => {
+ let component: Signin2Component
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [Signin2Component],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(Signin2Component)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/signin2/signin2.component.ts b/apiferia/src/app/views/auth/signin2/signin2.component.ts
new file mode 100644
index 00000000..b6d6d768
--- /dev/null
+++ b/apiferia/src/app/views/auth/signin2/signin2.component.ts
@@ -0,0 +1,56 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { SocialBtnComponent } from '@/app/components/social-btn/social-btn.component'
+import { login } from '@/app/store/authentication/authentication.actions'
+import { Component, inject } from '@angular/core'
+import {
+ FormsModule,
+ ReactiveFormsModule,
+ UntypedFormBuilder,
+ Validators,
+ type UntypedFormGroup,
+} from '@angular/forms'
+import { RouterLink } from '@angular/router'
+import { Store } from '@ngrx/store'
+
+@Component({
+ selector: 'app-signin2',
+ standalone: true,
+ imports: [
+ SocialBtnComponent,
+ LogoBoxComponent,
+ FormsModule,
+ ReactiveFormsModule,
+ RouterLink,
+ ],
+ templateUrl: './signin2.component.html',
+ styles: ``,
+})
+export class Signin2Component {
+ signInForm!: UntypedFormGroup
+ submitted: boolean = false
+
+ public fb = inject(UntypedFormBuilder)
+ public store = inject(Store)
+
+ ngOnInit(): void {
+ this.signInForm = this.fb.group({
+ email: ['reback@techzaa.in', [Validators.required, Validators.email]],
+ password: ['123456', [Validators.required]],
+ })
+ }
+
+ get formValues() {
+ return this.signInForm.controls
+ }
+
+ login() {
+ this.submitted = true
+ if (this.signInForm.valid) {
+ const email = this.formValues['email'].value // Get the username from the form
+ const password = this.formValues['password'].value // Get the password from the form
+
+ // Login Api
+ this.store.dispatch(login({ email: email, password: password }))
+ }
+ }
+}
diff --git a/apiferia/src/app/views/auth/signup/signup.component.html b/apiferia/src/app/views/auth/signup/signup.component.html
new file mode 100644
index 00000000..68ca8fc0
--- /dev/null
+++ b/apiferia/src/app/views/auth/signup/signup.component.html
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Sign Up
+
+ New to our platform? Sign up now! It only takes a minute.
+
+
+
+
+
+
+
+
+
+
+ I already have an account
+ Sign In
+
+
+
diff --git a/apiferia/src/app/views/auth/signup/signup.component.spec.ts b/apiferia/src/app/views/auth/signup/signup.component.spec.ts
new file mode 100644
index 00000000..451b40ac
--- /dev/null
+++ b/apiferia/src/app/views/auth/signup/signup.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SignupComponent } from './signup.component'
+
+describe('SignupComponent', () => {
+ let component: SignupComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SignupComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SignupComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/signup/signup.component.ts b/apiferia/src/app/views/auth/signup/signup.component.ts
new file mode 100644
index 00000000..3f0e4dfb
--- /dev/null
+++ b/apiferia/src/app/views/auth/signup/signup.component.ts
@@ -0,0 +1,13 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { SocialBtnComponent } from '@/app/components/social-btn/social-btn.component'
+import { Component } from '@angular/core'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'app-signup',
+ standalone: true,
+ imports: [SocialBtnComponent, LogoBoxComponent, RouterLink],
+ templateUrl: './signup.component.html',
+ styles: ``,
+})
+export class SignupComponent {}
diff --git a/apiferia/src/app/views/auth/signup2/signup2.component.html b/apiferia/src/app/views/auth/signup2/signup2.component.html
new file mode 100644
index 00000000..019becb4
--- /dev/null
+++ b/apiferia/src/app/views/auth/signup2/signup2.component.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
Sign Up
+
+ New to our platform? Sign up now! It only takes a minute.
+
+
+
+
+
+
+
+ I already have an account
+ Sign In
+
+
+
diff --git a/apiferia/src/app/views/auth/signup2/signup2.component.spec.ts b/apiferia/src/app/views/auth/signup2/signup2.component.spec.ts
new file mode 100644
index 00000000..9d9f1b8c
--- /dev/null
+++ b/apiferia/src/app/views/auth/signup2/signup2.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { Signup2Component } from './signup2.component'
+
+describe('Signup2Component', () => {
+ let component: Signup2Component
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [Signup2Component],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(Signup2Component)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/auth/signup2/signup2.component.ts b/apiferia/src/app/views/auth/signup2/signup2.component.ts
new file mode 100644
index 00000000..0e07ad96
--- /dev/null
+++ b/apiferia/src/app/views/auth/signup2/signup2.component.ts
@@ -0,0 +1,13 @@
+import { LogoBoxComponent } from '@/app/components/logo-box.component'
+import { SocialBtnComponent } from '@/app/components/social-btn/social-btn.component'
+import { Component } from '@angular/core'
+import { RouterLink } from '@angular/router'
+
+@Component({
+ selector: 'app-signup2',
+ standalone: true,
+ imports: [SocialBtnComponent, LogoBoxComponent, RouterLink],
+ templateUrl: './signup2.component.html',
+ styles: ``,
+})
+export class Signup2Component {}
diff --git a/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.html b/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.html
new file mode 100644
index 00000000..d4ce2fbd
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.html
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.spec.ts b/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.spec.ts
new file mode 100644
index 00000000..fadd3201
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { CalendarHelpComponent } from './calendar-help.component'
+
+describe('CalendarHelpComponent', () => {
+ let component: CalendarHelpComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [CalendarHelpComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(CalendarHelpComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.ts b/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.ts
new file mode 100644
index 00000000..b7eb1336
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/calendar-help.component.ts
@@ -0,0 +1,19 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component } from '@angular/core'
+import { SearchComponent } from './components/search/search.component'
+import { HelpListComponent } from './components/help-list/help-list.component'
+import { QuestionsComponent } from './components/questions/questions.component'
+
+@Component({
+ selector: 'app-calendar-help',
+ standalone: true,
+ imports: [
+ PageTitleComponent,
+ SearchComponent,
+ HelpListComponent,
+ QuestionsComponent,
+ ],
+ templateUrl: './calendar-help.component.html',
+ styles: ``,
+})
+export class CalendarHelpComponent {}
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.html b/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.html
new file mode 100644
index 00000000..749ba76c
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.html
@@ -0,0 +1,13 @@
+
+ @for (data of helpList; track $index) {
+
+
+
+
{{ data.title }}
+
+ {{ data.description }}
+
+
+
+ }
+
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.spec.ts b/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.spec.ts
new file mode 100644
index 00000000..fbfcfd20
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { HelpListComponent } from './help-list.component'
+
+describe('HelpListComponent', () => {
+ let component: HelpListComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [HelpListComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(HelpListComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.ts b/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.ts
new file mode 100644
index 00000000..1c154355
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/help-list/help-list.component.ts
@@ -0,0 +1,13 @@
+import { Component } from '@angular/core'
+import { HelpData } from '../../data'
+
+@Component({
+ selector: 'help-list',
+ standalone: true,
+ imports: [],
+ templateUrl: './help-list.component.html',
+ styles: ``,
+})
+export class HelpListComponent {
+ helpList = HelpData
+}
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.html b/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.html
new file mode 100644
index 00000000..8789d778
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.html
@@ -0,0 +1,11 @@
+
+
+
Can't find a questions?
+
+ Email us your question
+
+
+ Send us a tweet
+
+
+
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.spec.ts b/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.spec.ts
new file mode 100644
index 00000000..23343056
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { QuestionsComponent } from './questions.component'
+
+describe('QuestionsComponent', () => {
+ let component: QuestionsComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [QuestionsComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(QuestionsComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.ts b/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.ts
new file mode 100644
index 00000000..e0060c05
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/questions/questions.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core'
+
+@Component({
+ selector: 'help-questions',
+ standalone: true,
+ imports: [],
+ templateUrl: './questions.component.html',
+ styles: ``,
+})
+export class QuestionsComponent {}
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.html b/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.html
new file mode 100644
index 00000000..abdf64fe
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.html
@@ -0,0 +1,19 @@
+
+
+
+
+
Search for a question
+
Type your question or search keyword
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.spec.ts b/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.spec.ts
new file mode 100644
index 00000000..c06a9645
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SearchComponent } from './search.component'
+
+describe('SearchComponent', () => {
+ let component: SearchComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SearchComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SearchComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.ts b/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.ts
new file mode 100644
index 00000000..7f193bdd
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/components/search/search.component.ts
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core'
+
+@Component({
+ selector: 'help-search',
+ standalone: true,
+ imports: [],
+ templateUrl: './search.component.html',
+ styles: ``,
+})
+export class SearchComponent {}
diff --git a/apiferia/src/app/views/calendar/calendar-help/data.ts b/apiferia/src/app/views/calendar/calendar-help/data.ts
new file mode 100644
index 00000000..48fed5c6
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar-help/data.ts
@@ -0,0 +1,43 @@
+export type HelpType = {
+ image: string
+ title: string
+ description: string
+}
+
+export const HelpData = [
+ {
+ image: 'assets/images/app-calendar/help-1.png',
+ title: 'Getting Started',
+ description:
+ 'Learn the basics, connect your calendar and discover features that will make scheduling easier.',
+ },
+ {
+ image: 'assets/images/app-calendar/help-2.png',
+ title: 'Availability',
+ description:
+ 'Determine when you would like to be scheduled and explore our advanced availability options.',
+ },
+ {
+ image: 'assets/images/app-calendar/help-3.png',
+ title: 'Customize Event Types',
+ description:
+ 'Tailor your invitee experience and ensure you’re collecting the information you need when they book.',
+ },
+ {
+ image: 'assets/images/app-calendar/help-4.png',
+ title: 'Embed Option',
+ description:
+ 'Discover options for adding Calendly to your website, ensuring your visitors schedule at the height of their interest.',
+ },
+ {
+ image: 'assets/images/app-calendar/help-5.png',
+ title: 'Team Scheduling',
+ description: 'Find out how to configure multi-user scheduling.',
+ },
+ {
+ image: 'assets/images/app-calendar/help-6.png',
+ title: 'Integration',
+ description:
+ 'Connect the tools in your workflow directly to Calendly, or learn about what we’ve built to streamline your scheduling.',
+ },
+]
diff --git a/apiferia/src/app/views/calendar/calendar.route.ts b/apiferia/src/app/views/calendar/calendar.route.ts
new file mode 100644
index 00000000..b527d3b5
--- /dev/null
+++ b/apiferia/src/app/views/calendar/calendar.route.ts
@@ -0,0 +1,22 @@
+import { Route } from '@angular/router'
+import { ScheduleComponent } from './schedule/schedule.component'
+import { IntegrationComponent } from './integration/integration.component'
+import { CalendarHelpComponent } from './calendar-help/calendar-help.component'
+
+export const CALENDAR_ROUTES: Route[] = [
+ {
+ path: 'schedule',
+ component: ScheduleComponent,
+ data: { title: 'Schedule' },
+ },
+ {
+ path: 'integration',
+ component: IntegrationComponent,
+ data: { title: 'Integration' },
+ },
+ {
+ path: 'help',
+ component: CalendarHelpComponent,
+ data: { title: 'Help' },
+ },
+]
diff --git a/apiferia/src/app/views/calendar/integration/data.ts b/apiferia/src/app/views/calendar/integration/data.ts
new file mode 100644
index 00000000..b85e4272
--- /dev/null
+++ b/apiferia/src/app/views/calendar/integration/data.ts
@@ -0,0 +1,114 @@
+export type IntegrationType = {
+ name: string
+ image: string
+ description: string
+ checked: boolean
+}
+
+export const IntegrationData: IntegrationType[] = [
+ {
+ name: 'Google Mail',
+ image: 'assets/images/app-calendar/google-mail.png',
+ description:
+ 'You can tap on an upcoming meeting to see the details and join the call.',
+ checked: true,
+ },
+ {
+ name: 'Google Analytics',
+ image: 'assets/images/app-calendar/google-analytics.png',
+ description:
+ 'You can measure your advertising ROI as well as track your video, applications, social media.',
+ checked: false,
+ },
+ {
+ name: 'Google Meet',
+ image: 'assets/images/app-calendar/google-meet.png',
+ description:
+ 'It is one of two apps that constitute the replacement for Google Hangouts and Google Chat.',
+ checked: true,
+ },
+ {
+ name: 'Intercom',
+ image: 'assets/images/app-calendar/intercom.png',
+ description:
+ 'It is the complete customer messaging platform to drive across the entire lifecycle.',
+ checked: false,
+ },
+ {
+ name: 'Microsoft Outlook',
+ image: 'assets/images/app-calendar/microsoft-outlook.png',
+ description:
+ 'Schedule an online meeting using Outlook Open Outlook and go to your calendar.',
+ checked: true,
+ },
+ {
+ name: 'Google Chrome',
+ image: 'assets/images/app-calendar/google-chrome.png',
+ description:
+ 'Using your browser, share your video, desktop, and presentations with teammates and customers.',
+ checked: true,
+ },
+ {
+ name: 'HubSpot',
+ image: 'assets/images/app-calendar/hubspot.png',
+ description:
+ 'Give prospects the power to book meetings with you, and save hours of time on unnecessary emailing.',
+ checked: true,
+ },
+ {
+ name: 'Stripe',
+ image: 'assets/images/app-calendar/stripe.png',
+ description:
+ 'Sessions is a free conference for payments leaders, developers, founders, and curious observers.',
+ checked: false,
+ },
+ {
+ name: 'Slack',
+ image: 'assets/images/app-calendar/slack.png',
+ description:
+ 'It is the collaboration hub that brings the right people, information and tools together to get work done.',
+ checked: false,
+ },
+ {
+ name: 'Salesforce',
+ image: 'assets/images/app-calendar/sales-force.png',
+ description:
+ 'It provides an interface that gives salespeople useful data stored in Salesforce to lead impactful calls.',
+ checked: true,
+ },
+ {
+ name: 'Web Hooks',
+ image: 'assets/images/app-calendar/web-hooks.png',
+ description:
+ 'Webhooks as a medium to notify third-party applications (consumer applications) about events that occur in a Zoom account.',
+ checked: false,
+ },
+ {
+ name: 'Facebook',
+ image: 'assets/images/app-calendar/facebook.png',
+ description:
+ 'Messenger Rooms, allows to create a video meeting and invite their friends to join, even if those people are not Facebook users.',
+ checked: true,
+ },
+ {
+ name: 'Microsoft Team Conference',
+ image: 'assets/images/app-calendar/microsoft-team-conference.png',
+ description:
+ 'It automatically include Microsoft Teams conferencing Meetings in Teams include audio, video, and screen sharing.',
+ checked: false,
+ },
+ {
+ name: 'Zapier',
+ image: 'assets/images/app-calendar/zapier.png',
+ description:
+ 'Zapier lets you connect Google Meet with thousands of the most popular apps, so you can automate your work and have more time.',
+ checked: true,
+ },
+ {
+ name: 'Zoom',
+ image: 'assets/images/app-calendar/zoom.png',
+ description:
+ 'Zoom Cloud Meetings is a proprietary video teleconferencing software program developed by Zoom Video Communications.',
+ checked: false,
+ },
+]
diff --git a/apiferia/src/app/views/calendar/integration/integration.component.html b/apiferia/src/app/views/calendar/integration/integration.component.html
new file mode 100644
index 00000000..0a33e1ac
--- /dev/null
+++ b/apiferia/src/app/views/calendar/integration/integration.component.html
@@ -0,0 +1,33 @@
+
+
+
+ @for (item of integrationList; track $index) {
+
+
+
+
+
+
+ {{ item.name }}
+
+
+ {{ item.description }}
+
+
+
+
+ }
+
diff --git a/apiferia/src/app/views/calendar/integration/integration.component.spec.ts b/apiferia/src/app/views/calendar/integration/integration.component.spec.ts
new file mode 100644
index 00000000..067d732d
--- /dev/null
+++ b/apiferia/src/app/views/calendar/integration/integration.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { IntegrationComponent } from './integration.component'
+
+describe('IntegrationComponent', () => {
+ let component: IntegrationComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [IntegrationComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(IntegrationComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/calendar/integration/integration.component.ts b/apiferia/src/app/views/calendar/integration/integration.component.ts
new file mode 100644
index 00000000..80808f57
--- /dev/null
+++ b/apiferia/src/app/views/calendar/integration/integration.component.ts
@@ -0,0 +1,14 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component } from '@angular/core'
+import { IntegrationData } from './data'
+
+@Component({
+ selector: 'app-integration',
+ standalone: true,
+ imports: [PageTitleComponent],
+ templateUrl: './integration.component.html',
+ styles: ``,
+})
+export class IntegrationComponent {
+ integrationList = IntegrationData
+}
diff --git a/apiferia/src/app/views/calendar/schedule/schedule.component.html b/apiferia/src/app/views/calendar/schedule/schedule.component.html
new file mode 100644
index 00000000..ffd59e1b
--- /dev/null
+++ b/apiferia/src/app/views/calendar/schedule/schedule.component.html
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+ Add New Schedule
+
+
+
+
+
+ Drag and drop your event or click in the calendar
+
+ @for (data of externalEvents; track $index) {
+
+
+ {{ data.title }}
+
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/calendar/schedule/schedule.component.spec.ts b/apiferia/src/app/views/calendar/schedule/schedule.component.spec.ts
new file mode 100644
index 00000000..c73c150d
--- /dev/null
+++ b/apiferia/src/app/views/calendar/schedule/schedule.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ScheduleComponent } from './schedule.component'
+
+describe('ScheduleComponent', () => {
+ let component: ScheduleComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ScheduleComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ScheduleComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/calendar/schedule/schedule.component.ts b/apiferia/src/app/views/calendar/schedule/schedule.component.ts
new file mode 100644
index 00000000..a584f2c1
--- /dev/null
+++ b/apiferia/src/app/views/calendar/schedule/schedule.component.ts
@@ -0,0 +1,216 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component, inject, ViewChild, type TemplateRef } from '@angular/core'
+import { FullCalendarModule } from '@fullcalendar/angular'
+import { CalendarOptions, EventClickArg, EventInput } from '@fullcalendar/core'
+import interactionPlugin, {
+ DateClickArg,
+ Draggable,
+} from '@fullcalendar/interaction'
+import dayGridPlugin from '@fullcalendar/daygrid'
+import timeGridPlugin from '@fullcalendar/timegrid'
+import bootstrapPlugin from '@fullcalendar/bootstrap'
+import listPlugin from '@fullcalendar/list'
+import { Store } from '@ngrx/store'
+import {
+ FormsModule,
+ ReactiveFormsModule,
+ UntypedFormBuilder,
+ Validators,
+ type UntypedFormGroup,
+} from '@angular/forms'
+import { externalEvents, type externalModel } from '@/app/store/calendar/data'
+import { getEvents } from '@/app/store/calendar/calendar.selectors'
+import {
+ addCalendar,
+ deleteCalendar,
+ fetchCalendar,
+ updateCalendar,
+} from '@/app/store/calendar/calendar.actions'
+import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
+import Swal from 'sweetalert2'
+
+export type CalendarEvent = {
+ id: string
+ title: string
+ start: Date | null
+ end?: Date | null
+ allDay?: boolean
+ classNames?: string[]
+}
+
+type UpdateEventType = {
+ event: CalendarEvent
+}
+
+@Component({
+ selector: 'app-schedule',
+ standalone: true,
+ imports: [
+ PageTitleComponent,
+ FullCalendarModule,
+ FormsModule,
+ ReactiveFormsModule,
+ ],
+ templateUrl: './schedule.component.html',
+ styles: ``,
+})
+export class ScheduleComponent {
+ calendarEvents!: EventInput[]
+ formData!: UntypedFormGroup
+ externalEvents!: externalModel[]
+ editEvent: CalendarEvent | null = null
+ isEditMode = false
+ currentDate!: Date
+
+ private store = inject(Store)
+ private modalService = inject(NgbModal)
+ private formBuilder = inject(UntypedFormBuilder)
+
+ @ViewChild('modalShow') modalShow!: TemplateRef
+
+ ngOnInit() {
+ // Fetch Calendar Event
+ this.store.dispatch(fetchCalendar())
+ this.store.select(getEvents).subscribe((data) => {
+ this.calendarEvents = data
+ })
+
+ this.externalEvents = externalEvents
+
+ // Validation
+ this.formData = this.formBuilder.group({
+ title: ['', [Validators.required]],
+ className: ['', [Validators.required]],
+ })
+ }
+
+ ngAfterViewInit() {
+ setTimeout(() => {
+ this.initializeDraggable()
+ }, 500)
+ }
+
+ private initializeDraggable() {
+ const externalEventContainerEl = document.getElementById('external-events')
+
+ if (externalEventContainerEl) {
+ new Draggable(externalEventContainerEl, {
+ itemSelector: '.external-event',
+ eventData: (eventEl) => ({
+ id: Math.floor(Math.random() * 11000),
+ title: eventEl.innerText,
+ allDay: true,
+ start: new Date(),
+ className: eventEl.getAttribute('id'),
+ }),
+ })
+ }
+ }
+
+ calendarOptions: CalendarOptions = {
+ plugins: [
+ dayGridPlugin,
+ listPlugin,
+ interactionPlugin,
+ timeGridPlugin,
+ bootstrapPlugin,
+ ],
+ headerToolbar: {
+ right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth',
+ center: 'title',
+ left: 'prev,next today',
+ },
+ bootstrapFontAwesome: false,
+ buttonText: {
+ today: 'Today',
+ month: 'Month',
+ week: 'Week',
+ day: 'Day',
+ list: 'List',
+ prev: 'Prev',
+ next: 'Next',
+ },
+ themeSystem: 'bootstrap',
+ initialView: 'dayGridMonth',
+ initialEvents: this.calendarEvents,
+ height: window.innerHeight - 200,
+ droppable: true,
+ editable: true,
+ selectable: true,
+ eventReceive: (info) => this.updateEvent(info),
+ eventClick: this.handleEventClick.bind(this),
+ dateClick: this.openModal.bind(this),
+ }
+
+ updateEvent(info: UpdateEventType) {
+ var newEvent = {
+ id: info.event.id,
+ title: info.event.title,
+ start: info.event.start!,
+ allDay: info.event.allDay,
+ className: info.event.classNames,
+ }
+ this.store.dispatch(addCalendar({ events: newEvent }))
+ }
+
+ openModal(events: DateClickArg) {
+ this.currentDate = events.date
+ this.modalService.open(this.modalShow, { centered: true })
+ }
+
+ // Handle Edit Event
+ handleEventClick(clickInfo: EventClickArg) {
+ this.isEditMode = true
+ this.editEvent = clickInfo.event
+ this.formData.patchValue({
+ title: this.editEvent.title,
+ className: this.editEvent.classNames,
+ })
+ this.modalService.open(this.modalShow, { centered: true })
+ }
+
+ // Create New Event
+ createEvent() {
+ this.currentDate = new Date()
+ this.modalService.open(this.modalShow, { centered: true })
+ }
+
+ saveEvent() {
+ if (this.isEditMode == true) {
+ const newEvent = {
+ ...this.formData.value,
+ id: this.editEvent?.id,
+ start: this.editEvent?.start,
+ end: this.editEvent?.end ? this.editEvent?.end : this.editEvent?.start,
+ }
+ this.store.dispatch(updateCalendar({ events: newEvent }))
+ } else {
+ const newEvent = {
+ id: (this.calendarEvents.length + 1).toString(),
+ ...this.formData.value,
+ start: this.currentDate,
+ }
+ this.store.dispatch(addCalendar({ events: newEvent }))
+ }
+ this.formData.reset()
+ this.modalService.dismissAll()
+ this.isEditMode = false
+ }
+
+ // Delete Event
+ deleteEvent() {
+ this.store.dispatch(
+ deleteCalendar({ id: this.editEvent?.id ? this.editEvent?.id : '' })
+ )
+ Swal.fire({
+ position: 'center',
+ icon: 'success',
+ title: 'Event has been deleted',
+ showConfirmButton: false,
+ timer: 1000,
+ })
+ this.modalService.dismissAll()
+ this.isEditMode = false
+ this.formData.reset()
+ }
+}
diff --git a/apiferia/src/app/views/car-view/car-view.component.html b/apiferia/src/app/views/car-view/car-view.component.html
new file mode 100644
index 00000000..ec97f42b
--- /dev/null
+++ b/apiferia/src/app/views/car-view/car-view.component.html
@@ -0,0 +1,847 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/apiferia/src/app/views/car-view/car-view.component.scss b/apiferia/src/app/views/car-view/car-view.component.scss
new file mode 100644
index 00000000..90ab2b32
--- /dev/null
+++ b/apiferia/src/app/views/car-view/car-view.component.scss
@@ -0,0 +1,780 @@
+.font-icon-box {
+ font-size: 13px;
+}
+
+.text-detalles {
+ font-size: 25px;
+ color: #333;
+ font-weight: bold;
+}
+
+.icon-box-padding {
+ padding-right: 5px;
+}
+
+.pricetxt {
+ flex: 0 0 50%;
+ margin-right: 10px;
+}
+
+
+.textdealer {
+ text-align: center;
+}
+
+.txtmonth {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding-top: 2%;
+ text-align: center;
+}
+
+.pagomens {
+ font-weight: bold;
+ padding-bottom: 2%;
+ text-align: center;
+}
+
+.dealer-item {
+ flex: none;
+ width: 130px;
+ height: 60px;
+ min-width: 130px;
+ margin-bottom: 10px;
+ // border-radius: 8px;
+ // padding: 8px;
+ // background: white;
+ // cursor: pointer;
+ // transition: all 0.3s ease;
+
+ // ← PREVENIR SELECCIÓN
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+
+ // ← PREVENIR DRAG DE IMAGEN
+ img {
+ border-radius: 150px;
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+ pointer-events: none;
+ user-select: none;
+ -webkit-user-select: none;
+ -webkit-user-drag: none; // ← IMPORTANTE
+ -webkit-touch-callout: none;
+ }
+}
+
+// SLIDER SUAVE - FORZAR ANCHO TOTAL
+.bank-selector {
+ margin: 20px 0;
+ width: 100%;
+ overflow-x: auto; // ← CAMBIO: permitir scroll horizontal del contenedor
+ overflow-y: hidden;
+ position: relative;
+}
+
+.banks-scroll {
+ display: flex;
+ overflow-x: auto;
+ overflow-y: hidden;
+ padding: 15px 0;
+ gap: 15px;
+ width: max-content;
+ min-width: 100%;
+
+ scroll-behavior: smooth;
+ -webkit-overflow-scrolling: touch;
+ cursor: grab;
+
+ // ← PREVENIR SELECCIÓN DE TEXTO
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+
+ &:active {
+ cursor: grabbing;
+ }
+}
+
+.bank-item {
+ flex: none;
+ width: 130px;
+ height: 85px;
+ min-width: 130px;
+
+ border: 2px solid #ddd;
+ border-radius: 8px;
+ padding: 8px;
+ background: white;
+ cursor: pointer;
+ transition: all 0.3s ease;
+
+ // ← PREVENIR SELECCIÓN
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+
+ // ← PREVENIR DRAG DE IMAGEN
+ img {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
+ display: block;
+ pointer-events: none;
+ user-select: none;
+ -webkit-user-select: none;
+ -webkit-user-drag: none; // ← IMPORTANTE
+ -webkit-touch-callout: none;
+ }
+}
+
+// Ocultar scrollbar del contenedor padre
+.bank-selector {
+ scrollbar-width: none;
+ -ms-overflow-style: none;
+
+ &::-webkit-scrollbar {
+ display: none;
+ }
+}
+
+// TOGGLE MÓVIL
+.footer-heading-mobie {
+ position: relative;
+
+ h2 {
+ margin: 0;
+ font-size: 18px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+
+ &:after {
+ content: '+';
+ font-size: 24px;
+ font-weight: bold;
+ color: #007bff;
+ transition: all 0.3s ease;
+ line-height: 1;
+ }
+ }
+
+ &.active {
+ background: #007bff;
+ color: white;
+
+ h2 {
+ color: white;
+
+ &:after {
+ content: '−';
+ color: white;
+ }
+ }
+ }
+
+ &:hover:not(.active) {
+ background: #e9ecef;
+ }
+}
+
+.tf-collapse-content {
+ display: none;
+ opacity: 0;
+ transform: translateY(-10px);
+ transition: all 0.3s ease;
+
+ &.show {
+ display: block !important;
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+// RESPONSIVE
+@media (max-width: 768px) {
+ .footer-heading-desktop {
+ display: none !important;
+ }
+
+ .footer-heading-mobie {
+ display: block !important;
+ }
+
+ .footer-col-block .tf-collapse-content {
+ display: none;
+ }
+
+ .bank-item {
+ width: 115px !important;
+ height: 75px !important;
+ min-width: 115px !important;
+ }
+
+ .banks-scroll {
+ gap: 12px;
+ padding: 10px 5px;
+ }
+}
+
+@media (min-width: 769px) {
+ .footer-heading-mobie {
+ display: none !important;
+ }
+
+ .footer-heading-desktop {
+ display: block !important;
+ }
+
+ .tf-collapse-content {
+ display: block !important;
+ opacity: 1 !important;
+ transform: none !important;
+ }
+
+ .bank-item {
+ width: 130px !important;
+ height: 85px !important;
+ min-width: 130px !important;
+ }
+}
+
+// Información del banco seleccionado
+.bank-info {
+ margin-top: 20px;
+ padding: 20px;
+ background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
+ border-radius: 12px;
+ border: 1px solid #dee2e6;
+ box-shadow: 0 2px 10px rgba(0,0,0,0.05);
+ transition: all 0.3s ease;
+
+ &.show {
+ animation: slideInUp 0.4s ease-out;
+ }
+}
+
+.bank-info-content {
+ text-align: center;
+}
+
+.bank-name {
+ margin: 0 0 15px 0;
+ font-size: 18px;
+ font-weight: bold;
+ color: #333;
+ border-bottom: 2px solid #007bff;
+ padding-bottom: 10px;
+ display: inline-block;
+}
+
+.bank-details {
+ display: flex;
+ justify-content: space-around;
+ flex-wrap: wrap;
+ gap: 15px;
+ margin-top: 15px;
+}
+
+.bank-detail-item {
+ flex: 1;
+ min-width: 200px;
+ padding: 12px;
+ background: white;
+ border-radius: 8px;
+ border: 1px solid #e9ecef;
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 4px 15px rgba(0,123,255,0.1);
+ }
+}
+
+.detail-label {
+ display: block;
+ font-size: 14px;
+ color: #666;
+ margin-bottom: 5px;
+ font-weight: 500;
+}
+
+.detail-value {
+ display: block;
+ font-size: 16px;
+ font-weight: bold;
+ color: #007bff;
+}
+
+.loading-indicator {
+ margin-top: 15px;
+ padding: 10px;
+ color: #666;
+ font-style: italic;
+
+ span {
+ position: relative;
+
+ &::after {
+ content: '';
+ animation: dots 1.5s steps(5, end) infinite;
+ }
+ }
+}
+
+// Animación de entrada
+@keyframes slideInUp {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes dots {
+ 0%, 20% { content: ''; }
+ 40% { content: '.'; }
+ 60% { content: '..'; }
+ 80%, 100% { content: '...'; }
+}
+
+// Responsive
+@media (max-width: 768px) {
+ .bank-details {
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .bank-detail-item {
+ min-width: auto;
+ }
+
+ .bank-name {
+ font-size: 16px;
+ }
+}
+
+// Estilos que imitan perfectamente nice-select
+.custom-select {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #fff;
+ border: 1px solid #E5E5EA !important;
+ border-radius: 14px;
+ padding: 14px 17px;
+ box-sizing: border-box;
+ clear: both;
+ cursor: pointer;
+ display: block;
+ font-family: var(--paraFont);
+ font-size: 16px;
+ font-weight: 400;
+ outline: none;
+ position: relative;
+ transition: all linear .2s;
+ user-select: none;
+ white-space: nowrap;
+ width: 100%;
+
+ // Estados activo, abierto y focus
+ &:active,
+ &.open,
+ &:focus {
+ border-color: #999;
+ }
+
+ // Flecha exactamente igual
+ &::after {
+ border-bottom: 1.7px solid #3A3A3C;
+ border-right: 1.7px solid #3A3A3C;
+ content: '';
+ height: 8px;
+ width: 8px;
+ margin-top: -4px;
+ pointer-events: none;
+ position: absolute;
+ right: 24px;
+ top: 50%;
+ -webkit-transform-origin: 66% 66%;
+ -ms-transform-origin: 66% 66%;
+ transform-origin: 66% 66%;
+ -webkit-transform: rotate(45deg);
+ -ms-transform: rotate(45deg);
+ transform: rotate(45deg);
+ -webkit-transition: all 0.15s ease-in-out;
+ transition: all 0.15s ease-in-out;
+ }
+
+ // Flecha cuando está abierto
+ &.open::after {
+ -webkit-transform: rotate(-135deg);
+ -ms-transform: rotate(-135deg);
+ transform: rotate(-135deg);
+ -moz-transform: rotate(-135deg);
+ -o-transform: rotate(-135deg);
+ }
+
+ // Estado deshabilitado
+ &.disabled {
+ border-color: #ededed;
+ color: #999;
+ pointer-events: none;
+
+ &::after {
+ border-color: #cccccc;
+ }
+ }
+
+ // Lista desplegable (copia exacta)
+ .list {
+ background-color: #fff;
+ border-radius: 5px;
+ box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11);
+ box-sizing: border-box;
+ margin-top: 4px;
+ opacity: 0;
+ overflow: hidden;
+ padding: 0;
+ pointer-events: none;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ -webkit-transform-origin: 50% 0;
+ -ms-transform-origin: 50% 0;
+ transform-origin: 50% 0;
+ -webkit-transform: scale(0.75) translateY(-21px);
+ -ms-transform: scale(0.75) translateY(-21px);
+ transform: scale(0.75) translateY(-21px);
+ -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
+ transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
+ z-index: 9;
+ width: 100%;
+ font-size: 14px;
+ max-height: 155px;
+ overflow: auto;
+
+ // Scrollbar personalizada (copia exacta)
+ &::-webkit-scrollbar-track {
+ -webkit-box-shadow: inset 0 0 6px rgb(0 0 0 / 30%);
+ background-color: #f5f5f5;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -webkit-transform: translate3d(0,0,0);
+ -moz-transform: translate3d(0,0,0);
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: #a7a7a7;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -webkit-transform: translate3d(0,0,0);
+ -moz-transform: translate3d(0,0,0);
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ height: 4px;
+ background-color: #f5f5f5;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ -webkit-backface-visibility: hidden;
+ -moz-backface-visibility: hidden;
+ -webkit-transform: translate3d(0,0,0);
+ -moz-transform: translate3d(0,0,0);
+ }
+
+ // Efecto hover en lista
+ &:hover .option:not(:hover) {
+ background-color: transparent !important;
+ }
+ }
+
+ // Lista cuando está abierto
+ &.open .list {
+ opacity: 1;
+ z-index: 10;
+ pointer-events: auto;
+ -webkit-transform: scale(1) translateY(0);
+ -ms-transform: scale(1) translateY(0);
+ transform: scale(1) translateY(0);
+ width: 100%;
+ -moz-transform: scale(1) translateY(0);
+ -o-transform: scale(1) translateY(0);
+ }
+
+ // Opciones (copia exacta)
+ .option {
+ cursor: pointer;
+ font-weight: 400;
+ line-height: 40px;
+ list-style: none;
+ min-height: 40px;
+ outline: none;
+ padding-left: 18px;
+ padding-right: 29px;
+ text-align: left;
+ -webkit-transition: all 0.2s;
+ transition: all 0.2s;
+
+ // Estados hover y focus (copia exacta)
+ &:hover,
+ &.focus,
+ &.selected.focus {
+ background-color: #f6f6f6;
+ }
+
+ // Opción seleccionada (copia exacta)
+ &.selected {
+ font-weight: 600;
+ color: #FF7101; // ← Color naranja exacto
+ }
+
+ // Opción deshabilitada
+ &.disabled {
+ background-color: transparent;
+ color: #999;
+ cursor: default;
+ }
+ }
+}
+
+// Variantes adicionales si las necesitas
+.custom-select.wide {
+ width: 100%;
+
+ .list {
+ left: 0 !important;
+ right: 0 !important;
+ }
+}
+
+.custom-select.small {
+ font-size: 12px;
+ height: 36px;
+ line-height: 34px;
+
+ &::after {
+ height: 4px;
+ width: 4px;
+ }
+
+ .option {
+ line-height: 34px;
+ min-height: 34px;
+ }
+}
+
+// Responsive
+@media (max-width: 768px) {
+ .custom-select {
+ font-size: 14px;
+ padding: 12px 15px;
+
+ &::after {
+ right: 20px;
+ }
+
+ .list {
+ font-size: 13px;
+ max-height: 120px;
+ }
+
+ .option {
+ padding-left: 15px;
+ padding-right: 25px;
+ line-height: 36px;
+ min-height: 36px;
+ }
+ }
+}
+
+// ← IMPORTANTE: Usar ::ng-deep para que Angular no aisle los estilos
+::ng-deep .custom-select {
+ -webkit-tap-highlight-color: transparent;
+ background-color: #fff;
+ border: 1px solid #E5E5EA !important;
+ border-radius: 14px;
+ padding: 14px 17px;
+ box-sizing: border-box;
+ clear: both;
+ cursor: pointer;
+ display: block;
+ font-family: var(--paraFont);
+ font-size: 16px;
+ font-weight: 400;
+ outline: none;
+ position: relative;
+ transition: all linear .2s;
+ user-select: none;
+ white-space: nowrap;
+ width: 100%;
+
+ // Estados activo, abierto y focus
+ &:active,
+ &.open,
+ &:focus {
+ border-color: #999;
+ }
+
+ // Flecha exactamente igual
+ &::after {
+ border-bottom: 1.7px solid #3A3A3C;
+ border-right: 1.7px solid #3A3A3C;
+ content: '';
+ height: 8px;
+ width: 8px;
+ margin-top: -4px;
+ pointer-events: none;
+ position: absolute;
+ right: 24px;
+ top: 50%;
+ transform-origin: 66% 66%;
+ transform: rotate(45deg);
+ transition: all 0.15s ease-in-out;
+ }
+
+ // Flecha cuando está abierto
+ &.open::after {
+ transform: rotate(-135deg);
+ }
+
+ // Estado deshabilitado
+ &.disabled {
+ border-color: #ededed;
+ color: #999;
+ pointer-events: none;
+
+ &::after {
+ border-color: #cccccc;
+ }
+ }
+
+ // ← CRÍTICO: Lista desplegable con ::ng-deep
+ .list {
+ background-color: #fff !important;
+ border-radius: 5px !important;
+ box-shadow: 0 0 0 1px rgba(68, 68, 68, 0.11) !important;
+ box-sizing: border-box !important;
+ margin-top: 4px !important;
+ opacity: 0 !important;
+ overflow: hidden !important;
+ padding: 0 !important;
+ pointer-events: none !important;
+ position: absolute !important;
+ top: 100% !important;
+ left: 0 !important;
+ transform-origin: 50% 0 !important;
+ transform: scale(0.75) translateY(-21px) !important;
+ transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out !important;
+ z-index: 1000 !important;
+ width: 100% !important;
+ font-size: 14px !important;
+ max-height: 155px !important;
+ overflow-y: auto !important;
+ list-style: none !important;
+ margin: 0 !important;
+ margin-top: 4px !important;
+
+ // Scrollbar personalizada
+ &::-webkit-scrollbar-track {
+ -webkit-box-shadow: inset 0 0 6px rgb(0 0 0 / 30%);
+ background-color: #f5f5f5;
+ border-radius: 5px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: #a7a7a7;
+ border-radius: 5px;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ height: 4px;
+ background-color: #f5f5f5;
+ border-radius: 5px;
+ }
+
+ // Efecto hover en lista
+ &:hover .option:not(:hover) {
+ background-color: transparent !important;
+ }
+ }
+
+ // Lista cuando está abierto
+ &.open .list {
+ opacity: 1 !important;
+ z-index: 1000 !important;
+ pointer-events: auto !important;
+ transform: scale(1) translateY(0) !important;
+ }
+
+ // ← CRÍTICO: Opciones con ::ng-deep
+ .option {
+ cursor: pointer !important;
+ font-weight: 400 !important;
+ line-height: 40px !important;
+ list-style: none !important;
+ min-height: 40px !important;
+ outline: none !important;
+ padding-left: 18px !important;
+ padding-right: 29px !important;
+ text-align: left !important;
+ transition: all 0.2s !important;
+ display: block !important;
+ margin: 0 !important;
+
+ // Estados hover y focus
+ &:hover,
+ &.focus,
+ &.selected.focus {
+ background-color: #f6f6f6 !important;
+ }
+
+ // ← CRÍTICO: Opción seleccionada
+ &.selected {
+ font-weight: 600 !important;
+ color: #FF7101 !important; // Color naranja exacto
+ background-color: transparent !important;
+ }
+
+ // Opción deshabilitada
+ &.disabled {
+ background-color: transparent !important;
+ color: #999 !important;
+ cursor: default !important;
+ }
+ }
+}
+
+// ← TAMBIÉN agregar para el selector específico por ID
+::ng-deep #termSelector {
+ &.custom-select {
+ // Forzar estilos específicos
+ display: block !important;
+
+ .list {
+ display: none !important;
+ }
+
+ &.open .list {
+ display: block !important;
+ }
+ }
+}
\ No newline at end of file
diff --git a/apiferia/src/app/views/car-view/car-view.component.spec.ts b/apiferia/src/app/views/car-view/car-view.component.spec.ts
new file mode 100644
index 00000000..e1e2c352
--- /dev/null
+++ b/apiferia/src/app/views/car-view/car-view.component.spec.ts
@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CarViewComponent } from './car-view.component';
+
+describe('CarViewComponent', () => {
+ let component: CarViewComponent;
+ let fixture: ComponentFixture;
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [CarViewComponent]
+ })
+ .compileComponents();
+
+ fixture = TestBed.createComponent(CarViewComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should create', () => {
+ expect(component).toBeTruthy();
+ });
+});
diff --git a/apiferia/src/app/views/car-view/car-view.component.ts b/apiferia/src/app/views/car-view/car-view.component.ts
new file mode 100644
index 00000000..16459923
--- /dev/null
+++ b/apiferia/src/app/views/car-view/car-view.component.ts
@@ -0,0 +1,1135 @@
+import { Component, AfterViewInit, OnDestroy } from '@angular/core';
+
+// Interface para los datos del banco
+interface BankData {
+ name: string;
+ interestRate: string;
+ financingTotal: string;
+ availableTerms: TermOption[];
+}
+
+interface TermOption {
+ value: string;
+ label: string;
+ months: number;
+}
+
+@Component({
+ selector: 'app-car-view',
+ imports: [],
+ templateUrl: './car-view.component.html',
+ styleUrl: './car-view.component.scss'
+})
+export class CarViewComponent implements AfterViewInit, OnDestroy {
+
+ ngAfterViewInit() {
+ // Esperar a que Angular termine de renderizar
+ setTimeout(() => {
+ this.initializePlugins();
+ }, 500);
+ }
+
+ ngOnDestroy() {
+ // Limpiar eventos cuando se destruya el componente
+ this.destroyPlugins();
+ }
+
+ private initializePlugins() {
+ console.log('🚀 Inicializando plugins...');
+ this.initSwiper();
+ this.initFancybox();
+ this.initNiceSelect();
+ this.initScrollspy();
+ this.initMobileToggles();
+ // En initializePlugins, cambiar a:
+ setTimeout(() => {
+ this.initSmoothBankSlider();
+ this.initBankClicks();
+ this.initSimpleTermSelector(); // ← Cambiar aquí
+ }, 1000);
+
+ }
+
+ // Variables para controlar drag vs click
+ private isDragging = false;
+ private startX = 0;
+ private startY = 0;
+ private dragThreshold = 5; // píxeles mínimos para considerar drag
+
+ // Variables para información del banco
+ private bankDataCache: { [key: string]: BankData } = {};
+ private selectedTerm: TermOption | null = null;
+
+ // ← FUNCIÓN MEJORADA PARA MANEJAR CLICKS SIN INTERFERENCIA CON SCROLL
+ private initBankClicks() {
+ setTimeout(() => {
+ console.log('🏦 Configurando clicks de bancos...');
+ const bankItems = document.querySelectorAll('.bank-item');
+ console.log('Bancos encontrados:', bankItems.length);
+
+ bankItems.forEach((item, index) => {
+ let mouseDownTime = 0;
+ let mouseDownX = 0;
+ let mouseDownY = 0;
+ let hasMoved = false;
+
+ // Mouse/Touch down
+ const handleStart = (e: Event) => {
+ mouseDownTime = Date.now();
+ hasMoved = false;
+
+ if (e.type === 'mousedown') {
+ const mouseEvent = e as MouseEvent;
+ mouseDownX = mouseEvent.clientX;
+ mouseDownY = mouseEvent.clientY;
+ } else if (e.type === 'touchstart') {
+ const touchEvent = e as TouchEvent;
+ mouseDownX = touchEvent.touches[0].clientX;
+ mouseDownY = touchEvent.touches[0].clientY;
+ }
+ };
+
+ // Mouse/Touch move
+ const handleMove = (e: Event) => {
+ let currentX = 0;
+ let currentY = 0;
+
+ if (e.type === 'mousemove') {
+ const mouseEvent = e as MouseEvent;
+ currentX = mouseEvent.clientX;
+ currentY = mouseEvent.clientY;
+ } else if (e.type === 'touchmove') {
+ const touchEvent = e as TouchEvent;
+ currentX = touchEvent.touches[0].clientX;
+ currentY = touchEvent.touches[0].clientY;
+ }
+
+ const deltaX = Math.abs(currentX - mouseDownX);
+ const deltaY = Math.abs(currentY - mouseDownY);
+
+ // Si se movió más del threshold, es drag
+ if (deltaX > this.dragThreshold || deltaY > this.dragThreshold) {
+ hasMoved = true;
+ }
+ };
+
+ // Mouse/Touch up - aquí decidimos si es click o drag
+ const handleEnd = (e: Event) => {
+ const clickDuration = Date.now() - mouseDownTime;
+
+ // Solo procesar como click si:
+ // 1. No se movió mucho (no es drag)
+ // 2. Duración corta (no es long press)
+ // 3. No está en modo dragging del slider
+ if (!hasMoved && clickDuration < 300 && !this.isSliderDragging) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const bankName = item.getAttribute('data-bank') || `Banco ${index + 1}`;
+ console.log(`${bankName} seleccionado`);
+
+ // Remover selección anterior
+ bankItems.forEach(bank => bank.classList.remove('selected'));
+
+ // Agregar selección actual
+ item.classList.add('selected');
+
+ // Llamar función de selección
+ this.selectBank(bankName);
+ }
+ };
+
+ // Agregar event listeners
+ item.addEventListener('mousedown', handleStart);
+ item.addEventListener('mousemove', handleMove);
+ item.addEventListener('mouseup', handleEnd);
+ item.addEventListener('touchstart', handleStart);
+ item.addEventListener('touchmove', handleMove);
+ item.addEventListener('touchend', handleEnd);
+
+ // Prevenir el click si es drag
+ item.addEventListener('click', (e) => {
+ if (hasMoved || this.isSliderDragging) {
+ e.preventDefault();
+ e.stopPropagation();
+ }
+ });
+ });
+
+ console.log('✅ Clicks de bancos configurados');
+ }, 1600);
+ }
+
+ private initMobileToggles() {
+ setTimeout(() => {
+ console.log('🔧 Configurando toggles móviles...');
+
+ const mobileHeaders = document.querySelectorAll('.footer-heading-mobie');
+ console.log('Headers móviles encontrados:', mobileHeaders.length);
+
+ mobileHeaders.forEach((header, index) => {
+ header.addEventListener('click', (e) => {
+ e.preventDefault();
+ console.log(`📱 Click en header móvil ${index + 1}:`, header);
+
+ const parent = header.closest('.footer-col-block');
+ if (parent) {
+ const content = parent.querySelector('.tf-collapse-content');
+ console.log('Contenido encontrado:', !!content);
+
+ if (content) {
+ if (content.classList.contains('show')) {
+ content.classList.remove('show');
+ header.classList.remove('active');
+ console.log('✅ Contenido ocultado');
+ } else {
+ content.classList.add('show');
+ header.classList.add('active');
+ console.log('✅ Contenido mostrado');
+ }
+ }
+ }
+ });
+ });
+
+ console.log('✅ Toggles móviles configurados');
+ }, 2000);
+ }
+
+ private initSwiper() {
+ const swiperElement = document.querySelector('.mainslider');
+ if (swiperElement && typeof (window as any).Swiper !== 'undefined') {
+ try {
+ new (window as any).Swiper('.mainslider', {
+ slidesPerView: 1,
+ spaceBetween: 0,
+ loop: true,
+ navigation: {
+ nextEl: '.swiper-button-next',
+ prevEl: '.swiper-button-prev',
+ },
+ autoplay: {
+ delay: 5000,
+ disableOnInteraction: false,
+ }
+ });
+ } catch (error) {
+ console.log('Swiper initialization skipped:', error);
+ }
+ }
+ }
+
+ private initFancybox() {
+ if (typeof (window as any).$ !== 'undefined' && (window as any).$.fancybox) {
+ try {
+ (window as any).$('[data-fancybox="gallery"]').fancybox({
+ buttons: ['zoom', 'slideShow', 'fullScreen', 'close'],
+ loop: true,
+ protect: true
+ });
+ } catch (error) {
+ console.log('Fancybox initialization skipped:', error);
+ }
+ }
+ }
+
+ private initNiceSelect() {
+ if (typeof (window as any).$ !== 'undefined' && (window as any).$.fn.niceSelect) {
+ try {
+ (window as any).$('.nice-select').niceSelect();
+ } catch (error) {
+ console.log('NiceSelect initialization skipped:', error);
+ }
+ }
+ }
+
+ private initScrollspy() {
+ setTimeout(() => {
+ console.log('🔍 Buscando elementos...');
+
+ const nav = document.getElementById('navbar-example2');
+ const scrollContainer = document.querySelector('[data-bs-spy="scroll"]');
+
+ console.log('Nav encontrado:', !!nav);
+ console.log('Scroll container encontrado:', !!scrollContainer);
+
+ if (nav && scrollContainer) {
+ console.log('✅ Elementos encontrados, configurando scroll manual');
+ this.setupSimpleScrollSpy();
+ } else {
+ console.log('❌ Elementos no encontrados');
+ }
+ }, 2000);
+ }
+
+ private setupSimpleScrollSpy() {
+ const links = document.querySelectorAll('#navbar-example2 .nav-link');
+ console.log('Links encontrados:', links.length);
+
+ for (let i = 0; i < links.length; i++) {
+ const link = links[i] as HTMLElement;
+
+ link.onclick = (e) => {
+ e.preventDefault();
+ console.log(`📍 Click en link ${i + 1}`);
+
+ const href = link.getAttribute('href');
+ console.log('Href:', href);
+
+ if (href) {
+ const target = document.querySelector(href);
+ console.log('Target encontrado:', !!target);
+
+ if (target) {
+ for (let j = 0; j < links.length; j++) {
+ links[j].classList.remove('active');
+ }
+ link.classList.add('active');
+
+ const offsetTop = (target as HTMLElement).offsetTop - 100;
+ window.scrollTo({
+ top: offsetTop,
+ behavior: 'smooth'
+ });
+
+ console.log('✅ Scroll ejecutado a:', offsetTop);
+ }
+ }
+ };
+ }
+
+ console.log('✅ Setup completado con onclick directo');
+ }
+
+ private waitForElements(callback: () => void, maxAttempts: number = 10, attempt: number = 1) {
+ const scrollElement = document.querySelector('[data-bs-spy="scroll"]');
+ const navElement = document.querySelector('#navbar-example2');
+
+ console.log(`Intento ${attempt}: scroll=${!!scrollElement}, nav=${!!navElement}`);
+
+ if (scrollElement && navElement) {
+ console.log('✅ Elementos encontrados, inicializando ScrollSpy');
+ callback();
+ } else if (attempt < maxAttempts) {
+ setTimeout(() => {
+ this.waitForElements(callback, maxAttempts, attempt + 1);
+ }, 200);
+ } else {
+ console.log('❌ No se pudieron encontrar los elementos después de', maxAttempts, 'intentos');
+ }
+ }
+
+ private setupManualScrollSpy() {
+ const sections = [
+ '#scrollspyHeading1',
+ '#scrollspyHeading2',
+ '#scrollspyHeading3',
+ '#scrollspyHeading4',
+ '#scrollspyHeading5'
+ ];
+
+ const navLinks = document.querySelectorAll('#navbar-example2 .nav-link');
+ console.log('NavLinks encontrados:', navLinks.length);
+
+ if (navLinks.length === 0) {
+ console.log('❌ No se encontraron links de navegación');
+ return;
+ }
+
+ const updateActiveNav = () => {
+ let currentSection = '';
+
+ sections.forEach(sectionId => {
+ const section = document.querySelector(sectionId);
+ if (section) {
+ const rect = section.getBoundingClientRect();
+ if (rect.top <= 200 && rect.bottom >= 100) {
+ currentSection = sectionId;
+ }
+ }
+ });
+
+ navLinks.forEach(link => {
+ const href = link.getAttribute('href');
+ if (href === currentSection) {
+ link.classList.add('active');
+ } else {
+ link.classList.remove('active');
+ }
+ });
+ };
+
+ let ticking = false;
+ const handleScroll = () => {
+ if (!ticking) {
+ requestAnimationFrame(() => {
+ updateActiveNav();
+ ticking = false;
+ });
+ ticking = true;
+ }
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ updateActiveNav();
+
+ console.log('✅ ScrollSpy manual configurado');
+ }
+
+ private initSmoothScroll() {
+ const navLinks = document.querySelectorAll('#navbar-example2 .nav-link');
+
+ navLinks.forEach((link, index) => {
+ link.addEventListener('click', (e) => {
+ e.preventDefault();
+
+ const href = (e.target as HTMLElement).getAttribute('href');
+ console.log(`Click en link ${index + 1}:`, href);
+
+ if (href && href.startsWith('#')) {
+ const targetElement = document.querySelector(href);
+ console.log('Elemento target encontrado:', !!targetElement);
+
+ if (targetElement) {
+ const offsetTop = (targetElement as HTMLElement).offsetTop - 120;
+ console.log('Scrolling to:', offsetTop);
+
+ window.scrollTo({
+ top: offsetTop,
+ behavior: 'smooth'
+ });
+
+ navLinks.forEach(l => l.classList.remove('active'));
+ link.classList.add('active');
+ }
+ }
+ });
+ });
+
+ console.log('✅ Smooth scroll configurado para', navLinks.length, 'links');
+ }
+
+ private updateActiveNavLink(activeHref: string) {
+ const navLinks = document.querySelectorAll('#navbar-example2 .nav-link');
+
+ navLinks.forEach(link => {
+ const href = link.getAttribute('href');
+ if (href === activeHref) {
+ link.classList.add('active');
+ } else {
+ link.classList.remove('active');
+ }
+ });
+ }
+
+ private destroyPlugins() {
+ const swiperInstance = (document.querySelector('.mainslider') as any)?.swiper;
+ if (swiperInstance) {
+ swiperInstance.destroy();
+ }
+
+ if (typeof (window as any).$ !== 'undefined' && (window as any).$.fancybox) {
+ (window as any).$.fancybox.close();
+ }
+
+ if (typeof (window as any).$ !== 'undefined' && (window as any).$.fn.niceSelect) {
+ try {
+ (window as any).$('.nice-select').niceSelect('destroy');
+ } catch (error) {
+ // Nice select ya fue destruido
+ }
+ }
+
+ if (typeof (window as any).$ !== 'undefined' && (window as any).$.fn.scrollspy) {
+ try {
+ (window as any).$('[data-bs-spy="scroll"]').scrollspy('dispose');
+ } catch (error) {
+ // ScrollSpy ya fue destruido
+ }
+ }
+
+ const navLinks = document.querySelectorAll('#navbar-example2 .nav-link');
+ navLinks.forEach(link => {
+ const newLink = link.cloneNode(true);
+ link.parentNode?.replaceChild(newLink, link);
+ });
+
+ const mobileHeaders = document.querySelectorAll('.footer-heading-mobie');
+ mobileHeaders.forEach(header => {
+ const newHeader = header.cloneNode(true);
+ header.parentNode?.replaceChild(newHeader, header);
+ });
+
+ const bankItems = document.querySelectorAll('.bank-item');
+ bankItems.forEach(item => {
+ const newItem = item.cloneNode(true);
+ item.parentNode?.replaceChild(newItem, item);
+ });
+ }
+
+ // Variables para el slider de bancos
+ private currentSlide = 0;
+ private slideWidth = 160;
+ private isSliderDragging = false;
+
+ private initSmoothBankSlider() {
+ const container = document.getElementById('banksContainer');
+ if (!container) return;
+
+ let startX = 0;
+ let currentX = 0;
+ let isMouseDown = false;
+ let hasDragged = false;
+
+ // Eventos táctiles
+ container.addEventListener('touchstart', (e) => {
+ startX = e.touches[0].clientX;
+ currentX = startX;
+ hasDragged = false;
+ this.isSliderDragging = false;
+ container.style.transition = 'none';
+ });
+
+ container.addEventListener('touchmove', (e) => {
+ if (!startX) return;
+
+ this.isSliderDragging = true;
+ hasDragged = true;
+ currentX = e.touches[0].clientX;
+ const diffX = currentX - startX;
+ const currentTransform = -this.currentSlide * this.slideWidth;
+
+ container.style.transform = `translateX(${currentTransform + diffX}px)`;
+ });
+
+ container.addEventListener('touchend', (e) => {
+ if (!startX) return;
+
+ const diffX = currentX - startX;
+
+ if (hasDragged && Math.abs(diffX) > 10) {
+ container.style.transition = 'transform 0.3s ease-out';
+
+ if (Math.abs(diffX) > 50) {
+ if (diffX > 0) {
+ this.slideLeft();
+ } else {
+ this.slideRight();
+ }
+ } else {
+ this.updateSlidePosition();
+ }
+ } else {
+ this.updateSlidePosition();
+ }
+
+ // Reset variables
+ startX = 0;
+ currentX = 0;
+ hasDragged = false;
+
+ setTimeout(() => {
+ this.isSliderDragging = false;
+ container.style.transition = 'none';
+ }, 350);
+ });
+
+ // Eventos de mouse para desktop
+ container.addEventListener('mousedown', (e) => {
+ e.preventDefault();
+ startX = e.clientX;
+ currentX = startX;
+ isMouseDown = true;
+ hasDragged = false;
+ this.isSliderDragging = false;
+ container.style.transition = 'none';
+ container.style.cursor = 'grabbing';
+
+ document.addEventListener('mousemove', handleMouseMove);
+ document.addEventListener('mouseup', handleMouseUp);
+ });
+
+ const handleMouseMove = (e: MouseEvent) => {
+ if (!isMouseDown || !startX) return;
+
+ e.preventDefault();
+ this.isSliderDragging = true;
+ hasDragged = true;
+ currentX = e.clientX;
+ const diffX = currentX - startX;
+ const currentTransform = -this.currentSlide * this.slideWidth;
+
+ container.style.transform = `translateX(${currentTransform + diffX}px)`;
+ };
+
+ const handleMouseUp = (e: MouseEvent) => {
+ if (!isMouseDown) return;
+
+ e.preventDefault();
+ isMouseDown = false;
+
+ document.removeEventListener('mousemove', handleMouseMove);
+ document.removeEventListener('mouseup', handleMouseUp);
+
+ const diffX = currentX - startX;
+ container.style.cursor = 'grab';
+
+ if (hasDragged && Math.abs(diffX) > 10) {
+ container.style.transition = 'transform 0.3s ease-out';
+
+ if (Math.abs(diffX) > 50) {
+ if (diffX > 0) {
+ this.slideLeft();
+ } else {
+ this.slideRight();
+ }
+ } else {
+ this.updateSlidePosition();
+ }
+ } else {
+ this.updateSlidePosition();
+ }
+
+ // Reset variables
+ startX = 0;
+ currentX = 0;
+ hasDragged = false;
+
+ setTimeout(() => {
+ this.isSliderDragging = false;
+ container.style.transition = 'none';
+ }, 350);
+ };
+
+ container.addEventListener('mouseleave', () => {
+ if (isMouseDown) {
+ isMouseDown = false;
+ this.isSliderDragging = false;
+ container.style.cursor = 'grab';
+ container.style.transition = 'none';
+ this.updateSlidePosition();
+
+ document.removeEventListener('mousemove', handleMouseMove);
+ document.removeEventListener('mouseup', handleMouseUp);
+
+ // Reset
+ startX = 0;
+ currentX = 0;
+ hasDragged = false;
+ }
+ });
+
+ // Prevenir drag de imágenes
+ const images = container.querySelectorAll('img');
+ images.forEach(img => {
+ img.addEventListener('dragstart', (e) => {
+ e.preventDefault();
+ });
+ img.style.userSelect = 'none';
+ img.style.pointerEvents = 'none';
+ });
+ }
+
+ slideLeft() {
+ if (this.currentSlide > 0) {
+ this.currentSlide--;
+ this.updateSlidePosition();
+ }
+ }
+
+ slideRight() {
+ const maxSlides = 8 - 2;
+ if (this.currentSlide < maxSlides) {
+ this.currentSlide++;
+ this.updateSlidePosition();
+ }
+ }
+
+ private updateSlidePosition() {
+ const container = document.getElementById('banksContainer');
+ if (container) {
+ const translateX = -this.currentSlide * this.slideWidth;
+ container.style.transform = `translateX(${translateX}px)`;
+ }
+ }
+
+ // ← NUEVAS FUNCIONES PARA INFORMACIÓN DEL BANCO
+ selectBank(bankName: string) {
+ console.log(`🏦 BANCO FINAL SELECCIONADO: ${bankName}`);
+
+ // Mostrar la sección de información
+ this.showBankInfo(bankName);
+
+ // Cargar datos del banco
+ this.loadBankData(bankName);
+ }
+
+ private showBankInfo(bankName: string) {
+ const bankInfoElement = document.getElementById('bankInfo');
+ const bankNameElement = document.getElementById('selectedBankName');
+
+ if (bankInfoElement && bankNameElement) {
+ // Mostrar la sección
+ bankInfoElement.style.display = 'block';
+ bankInfoElement.classList.add('show');
+
+ // Actualizar nombre del banco
+ bankNameElement.textContent = bankName;
+
+ // Limpiar datos anteriores
+ this.clearBankDetails();
+
+ // Mostrar indicador de carga
+ this.showLoadingIndicator(true);
+ }
+ }
+
+ private async loadBankData(bankName: string) {
+ try {
+ // Verificar si ya tenemos los datos en caché
+ if (this.bankDataCache[bankName]) {
+ this.displayBankData(this.bankDataCache[bankName]);
+ return;
+ }
+
+ // Simular llamada a API (reemplazar con tu API real)
+ const bankData = await this.fetchBankDataFromAPI(bankName);
+
+ // Guardar en caché
+ this.bankDataCache[bankName] = bankData;
+
+ // Mostrar datos
+ this.displayBankData(bankData);
+
+ } catch (error) {
+ console.error('Error cargando datos del banco:', error);
+ this.showErrorMessage('Error al cargar la información del banco');
+ } finally {
+ this.showLoadingIndicator(false);
+ }
+ }
+
+ // Datos simulados actualizados
+ private async fetchBankDataFromAPI(bankName: string): Promise {
+ // Simular delay de API
+ await new Promise(resolve => setTimeout(resolve, 1000));
+
+ // Datos simulados con términos disponibles - REEMPLAZAR CON TU API
+ const mockData: { [key: string]: BankData } = {
+ 'Confisa': {
+ name: 'Confisa',
+ interestRate: '8.5%',
+ financingTotal: '95%',
+ availableTerms: [
+ { value: '12-months', label: '12 meses', months: 12 },
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 },
+ { value: '60-months', label: '60 meses', months: 60 }
+ ]
+ },
+ 'BACC': {
+ name: 'BACC',
+ interestRate: '7.8%',
+ financingTotal: '90%',
+ availableTerms: [
+ { value: '12-months', label: '12 meses', months: 12 },
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 },
+ { value: '60-months', label: '60 meses', months: 60 },
+ { value: '72-months', label: '72 meses', months: 72 }
+ ]
+ },
+ 'Popular': {
+ name: 'Popular',
+ interestRate: '9.2%',
+ financingTotal: '85%',
+ availableTerms: [
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 },
+ { value: '60-months', label: '60 meses', months: 60 },
+ { value: '72-months', label: '72 meses', months: 72 },
+ { value: '84-months', label: '84 meses', months: 84 }
+ ]
+ },
+ 'Reservas': {
+ name: 'Reservas',
+ interestRate: '7.5%',
+ financingTotal: '92%',
+ availableTerms: [
+ { value: '12-months', label: '12 meses', months: 12 },
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 },
+ { value: '60-months', label: '60 meses', months: 60 },
+ { value: '72-months', label: '72 meses', months: 72 },
+ { value: '84-months', label: '84 meses', months: 84 },
+ { value: '96-months', label: '96 meses', months: 96 }
+ ]
+ },
+ 'BHD': {
+ name: 'BHD',
+ interestRate: '8.1%',
+ financingTotal: '88%',
+ availableTerms: [
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 },
+ { value: '60-months', label: '60 meses', months: 60 },
+ { value: '72-months', label: '72 meses', months: 72 }
+ ]
+ },
+ 'Caribe': {
+ name: 'Caribe',
+ interestRate: '8.8%',
+ financingTotal: '87%',
+ availableTerms: [
+ { value: '12-months', label: '12 meses', months: 12 },
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 },
+ { value: '60-months', label: '60 meses', months: 60 },
+ { value: '72-months', label: '72 meses', months: 72 },
+ { value: '84-months', label: '84 meses', months: 84 }
+ ]
+ },
+ 'Motor Crédito': {
+ name: 'Motor Crédito',
+ interestRate: '9.5%',
+ financingTotal: '80%',
+ availableTerms: [
+ { value: '12-months', label: '12 meses', months: 12 },
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 }
+ ]
+ },
+ 'Scotia': {
+ name: 'Scotia',
+ interestRate: '7.9%',
+ financingTotal: '91%',
+ availableTerms: [
+ { value: '12-months', label: '12 meses', months: 12 },
+ { value: '24-months', label: '24 meses', months: 24 },
+ { value: '36-months', label: '36 meses', months: 36 },
+ { value: '48-months', label: '48 meses', months: 48 },
+ { value: '60-months', label: '60 meses', months: 60 },
+ { value: '72-months', label: '72 meses', months: 72 },
+ { value: '84-months', label: '84 meses', months: 84 },
+ { value: '96-months', label: '96 meses', months: 96 }
+ ]
+ }
+ };
+
+ return mockData[bankName] || {
+ name: bankName,
+ interestRate: 'N/A',
+ financingTotal: 'N/A',
+ availableTerms: []
+ };
+ }
+
+ private displayBankData(bankData: BankData) {
+ const interestRateElement = document.getElementById('interestRate');
+ const financingTotalElement = document.getElementById('financingTotal');
+
+ if (interestRateElement && financingTotalElement) {
+ // Animación de entrada para los datos
+ interestRateElement.style.opacity = '0';
+ financingTotalElement.style.opacity = '0';
+
+ setTimeout(() => {
+ interestRateElement.textContent = bankData.interestRate;
+ financingTotalElement.textContent = bankData.financingTotal;
+
+ interestRateElement.style.transition = 'opacity 0.3s ease';
+ financingTotalElement.style.transition = 'opacity 0.3s ease';
+
+ interestRateElement.style.opacity = '1';
+ financingTotalElement.style.opacity = '1';
+ }, 100);
+ }
+
+ // ← AGREGAR DEBUG ANTES DE ACTUALIZAR
+ this.debugTermSelector();
+
+ // Actualizar selector de términos
+ this.updateTermsSelector(bankData.availableTerms);
+ }
+
+
+
+
+ // Agregar esta función temporal para debug
+ private debugTermSelector() {
+ console.log('🔍 DEBUG: Verificando selector de términos...');
+
+ const termSelector = document.getElementById('termSelector');
+ const currentTerm = document.getElementById('currentTerm');
+ const termsList = document.getElementById('termsList');
+
+ console.log('termSelector encontrado:', !!termSelector);
+ console.log('currentTerm encontrado:', !!currentTerm);
+ console.log('termsList encontrado:', !!termsList);
+
+ if (termSelector) {
+ console.log('termSelector HTML:', termSelector.outerHTML);
+ }
+
+ if (currentTerm) {
+ console.log('currentTerm texto actual:', currentTerm.textContent);
+ }
+
+ if (termsList) {
+ console.log('termsList hijos:', termsList.children.length);
+ console.log('termsList HTML:', termsList.innerHTML);
+ }
+
+ // Listar TODOS los elementos con ID en la página
+ const allIds = Array.from(document.querySelectorAll('[id]')).map(el => el.id);
+ console.log('Todos los IDs en la página:', allIds);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ // ← FUNCIÓN PARA INICIALIZAR EL SELECTOR DE TÉRMINOS
+ private initTermSelector() {
+ setTimeout(() => {
+ console.log('🔧 Inicializando selector de términos...');
+ const termSelector = document.getElementById('termSelector');
+
+ if (!termSelector) {
+ console.log('❌ Selector de términos NO encontrado en DOM');
+ // Listar todos los elementos con ID para debug
+ const allIds = Array.from(document.querySelectorAll('[id]')).map(el => el.id);
+ console.log('IDs disponibles:', allIds);
+ return;
+ }
+
+ console.log('✅ Selector encontrado:', termSelector);
+
+ // Limpiar eventos previos
+ const newSelector = termSelector.cloneNode(true) as HTMLElement;
+ termSelector.parentNode?.replaceChild(newSelector, termSelector);
+
+ // Agregar funcionalidad de toggle al nuevo elemento
+ newSelector.addEventListener('click', (e) => {
+ if (newSelector.style.pointerEvents === 'none') {
+ console.log('Selector deshabilitado');
+ return;
+ }
+
+ e.preventDefault();
+ e.stopPropagation();
+
+ const isOpen = newSelector.classList.contains('open');
+ newSelector.classList.toggle('open');
+
+ console.log('Toggle selector:', !isOpen ? 'ABIERTO' : 'CERRADO');
+ });
+
+ // Cerrar al hacer click fuera
+ document.addEventListener('click', (e) => {
+ if (!newSelector.contains(e.target as Node)) {
+ newSelector.classList.remove('open');
+ }
+ });
+
+ console.log('✅ Selector de términos inicializado correctamente');
+ }, 3000); // ← Tiempo extra para asegurar que todo esté listo
+ }
+
+
+ // Reemplaza updateTermsSelector con esto:
+private updateTermsSelector(terms: TermOption[]) {
+ console.log('🔄 Actualizando términos:', terms);
+
+ const termSelector = document.getElementById('termSelector');
+ const currentTerm = document.getElementById('currentTerm');
+ const termsList = document.getElementById('termsList');
+
+ if (!termSelector || !currentTerm || !termsList) return;
+
+ // MOSTRAR el selector
+ termSelector.style.display = 'block';
+ termsList.innerHTML = '';
+
+ if (terms.length === 0) {
+ currentTerm.textContent = 'No disponible';
+ termSelector.style.opacity = '0.5';
+ return;
+ }
+
+ // Agregar términos (versión simple)
+ terms.forEach((term, index) => {
+ const li = document.createElement('li');
+ li.className = 'option';
+ li.setAttribute('data-value', term.value);
+ li.textContent = term.label;
+
+ if (index === 0) {
+ li.classList.add('selected');
+ currentTerm.textContent = term.label;
+ this.selectedTerm = term;
+ }
+
+ li.onclick = (e) => {
+ e.stopPropagation();
+
+ // Remover selección anterior (sin cast necesario)
+ termsList.querySelectorAll('.option').forEach(opt =>
+ opt.classList.remove('selected')
+ );
+
+ // Seleccionar actual
+ li.classList.add('selected');
+ currentTerm.textContent = term.label;
+ this.selectedTerm = term;
+ termSelector.classList.remove('open');
+
+ console.log('✅ Término seleccionado:', term.label);
+ };
+
+ termsList.appendChild(li);
+ });
+
+ termSelector.style.opacity = '1';
+ console.log(`✅ ${terms.length} términos cargados`);
+}
+
+ // Función simple para el toggle
+ // Función simple sin interferir con nice-select
+private initSimpleTermSelector() {
+ setTimeout(() => {
+ const termSelector = document.getElementById('termSelector');
+
+ if (!termSelector) {
+ console.log('❌ termSelector no encontrado');
+ return;
+ }
+
+ // Click para abrir/cerrar
+ termSelector.addEventListener('click', (e) => {
+ if (termSelector.style.opacity === '0.5') return;
+ e.stopPropagation();
+ termSelector.classList.toggle('open');
+ });
+
+ // Cerrar al click fuera
+ document.addEventListener('click', (e) => {
+ if (!termSelector.contains(e.target as Node)) {
+ termSelector.classList.remove('open');
+ }
+ });
+
+ console.log('✅ Selector personalizado inicializado');
+ }, 1000);
+}
+
+
+
+ // ← FUNCIÓN PARA SELECCIONAR UN TÉRMINO
+ private selectTerm(term: TermOption, selectedLi: HTMLElement) {
+ const currentTerm = document.getElementById('currentTerm');
+ const termsList = document.getElementById('termsList');
+ const termSelector = document.getElementById('termSelector');
+
+ if (!currentTerm || !termsList || !termSelector) return;
+
+ // Actualizar selección visual
+ termsList.querySelectorAll('.option').forEach(option => {
+ option.classList.remove('selected');
+ });
+ selectedLi.classList.add('selected');
+
+ // Actualizar texto actual
+ currentTerm.textContent = term.label;
+ this.selectedTerm = term;
+
+ // Cerrar dropdown
+ termSelector.classList.remove('open');
+
+ console.log(`✅ Término seleccionado: ${term.label} (${term.months} meses)`);
+
+ // Aquí puedes agregar lógica para recalcular pagos
+ // this.recalculatePayments();
+ }
+
+ // ← FUNCIÓN PARA OBTENER EL TÉRMINO SELECCIONADO
+ getSelectedTerm(): TermOption | null {
+ return this.selectedTerm;
+ }
+
+ private clearBankDetails() {
+ const interestRateElement = document.getElementById('interestRate');
+ const financingTotalElement = document.getElementById('financingTotal');
+
+ if (interestRateElement && financingTotalElement) {
+ interestRateElement.textContent = '--';
+ financingTotalElement.textContent = '--';
+ }
+ }
+
+ private showLoadingIndicator(show: boolean) {
+ const loadingElement = document.getElementById('loadingIndicator');
+ if (loadingElement) {
+ loadingElement.style.display = show ? 'block' : 'none';
+ }
+ }
+
+ private showErrorMessage(message: string) {
+ const interestRateElement = document.getElementById('interestRate');
+ const financingTotalElement = document.getElementById('financingTotal');
+
+ if (interestRateElement && financingTotalElement) {
+ interestRateElement.textContent = 'Error';
+ financingTotalElement.textContent = 'Error';
+ interestRateElement.style.color = '#dc3545';
+ financingTotalElement.style.color = '#dc3545';
+ }
+ }
+
+
+private debugListStyles() {
+ setTimeout(() => {
+ const termsList = document.getElementById('termsList');
+ if (termsList) {
+ console.log('🔍 Estilos aplicados a la lista:');
+ console.log('- classList:', termsList.classList.toString());
+ console.log('- innerHTML:', termsList.innerHTML);
+ console.log('- offsetHeight:', termsList.offsetHeight);
+ console.log('- computedStyle:', window.getComputedStyle(termsList));
+
+ const options = termsList.querySelectorAll('.option');
+ console.log('- Opciones encontradas:', options.length);
+ options.forEach((option, i) => {
+ console.log(` Opción ${i}:`, option.textContent, option.classList.toString());
+ });
+ }
+ }, 2000);
+}
+
+
+
+
+
+
+
+
+}
\ No newline at end of file
diff --git a/apiferia/src/app/views/charts/area/area.component.html b/apiferia/src/app/views/charts/area/area.component.html
new file mode 100644
index 00000000..deec55bc
--- /dev/null
+++ b/apiferia/src/app/views/charts/area/area.component.html
@@ -0,0 +1,313 @@
+
+
+
+
+
+
+
+
+ ApexCharts is loaded with powerful features to fulfill your
+ data-visualization needs.
+
+
+
Usage
+
+ To use ApexCharts, follow the instructions from its documentation over
+
+ here
+
+
+
+ Find the TS file for the following chart at:
+ src/app/views/charts/area.component.ts
+
+
+
+
+
+
+
+ Basic Area Chart#
+
+
+
+
+
+
+
+
+
+
+
+ Area Chart - Datetime X-axis#
+
+
+
+ 1M
+
+
+ 6M
+
+
+ 1Y
+
+ YTD
+ ALL
+
+
+
+
+
+
+
+
+
+ Area with Negative Values#
+
+
+
+
+
+
+
+
+ Selection - Github Style#
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Irregular TimeSeries#
+
+
+
+
+
+
+
+
+ Area Chart with Null values#
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/area/area.component.spec.ts b/apiferia/src/app/views/charts/area/area.component.spec.ts
new file mode 100644
index 00000000..ea58cfed
--- /dev/null
+++ b/apiferia/src/app/views/charts/area/area.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { AreaComponent } from './area.component'
+
+describe('AreaComponent', () => {
+ let component: AreaComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [AreaComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(AreaComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/area/area.component.ts b/apiferia/src/app/views/charts/area/area.component.ts
new file mode 100644
index 00000000..c63fc349
--- /dev/null
+++ b/apiferia/src/app/views/charts/area/area.component.ts
@@ -0,0 +1,4615 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { credits, currentYear } from '@/app/common/constants'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import moment from 'moment'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+export const series = {
+ monthDataSeries1: {
+ prices: [
+ 8107.85, 8128.0, 8122.9, 8165.5, 8340.7, 8423.7, 8423.5, 8514.3, 8481.85,
+ 8487.7, 8506.9, 8626.2, 8668.95, 8602.3, 8607.55, 8512.9, 8496.25,
+ 8600.65, 8881.1, 9340.85,
+ ],
+ dates: [
+ '13 Nov 2017',
+ '14 Nov 2017',
+ '15 Nov 2017',
+ '16 Nov 2017',
+ '17 Nov 2017',
+ '20 Nov 2017',
+ '21 Nov 2017',
+ '22 Nov 2017',
+ '23 Nov 2017',
+ '24 Nov 2017',
+ '27 Nov 2017',
+ '28 Nov 2017',
+ '29 Nov 2017',
+ '30 Nov 2017',
+ '01 Dec 2017',
+ '04 Dec 2017',
+ '05 Dec 2017',
+ '06 Dec 2017',
+ '07 Dec 2017',
+ '08 Dec 2017',
+ ],
+ },
+ monthDataSeries2: {
+ prices: [
+ 8423.7, 8423.5, 8514.3, 8481.85, 8487.7, 8506.9, 8626.2, 8668.95, 8602.3,
+ 8607.55, 8512.9, 8496.25, 8600.65, 8881.1, 9040.85, 8340.7, 8165.5,
+ 8122.9, 8107.85, 8128.0,
+ ],
+ dates: [
+ '13 Nov 2017',
+ '14 Nov 2017',
+ '15 Nov 2017',
+ '16 Nov 2017',
+ '17 Nov 2017',
+ '20 Nov 2017',
+ '21 Nov 2017',
+ '22 Nov 2017',
+ '23 Nov 2017',
+ '24 Nov 2017',
+ '27 Nov 2017',
+ '28 Nov 2017',
+ '29 Nov 2017',
+ '30 Nov 2017',
+ '01 Dec 2017',
+ '04 Dec 2017',
+ '05 Dec 2017',
+ '06 Dec 2017',
+ '07 Dec 2017',
+ '08 Dec 2017',
+ ],
+ },
+ monthDataSeries3: {
+ prices: [
+ 7114.25, 7126.6, 7116.95, 7203.7, 7233.75, 7451.0, 7381.15, 7348.95,
+ 7347.75, 7311.25, 7266.4, 7253.25, 7215.45, 7266.35, 7315.25, 7237.2,
+ 7191.4, 7238.95, 7222.6, 7217.9, 7359.3, 7371.55, 7371.15, 7469.2,
+ 7429.25, 7434.65, 7451.1, 7475.25, 7566.25, 7556.8, 7525.55, 7555.45,
+ 7560.9, 7490.7, 7527.6, 7551.9, 7514.85, 7577.95, 7592.3, 7621.95,
+ 7707.95, 7859.1, 7815.7, 7739.0, 7778.7, 7839.45, 7756.45, 7669.2,
+ 7580.45, 7452.85, 7617.25, 7701.6, 7606.8, 7620.05, 7513.85, 7498.45,
+ 7575.45, 7601.95, 7589.1, 7525.85, 7569.5, 7702.5, 7812.7, 7803.75,
+ 7816.3, 7851.15, 7912.2, 7972.8, 8145.0, 8161.1, 8121.05, 8071.25, 8088.2,
+ 8154.45, 8148.3, 8122.05, 8132.65, 8074.55, 7952.8, 7885.55, 7733.9,
+ 7897.15, 7973.15, 7888.5, 7842.8, 7838.4, 7909.85, 7892.75, 7897.75,
+ 7820.05, 7904.4, 7872.2, 7847.5, 7849.55, 7789.6, 7736.35, 7819.4,
+ 7875.35, 7871.8, 8076.5, 8114.8, 8193.55, 8217.1, 8235.05, 8215.3, 8216.4,
+ 8301.55, 8235.25, 8229.75, 8201.95, 8164.95, 8107.85, 8128.0, 8122.9,
+ 8165.5, 8340.7, 8423.7, 8423.5, 8514.3, 8481.85, 8487.7, 8506.9, 8626.2,
+ ],
+ dates: [
+ '02 Jun 2017',
+ '05 Jun 2017',
+ '06 Jun 2017',
+ '07 Jun 2017',
+ '08 Jun 2017',
+ '09 Jun 2017',
+ '12 Jun 2017',
+ '13 Jun 2017',
+ '14 Jun 2017',
+ '15 Jun 2017',
+ '16 Jun 2017',
+ '19 Jun 2017',
+ '20 Jun 2017',
+ '21 Jun 2017',
+ '22 Jun 2017',
+ '23 Jun 2017',
+ '27 Jun 2017',
+ '28 Jun 2017',
+ '29 Jun 2017',
+ '30 Jun 2017',
+ '03 Jul 2017',
+ '04 Jul 2017',
+ '05 Jul 2017',
+ '06 Jul 2017',
+ '07 Jul 2017',
+ '10 Jul 2017',
+ '11 Jul 2017',
+ '12 Jul 2017',
+ '13 Jul 2017',
+ '14 Jul 2017',
+ '17 Jul 2017',
+ '18 Jul 2017',
+ '19 Jul 2017',
+ '20 Jul 2017',
+ '21 Jul 2017',
+ '24 Jul 2017',
+ '25 Jul 2017',
+ '26 Jul 2017',
+ '27 Jul 2017',
+ '28 Jul 2017',
+ '31 Jul 2017',
+ '01 Aug 2017',
+ '02 Aug 2017',
+ '03 Aug 2017',
+ '04 Aug 2017',
+ '07 Aug 2017',
+ '08 Aug 2017',
+ '09 Aug 2017',
+ '10 Aug 2017',
+ '11 Aug 2017',
+ '14 Aug 2017',
+ '16 Aug 2017',
+ '17 Aug 2017',
+ '18 Aug 2017',
+ '21 Aug 2017',
+ '22 Aug 2017',
+ '23 Aug 2017',
+ '24 Aug 2017',
+ '28 Aug 2017',
+ '29 Aug 2017',
+ '30 Aug 2017',
+ '31 Aug 2017',
+ '01 Sep 2017',
+ '04 Sep 2017',
+ '05 Sep 2017',
+ '06 Sep 2017',
+ '07 Sep 2017',
+ '08 Sep 2017',
+ '11 Sep 2017',
+ '12 Sep 2017',
+ '13 Sep 2017',
+ '14 Sep 2017',
+ '15 Sep 2017',
+ '18 Sep 2017',
+ '19 Sep 2017',
+ '20 Sep 2017',
+ '21 Sep 2017',
+ '22 Sep 2017',
+ '25 Sep 2017',
+ '26 Sep 2017',
+ '27 Sep 2017',
+ '28 Sep 2017',
+ '29 Sep 2017',
+ '03 Oct 2017',
+ '04 Oct 2017',
+ '05 Oct 2017',
+ '06 Oct 2017',
+ '09 Oct 2017',
+ '10 Oct 2017',
+ '11 Oct 2017',
+ '12 Oct 2017',
+ '13 Oct 2017',
+ '16 Oct 2017',
+ '17 Oct 2017',
+ '18 Oct 2017',
+ '19 Oct 2017',
+ '23 Oct 2017',
+ '24 Oct 2017',
+ '25 Oct 2017',
+ '26 Oct 2017',
+ '27 Oct 2017',
+ '30 Oct 2017',
+ '31 Oct 2017',
+ '01 Nov 2017',
+ '02 Nov 2017',
+ '03 Nov 2017',
+ '06 Nov 2017',
+ '07 Nov 2017',
+ '08 Nov 2017',
+ '09 Nov 2017',
+ '10 Nov 2017',
+ '13 Nov 2017',
+ '14 Nov 2017',
+ '15 Nov 2017',
+ '16 Nov 2017',
+ '17 Nov 2017',
+ '20 Nov 2017',
+ '21 Nov 2017',
+ '22 Nov 2017',
+ '23 Nov 2017',
+ '24 Nov 2017',
+ '27 Nov 2017',
+ '28 Nov 2017',
+ ],
+ },
+}
+
+const githubdata = {
+ series: [
+ {
+ x: 1352592000000,
+ a: 306,
+ d: 33,
+ y: 13,
+ },
+ {
+ x: 1353196800000,
+ a: 77,
+ d: 41,
+ y: 11,
+ },
+ {
+ x: 1353801600000,
+ a: 97,
+ d: 52,
+ y: 13,
+ },
+ {
+ x: 1354406400000,
+ a: 349,
+ d: 231,
+ y: 27,
+ },
+ {
+ x: 1355011200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1355616000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1356220800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1356825600000,
+ a: 93,
+ d: 16,
+ y: 12,
+ },
+ {
+ x: 1357430400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1358035200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1358640000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1359244800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1359849600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1360454400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1361059200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1361664000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1362268800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1362873600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1363478400000,
+ a: 47,
+ d: 20,
+ y: 6,
+ },
+ {
+ x: 1364083200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1364688000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1365292800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1365897600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1366502400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1367107200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1367712000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1368316800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1368921600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1369526400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1370131200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1370736000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1371340800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1371945600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1372550400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1373155200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1373760000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1374364800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1374969600000,
+ a: 22,
+ d: 16,
+ y: 9,
+ },
+ {
+ x: 1375574400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1376179200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1376784000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1377388800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1377993600000,
+ a: 104,
+ d: 79,
+ y: 12,
+ },
+ {
+ x: 1378598400000,
+ a: 60,
+ d: 17,
+ y: 9,
+ },
+ {
+ x: 1379203200000,
+ a: 27,
+ d: 36,
+ y: 3,
+ },
+ {
+ x: 1379808000000,
+ a: 283,
+ d: 199,
+ y: 20,
+ },
+ {
+ x: 1380412800000,
+ a: 1,
+ d: 1,
+ y: 1,
+ },
+ {
+ x: 1381017600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1381622400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1382227200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1382832000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1383436800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1384041600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1384646400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1385251200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1385856000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1386460800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1387065600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1387670400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1388275200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1388880000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1389484800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1390089600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1390694400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1391299200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1391904000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1392508800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1393113600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1393718400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1394323200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1394928000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1395532800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1396137600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1396742400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1397347200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1397952000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1398556800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1399161600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1399766400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1400371200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1400976000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1401580800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1402185600000,
+ a: 115,
+ d: 38,
+ y: 11,
+ },
+ {
+ x: 1402790400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1403395200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1404000000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1404604800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1405209600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1405814400000,
+ a: 598,
+ d: 209,
+ y: 34,
+ },
+ {
+ x: 1406419200000,
+ a: 195,
+ d: 119,
+ y: 18,
+ },
+ {
+ x: 1407024000000,
+ a: 174,
+ d: 54,
+ y: 13,
+ },
+ {
+ x: 1407628800000,
+ a: 1,
+ d: 1,
+ y: 1,
+ },
+ {
+ x: 1408233600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1408838400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1409443200000,
+ a: 2,
+ d: 2,
+ y: 1,
+ },
+ {
+ x: 1410048000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1410652800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1411257600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1411862400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1412467200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1413072000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1413676800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1414281600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1414886400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1415491200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1416096000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1416700800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1417305600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1417910400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1418515200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1419120000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1419724800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1420329600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1420934400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1421539200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1422144000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1422748800000,
+ a: 46,
+ d: 43,
+ y: 8,
+ },
+ {
+ x: 1423353600000,
+ a: 20,
+ d: 4,
+ y: 1,
+ },
+ {
+ x: 1423958400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1424563200000,
+ a: 18,
+ d: 11,
+ y: 4,
+ },
+ {
+ x: 1425168000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1425772800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1426377600000,
+ a: 54,
+ d: 63,
+ y: 4,
+ },
+ {
+ x: 1426982400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1427587200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1428192000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1428796800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1429401600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1430006400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1430611200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1431216000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1431820800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1432425600000,
+ a: 10,
+ d: 11,
+ y: 1,
+ },
+ {
+ x: 1433030400000,
+ a: 296,
+ d: 172,
+ y: 18,
+ },
+ {
+ x: 1433635200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1434240000000,
+ a: 10,
+ d: 13,
+ y: 2,
+ },
+ {
+ x: 1434844800000,
+ a: 20,
+ d: 16,
+ y: 3,
+ },
+ {
+ x: 1435449600000,
+ a: 24,
+ d: 10,
+ y: 3,
+ },
+ {
+ x: 1436054400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1436659200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1437264000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1437868800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1438473600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1439078400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1439683200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1440288000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1440892800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1441497600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1442102400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1442707200000,
+ a: 275,
+ d: 129,
+ y: 12,
+ },
+ {
+ x: 1443312000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1443916800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1444521600000,
+ a: 1213,
+ d: 837,
+ y: 5,
+ },
+ {
+ x: 1445126400000,
+ a: 299,
+ d: 54,
+ y: 3,
+ },
+ {
+ x: 1445731200000,
+ a: 30,
+ d: 33,
+ y: 1,
+ },
+ {
+ x: 1446336000000,
+ a: 202,
+ d: 185,
+ y: 18,
+ },
+ {
+ x: 1446940800000,
+ a: 554,
+ d: 292,
+ y: 39,
+ },
+ {
+ x: 1447545600000,
+ a: 9030,
+ d: 44,
+ y: 7,
+ },
+ {
+ x: 1448150400000,
+ a: 8,
+ d: 1,
+ y: 1,
+ },
+ {
+ x: 1448755200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1449360000000,
+ a: 18,
+ d: 12,
+ y: 5,
+ },
+ {
+ x: 1449964800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1450569600000,
+ a: 4,
+ d: 3,
+ y: 2,
+ },
+ {
+ x: 1451174400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1451779200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1452384000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1452988800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1453593600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1454198400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1454803200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1455408000000,
+ a: 2,
+ d: 2,
+ y: 1,
+ },
+ {
+ x: 1456012800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1456617600000,
+ a: 32,
+ d: 43,
+ y: 1,
+ },
+ {
+ x: 1457222400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1457827200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1458432000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1459036800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1459641600000,
+ a: 23,
+ d: 13,
+ y: 3,
+ },
+ {
+ x: 1460246400000,
+ a: 421,
+ d: 335,
+ y: 9,
+ },
+ {
+ x: 1460851200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1461456000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1462060800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1462665600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1463270400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1463875200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1464480000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1465084800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1465689600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1466294400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1466899200000,
+ a: 6,
+ d: 1,
+ y: 1,
+ },
+ {
+ x: 1467504000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1468108800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1468713600000,
+ a: 886,
+ d: 49,
+ y: 15,
+ },
+ {
+ x: 1469318400000,
+ a: 38,
+ d: 26,
+ y: 4,
+ },
+ {
+ x: 1469923200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1470528000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1471132800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1471737600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1472342400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1472947200000,
+ a: 2,
+ d: 2,
+ y: 1,
+ },
+ {
+ x: 1473552000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1474156800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1474761600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1475366400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1475971200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1476576000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1477180800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1477785600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1478390400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1478995200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1479600000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1480204800000,
+ a: 8,
+ d: 0,
+ y: 1,
+ },
+ {
+ x: 1480809600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1481414400000,
+ a: 1,
+ d: 1,
+ y: 1,
+ },
+ {
+ x: 1482019200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1482624000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1483228800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1483833600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1484438400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1485043200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1485648000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1486252800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1486857600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1487462400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1488067200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1488672000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1489276800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1489881600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1490486400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1491091200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1491696000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1492300800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1492905600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1493510400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1494115200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1494720000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1495324800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1495929600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1496534400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1497139200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1497744000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1498348800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1498953600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1499558400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1500163200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1500768000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1501372800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1501977600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1502582400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1503187200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1503792000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1504396800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1505001600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1505606400000,
+ a: 2,
+ d: 2,
+ y: 2,
+ },
+ {
+ x: 1506211200000,
+ a: 49,
+ d: 10,
+ y: 4,
+ },
+ {
+ x: 1506816000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1507420800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1508025600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1508630400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1509235200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1509840000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1510444800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1511049600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1511654400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1512259200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1512864000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1513468800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1514073600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1514678400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1515283200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1515888000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1516492800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1517097600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1517702400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1518307200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1518912000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1519516800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1520121600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1520726400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1521331200000,
+ a: 768,
+ d: 2125,
+ y: 12,
+ },
+ {
+ x: 1521936000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1522540800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1523145600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1523750400000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1524355200000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1524960000000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1525564800000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1526169600000,
+ a: 0,
+ d: 0,
+ y: 0,
+ },
+ {
+ x: 1526774400000,
+ a: 1,
+ d: 0,
+ y: 1,
+ },
+ ],
+}
+
+const dataSeries = [
+ [
+ {
+ date: '2014-01-01',
+ value: 20000000,
+ },
+ {
+ date: '2014-01-02',
+ value: 10379978,
+ },
+ {
+ date: '2014-01-03',
+ value: 30493749,
+ },
+ {
+ date: '2014-01-04',
+ value: 10785250,
+ },
+ {
+ date: '2014-01-05',
+ value: 33901904,
+ },
+ {
+ date: '2014-01-06',
+ value: 11576838,
+ },
+ {
+ date: '2014-01-07',
+ value: 14413854,
+ },
+ {
+ date: '2014-01-08',
+ value: 15177211,
+ },
+ {
+ date: '2014-01-09',
+ value: 16622100,
+ },
+ {
+ date: '2014-01-10',
+ value: 17381072,
+ },
+ {
+ date: '2014-01-11',
+ value: 18802310,
+ },
+ {
+ date: '2014-01-12',
+ value: 15531790,
+ },
+ {
+ date: '2014-01-13',
+ value: 15748881,
+ },
+ {
+ date: '2014-01-14',
+ value: 18706437,
+ },
+ {
+ date: '2014-01-15',
+ value: 19752685,
+ },
+ {
+ date: '2014-01-16',
+ value: 21016418,
+ },
+ {
+ date: '2014-01-17',
+ value: 25622924,
+ },
+ {
+ date: '2014-01-18',
+ value: 25337480,
+ },
+ {
+ date: '2014-01-19',
+ value: 22258882,
+ },
+ {
+ date: '2014-01-20',
+ value: 23829538,
+ },
+ {
+ date: '2014-01-21',
+ value: 24245689,
+ },
+ {
+ date: '2014-01-22',
+ value: 26429711,
+ },
+ {
+ date: '2014-01-23',
+ value: 26259017,
+ },
+ {
+ date: '2014-01-24',
+ value: 25396183,
+ },
+ {
+ date: '2014-01-25',
+ value: 23107346,
+ },
+ {
+ date: '2014-01-26',
+ value: 28659852,
+ },
+ {
+ date: '2014-01-27',
+ value: 25270783,
+ },
+ {
+ date: '2014-01-28',
+ value: 26270783,
+ },
+ {
+ date: '2014-01-29',
+ value: 27270783,
+ },
+ {
+ date: '2014-01-30',
+ value: 28270783,
+ },
+ {
+ date: '2014-01-31',
+ value: 29270783,
+ },
+ {
+ date: '2014-02-01',
+ value: 30270783,
+ },
+ {
+ date: '2014-02-02',
+ value: 31270783,
+ },
+ {
+ date: '2014-02-03',
+ value: 32270783,
+ },
+ {
+ date: '2014-02-04',
+ value: 33270783,
+ },
+ {
+ date: '2014-02-05',
+ value: 28270783,
+ },
+ {
+ date: '2014-02-06',
+ value: 27270783,
+ },
+ {
+ date: '2014-02-07',
+ value: 35270783,
+ },
+ {
+ date: '2014-02-08',
+ value: 34270783,
+ },
+ {
+ date: '2014-02-09',
+ value: 28270783,
+ },
+ {
+ date: '2014-02-10',
+ value: 35270783,
+ },
+ {
+ date: '2014-02-11',
+ value: 36270783,
+ },
+ {
+ date: '2014-02-12',
+ value: 34127078,
+ },
+ {
+ date: '2014-02-13',
+ value: 33124078,
+ },
+ {
+ date: '2014-02-14',
+ value: 36227078,
+ },
+ {
+ date: '2014-02-15',
+ value: 37827078,
+ },
+ {
+ date: '2014-02-16',
+ value: 36427073,
+ },
+ {
+ date: '2014-02-17',
+ value: 37570783,
+ },
+ {
+ date: '2014-02-18',
+ value: 38627073,
+ },
+ {
+ date: '2014-02-19',
+ value: 37727078,
+ },
+ {
+ date: '2014-02-20',
+ value: 38827073,
+ },
+ {
+ date: '2014-02-21',
+ value: 40927078,
+ },
+ {
+ date: '2014-02-22',
+ value: 41027078,
+ },
+ {
+ date: '2014-02-23',
+ value: 42127073,
+ },
+ {
+ date: '2014-02-24',
+ value: 43220783,
+ },
+ {
+ date: '2014-02-25',
+ value: 44327078,
+ },
+ {
+ date: '2014-02-26',
+ value: 40427078,
+ },
+ {
+ date: '2014-02-27',
+ value: 41027078,
+ },
+ {
+ date: '2014-02-28',
+ value: 45627078,
+ },
+ {
+ date: '2014-03-01',
+ value: 44727078,
+ },
+ {
+ date: '2014-03-02',
+ value: 44227078,
+ },
+ {
+ date: '2014-03-03',
+ value: 45227078,
+ },
+ {
+ date: '2014-03-04',
+ value: 46027078,
+ },
+ {
+ date: '2014-03-05',
+ value: 46927078,
+ },
+ {
+ date: '2014-03-06',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-07',
+ value: 46227078,
+ },
+ {
+ date: '2014-03-08',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-09',
+ value: 48027078,
+ },
+ {
+ date: '2014-03-10',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-11',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-12',
+ value: 48017078,
+ },
+ {
+ date: '2014-03-13',
+ value: 48077078,
+ },
+ {
+ date: '2014-03-14',
+ value: 48087078,
+ },
+ {
+ date: '2014-03-15',
+ value: 48017078,
+ },
+ {
+ date: '2014-03-16',
+ value: 48047078,
+ },
+ {
+ date: '2014-03-17',
+ value: 48067078,
+ },
+ {
+ date: '2014-03-18',
+ value: 48077078,
+ },
+ {
+ date: '2014-03-19',
+ value: 48027074,
+ },
+ {
+ date: '2014-03-20',
+ value: 48927079,
+ },
+ {
+ date: '2014-03-21',
+ value: 48727071,
+ },
+ {
+ date: '2014-03-22',
+ value: 48127072,
+ },
+ {
+ date: '2014-03-23',
+ value: 48527072,
+ },
+ {
+ date: '2014-03-24',
+ value: 48627027,
+ },
+ {
+ date: '2014-03-25',
+ value: 48027040,
+ },
+ {
+ date: '2014-03-26',
+ value: 48027043,
+ },
+ {
+ date: '2014-03-27',
+ value: 48057022,
+ },
+ {
+ date: '2014-03-28',
+ value: 49057022,
+ },
+ {
+ date: '2014-03-29',
+ value: 50057022,
+ },
+ {
+ date: '2014-03-30',
+ value: 51057022,
+ },
+ {
+ date: '2014-03-31',
+ value: 52057022,
+ },
+ {
+ date: '2014-04-01',
+ value: 53057022,
+ },
+ {
+ date: '2014-04-02',
+ value: 54057022,
+ },
+ {
+ date: '2014-04-03',
+ value: 52057022,
+ },
+ {
+ date: '2014-04-04',
+ value: 55057022,
+ },
+ {
+ date: '2014-04-05',
+ value: 58270783,
+ },
+ {
+ date: '2014-04-06',
+ value: 56270783,
+ },
+ {
+ date: '2014-04-07',
+ value: 55270783,
+ },
+ {
+ date: '2014-04-08',
+ value: 58270783,
+ },
+ {
+ date: '2014-04-09',
+ value: 59270783,
+ },
+ {
+ date: '2014-04-10',
+ value: 60270783,
+ },
+ {
+ date: '2014-04-11',
+ value: 61270783,
+ },
+ {
+ date: '2014-04-12',
+ value: 62270783,
+ },
+ {
+ date: '2014-04-13',
+ value: 63270783,
+ },
+ {
+ date: '2014-04-14',
+ value: 64270783,
+ },
+ {
+ date: '2014-04-15',
+ value: 65270783,
+ },
+ {
+ date: '2014-04-16',
+ value: 66270783,
+ },
+ {
+ date: '2014-04-17',
+ value: 67270783,
+ },
+ {
+ date: '2014-04-18',
+ value: 68270783,
+ },
+ {
+ date: '2014-04-19',
+ value: 69270783,
+ },
+ {
+ date: '2014-04-20',
+ value: 70270783,
+ },
+ {
+ date: '2014-04-21',
+ value: 71270783,
+ },
+ {
+ date: '2014-04-22',
+ value: 72270783,
+ },
+ {
+ date: '2014-04-23',
+ value: 73270783,
+ },
+ {
+ date: '2014-04-24',
+ value: 74270783,
+ },
+ {
+ date: '2014-04-25',
+ value: 75270783,
+ },
+ {
+ date: '2014-04-26',
+ value: 76660783,
+ },
+ {
+ date: '2014-04-27',
+ value: 77270783,
+ },
+ {
+ date: '2014-04-28',
+ value: 78370783,
+ },
+ {
+ date: '2014-04-29',
+ value: 79470783,
+ },
+ {
+ date: '2014-04-30',
+ value: 80170783,
+ },
+ ],
+ [
+ {
+ date: '2014-01-01',
+ value: 150000000,
+ },
+ {
+ date: '2014-01-02',
+ value: 160379978,
+ },
+ {
+ date: '2014-01-03',
+ value: 170493749,
+ },
+ {
+ date: '2014-01-04',
+ value: 160785250,
+ },
+ {
+ date: '2014-01-05',
+ value: 167391904,
+ },
+ {
+ date: '2014-01-06',
+ value: 161576838,
+ },
+ {
+ date: '2014-01-07',
+ value: 161413854,
+ },
+ {
+ date: '2014-01-08',
+ value: 152177211,
+ },
+ {
+ date: '2014-01-09',
+ value: 140762210,
+ },
+ {
+ date: '2014-01-10',
+ value: 144381072,
+ },
+ {
+ date: '2014-01-11',
+ value: 154352310,
+ },
+ {
+ date: '2014-01-12',
+ value: 165531790,
+ },
+ {
+ date: '2014-01-13',
+ value: 175748881,
+ },
+ {
+ date: '2014-01-14',
+ value: 187064037,
+ },
+ {
+ date: '2014-01-15',
+ value: 197520685,
+ },
+ {
+ date: '2014-01-16',
+ value: 210176418,
+ },
+ {
+ date: '2014-01-17',
+ value: 196122924,
+ },
+ {
+ date: '2014-01-18',
+ value: 207337480,
+ },
+ {
+ date: '2014-01-19',
+ value: 200258882,
+ },
+ {
+ date: '2014-01-20',
+ value: 186829538,
+ },
+ {
+ date: '2014-01-21',
+ value: 192456897,
+ },
+ {
+ date: '2014-01-22',
+ value: 204299711,
+ },
+ {
+ date: '2014-01-23',
+ value: 192759017,
+ },
+ {
+ date: '2014-01-24',
+ value: 203596183,
+ },
+ {
+ date: '2014-01-25',
+ value: 208107346,
+ },
+ {
+ date: '2014-01-26',
+ value: 196359852,
+ },
+ {
+ date: '2014-01-27',
+ value: 192570783,
+ },
+ {
+ date: '2014-01-28',
+ value: 177967768,
+ },
+ {
+ date: '2014-01-29',
+ value: 190632803,
+ },
+ {
+ date: '2014-01-30',
+ value: 203725316,
+ },
+ {
+ date: '2014-01-31',
+ value: 218226177,
+ },
+ {
+ date: '2014-02-01',
+ value: 210698669,
+ },
+ {
+ date: '2014-02-02',
+ value: 217640656,
+ },
+ {
+ date: '2014-02-03',
+ value: 216142362,
+ },
+ {
+ date: '2014-02-04',
+ value: 201410971,
+ },
+ {
+ date: '2014-02-05',
+ value: 196704289,
+ },
+ {
+ date: '2014-02-06',
+ value: 190436945,
+ },
+ {
+ date: '2014-02-07',
+ value: 178891686,
+ },
+ {
+ date: '2014-02-08',
+ value: 171613962,
+ },
+ {
+ date: '2014-02-09',
+ value: 157579773,
+ },
+ {
+ date: '2014-02-10',
+ value: 158677098,
+ },
+ {
+ date: '2014-02-11',
+ value: 147129977,
+ },
+ {
+ date: '2014-02-12',
+ value: 151561876,
+ },
+ {
+ date: '2014-02-13',
+ value: 151627421,
+ },
+ {
+ date: '2014-02-14',
+ value: 143543872,
+ },
+ {
+ date: '2014-02-15',
+ value: 136581057,
+ },
+ {
+ date: '2014-02-16',
+ value: 135560715,
+ },
+ {
+ date: '2014-02-17',
+ value: 122625263,
+ },
+ {
+ date: '2014-02-18',
+ value: 112091484,
+ },
+ {
+ date: '2014-02-19',
+ value: 98810329,
+ },
+ {
+ date: '2014-02-20',
+ value: 99882912,
+ },
+ {
+ date: '2014-02-21',
+ value: 94943095,
+ },
+ {
+ date: '2014-02-22',
+ value: 104875743,
+ },
+ {
+ date: '2014-02-23',
+ value: 116383678,
+ },
+ {
+ date: '2014-02-24',
+ value: 125028841,
+ },
+ {
+ date: '2014-02-25',
+ value: 123967310,
+ },
+ {
+ date: '2014-02-26',
+ value: 133167029,
+ },
+ {
+ date: '2014-02-27',
+ value: 128577263,
+ },
+ {
+ date: '2014-02-28',
+ value: 115836969,
+ },
+ {
+ date: '2014-03-01',
+ value: 119264529,
+ },
+ {
+ date: '2014-03-02',
+ value: 109363374,
+ },
+ {
+ date: '2014-03-03',
+ value: 113985628,
+ },
+ {
+ date: '2014-03-04',
+ value: 114650999,
+ },
+ {
+ date: '2014-03-05',
+ value: 110866108,
+ },
+ {
+ date: '2014-03-06',
+ value: 96473454,
+ },
+ {
+ date: '2014-03-07',
+ value: 104075886,
+ },
+ {
+ date: '2014-03-08',
+ value: 103568384,
+ },
+ {
+ date: '2014-03-09',
+ value: 101534883,
+ },
+ {
+ date: '2014-03-10',
+ value: 115825447,
+ },
+ {
+ date: '2014-03-11',
+ value: 126133916,
+ },
+ {
+ date: '2014-03-12',
+ value: 116502109,
+ },
+ {
+ date: '2014-03-13',
+ value: 130169411,
+ },
+ {
+ date: '2014-03-14',
+ value: 124296886,
+ },
+ {
+ date: '2014-03-15',
+ value: 126347399,
+ },
+ {
+ date: '2014-03-16',
+ value: 131483669,
+ },
+ {
+ date: '2014-03-17',
+ value: 142811333,
+ },
+ {
+ date: '2014-03-18',
+ value: 129675396,
+ },
+ {
+ date: '2014-03-19',
+ value: 115514483,
+ },
+ {
+ date: '2014-03-20',
+ value: 117630630,
+ },
+ {
+ date: '2014-03-21',
+ value: 122340239,
+ },
+ {
+ date: '2014-03-22',
+ value: 132349091,
+ },
+ {
+ date: '2014-03-23',
+ value: 125613305,
+ },
+ {
+ date: '2014-03-24',
+ value: 135592466,
+ },
+ {
+ date: '2014-03-25',
+ value: 123408762,
+ },
+ {
+ date: '2014-03-26',
+ value: 111991454,
+ },
+ {
+ date: '2014-03-27',
+ value: 116123955,
+ },
+ {
+ date: '2014-03-28',
+ value: 112817214,
+ },
+ {
+ date: '2014-03-29',
+ value: 113029590,
+ },
+ {
+ date: '2014-03-30',
+ value: 108753398,
+ },
+ {
+ date: '2014-03-31',
+ value: 99383763,
+ },
+ {
+ date: '2014-04-01',
+ value: 100151737,
+ },
+ {
+ date: '2014-04-02',
+ value: 94985209,
+ },
+ {
+ date: '2014-04-03',
+ value: 82913669,
+ },
+ {
+ date: '2014-04-04',
+ value: 78748268,
+ },
+ {
+ date: '2014-04-05',
+ value: 63829135,
+ },
+ {
+ date: '2014-04-06',
+ value: 78694727,
+ },
+ {
+ date: '2014-04-07',
+ value: 80868994,
+ },
+ {
+ date: '2014-04-08',
+ value: 93799013,
+ },
+ {
+ date: '2014-04-09',
+ value: 99042416,
+ },
+ {
+ date: '2014-04-10',
+ value: 97298692,
+ },
+ {
+ date: '2014-04-11',
+ value: 83353499,
+ },
+ {
+ date: '2014-04-12',
+ value: 71248129,
+ },
+ {
+ date: '2014-04-13',
+ value: 75253744,
+ },
+ {
+ date: '2014-04-14',
+ value: 68976648,
+ },
+ {
+ date: '2014-04-15',
+ value: 71002284,
+ },
+ {
+ date: '2014-04-16',
+ value: 75052401,
+ },
+ {
+ date: '2014-04-17',
+ value: 83894030,
+ },
+ {
+ date: '2014-04-18',
+ value: 90236528,
+ },
+ {
+ date: '2014-04-19',
+ value: 99739114,
+ },
+ {
+ date: '2014-04-20',
+ value: 96407136,
+ },
+ {
+ date: '2014-04-21',
+ value: 108323177,
+ },
+ {
+ date: '2014-04-22',
+ value: 101578914,
+ },
+ {
+ date: '2014-04-23',
+ value: 115877608,
+ },
+ {
+ date: '2014-04-24',
+ value: 112088857,
+ },
+ {
+ date: '2014-04-25',
+ value: 112071353,
+ },
+ {
+ date: '2014-04-26',
+ value: 101790062,
+ },
+ {
+ date: '2014-04-27',
+ value: 115003761,
+ },
+ {
+ date: '2014-04-28',
+ value: 120457727,
+ },
+ {
+ date: '2014-04-29',
+ value: 118253926,
+ },
+ {
+ date: '2014-04-30',
+ value: 117956992,
+ },
+ ],
+ [
+ {
+ date: '2014-01-01',
+ value: 50000000,
+ },
+ {
+ date: '2014-01-02',
+ value: 60379978,
+ },
+ {
+ date: '2014-01-03',
+ value: 40493749,
+ },
+ {
+ date: '2014-01-04',
+ value: 60785250,
+ },
+ {
+ date: '2014-01-05',
+ value: 67391904,
+ },
+ {
+ date: '2014-01-06',
+ value: 61576838,
+ },
+ {
+ date: '2014-01-07',
+ value: 61413854,
+ },
+ {
+ date: '2014-01-08',
+ value: 82177211,
+ },
+ {
+ date: '2014-01-09',
+ value: 103762210,
+ },
+ {
+ date: '2014-01-10',
+ value: 84381072,
+ },
+ {
+ date: '2014-01-11',
+ value: 54352310,
+ },
+ {
+ date: '2014-01-12',
+ value: 65531790,
+ },
+ {
+ date: '2014-01-13',
+ value: 75748881,
+ },
+ {
+ date: '2014-01-14',
+ value: 47064037,
+ },
+ {
+ date: '2014-01-15',
+ value: 67520685,
+ },
+ {
+ date: '2014-01-16',
+ value: 60176418,
+ },
+ {
+ date: '2014-01-17',
+ value: 66122924,
+ },
+ {
+ date: '2014-01-18',
+ value: 57337480,
+ },
+ {
+ date: '2014-01-19',
+ value: 100258882,
+ },
+ {
+ date: '2014-01-20',
+ value: 46829538,
+ },
+ {
+ date: '2014-01-21',
+ value: 92456897,
+ },
+ {
+ date: '2014-01-22',
+ value: 94299711,
+ },
+ {
+ date: '2014-01-23',
+ value: 62759017,
+ },
+ {
+ date: '2014-01-24',
+ value: 103596183,
+ },
+ {
+ date: '2014-01-25',
+ value: 108107346,
+ },
+ {
+ date: '2014-01-26',
+ value: 66359852,
+ },
+ {
+ date: '2014-01-27',
+ value: 62570783,
+ },
+ {
+ date: '2014-01-28',
+ value: 77967768,
+ },
+ {
+ date: '2014-01-29',
+ value: 60632803,
+ },
+ {
+ date: '2014-01-30',
+ value: 103725316,
+ },
+ {
+ date: '2014-01-31',
+ value: 98226177,
+ },
+ {
+ date: '2014-02-01',
+ value: 60698669,
+ },
+ {
+ date: '2014-02-02',
+ value: 67640656,
+ },
+ {
+ date: '2014-02-03',
+ value: 66142362,
+ },
+ {
+ date: '2014-02-04',
+ value: 101410971,
+ },
+ {
+ date: '2014-02-05',
+ value: 66704289,
+ },
+ {
+ date: '2014-02-06',
+ value: 60436945,
+ },
+ {
+ date: '2014-02-07',
+ value: 78891686,
+ },
+ {
+ date: '2014-02-08',
+ value: 71613962,
+ },
+ {
+ date: '2014-02-09',
+ value: 107579773,
+ },
+ {
+ date: '2014-02-10',
+ value: 58677098,
+ },
+ {
+ date: '2014-02-11',
+ value: 87129977,
+ },
+ {
+ date: '2014-02-12',
+ value: 51561876,
+ },
+ {
+ date: '2014-02-13',
+ value: 51627421,
+ },
+ {
+ date: '2014-02-14',
+ value: 83543872,
+ },
+ {
+ date: '2014-02-15',
+ value: 66581057,
+ },
+ {
+ date: '2014-02-16',
+ value: 65560715,
+ },
+ {
+ date: '2014-02-17',
+ value: 62625263,
+ },
+ {
+ date: '2014-02-18',
+ value: 92091484,
+ },
+ {
+ date: '2014-02-19',
+ value: 48810329,
+ },
+ {
+ date: '2014-02-20',
+ value: 49882912,
+ },
+ {
+ date: '2014-02-21',
+ value: 44943095,
+ },
+ {
+ date: '2014-02-22',
+ value: 104875743,
+ },
+ {
+ date: '2014-02-23',
+ value: 96383678,
+ },
+ {
+ date: '2014-02-24',
+ value: 105028841,
+ },
+ {
+ date: '2014-02-25',
+ value: 63967310,
+ },
+ {
+ date: '2014-02-26',
+ value: 63167029,
+ },
+ {
+ date: '2014-02-27',
+ value: 68577263,
+ },
+ {
+ date: '2014-02-28',
+ value: 95836969,
+ },
+ {
+ date: '2014-03-01',
+ value: 99264529,
+ },
+ {
+ date: '2014-03-02',
+ value: 109363374,
+ },
+ {
+ date: '2014-03-03',
+ value: 93985628,
+ },
+ {
+ date: '2014-03-04',
+ value: 94650999,
+ },
+ {
+ date: '2014-03-05',
+ value: 90866108,
+ },
+ {
+ date: '2014-03-06',
+ value: 46473454,
+ },
+ {
+ date: '2014-03-07',
+ value: 84075886,
+ },
+ {
+ date: '2014-03-08',
+ value: 103568384,
+ },
+ {
+ date: '2014-03-09',
+ value: 101534883,
+ },
+ {
+ date: '2014-03-10',
+ value: 95825447,
+ },
+ {
+ date: '2014-03-11',
+ value: 66133916,
+ },
+ {
+ date: '2014-03-12',
+ value: 96502109,
+ },
+ {
+ date: '2014-03-13',
+ value: 80169411,
+ },
+ {
+ date: '2014-03-14',
+ value: 84296886,
+ },
+ {
+ date: '2014-03-15',
+ value: 86347399,
+ },
+ {
+ date: '2014-03-16',
+ value: 31483669,
+ },
+ {
+ date: '2014-03-17',
+ value: 82811333,
+ },
+ {
+ date: '2014-03-18',
+ value: 89675396,
+ },
+ {
+ date: '2014-03-19',
+ value: 95514483,
+ },
+ {
+ date: '2014-03-20',
+ value: 97630630,
+ },
+ {
+ date: '2014-03-21',
+ value: 62340239,
+ },
+ {
+ date: '2014-03-22',
+ value: 62349091,
+ },
+ {
+ date: '2014-03-23',
+ value: 65613305,
+ },
+ {
+ date: '2014-03-24',
+ value: 65592466,
+ },
+ {
+ date: '2014-03-25',
+ value: 63408762,
+ },
+ {
+ date: '2014-03-26',
+ value: 91991454,
+ },
+ {
+ date: '2014-03-27',
+ value: 96123955,
+ },
+ {
+ date: '2014-03-28',
+ value: 92817214,
+ },
+ {
+ date: '2014-03-29',
+ value: 93029590,
+ },
+ {
+ date: '2014-03-30',
+ value: 108753398,
+ },
+ {
+ date: '2014-03-31',
+ value: 49383763,
+ },
+ {
+ date: '2014-04-01',
+ value: 100151737,
+ },
+ {
+ date: '2014-04-02',
+ value: 44985209,
+ },
+ {
+ date: '2014-04-03',
+ value: 52913669,
+ },
+ {
+ date: '2014-04-04',
+ value: 48748268,
+ },
+ {
+ date: '2014-04-05',
+ value: 23829135,
+ },
+ {
+ date: '2014-04-06',
+ value: 58694727,
+ },
+ {
+ date: '2014-04-07',
+ value: 50868994,
+ },
+ {
+ date: '2014-04-08',
+ value: 43799013,
+ },
+ {
+ date: '2014-04-09',
+ value: 4042416,
+ },
+ {
+ date: '2014-04-10',
+ value: 47298692,
+ },
+ {
+ date: '2014-04-11',
+ value: 53353499,
+ },
+ {
+ date: '2014-04-12',
+ value: 71248129,
+ },
+ {
+ date: '2014-04-13',
+ value: 75253744,
+ },
+ {
+ date: '2014-04-14',
+ value: 68976648,
+ },
+ {
+ date: '2014-04-15',
+ value: 71002284,
+ },
+ {
+ date: '2014-04-16',
+ value: 75052401,
+ },
+ {
+ date: '2014-04-17',
+ value: 83894030,
+ },
+ {
+ date: '2014-04-18',
+ value: 50236528,
+ },
+ {
+ date: '2014-04-19',
+ value: 59739114,
+ },
+ {
+ date: '2014-04-20',
+ value: 56407136,
+ },
+ {
+ date: '2014-04-21',
+ value: 108323177,
+ },
+ {
+ date: '2014-04-22',
+ value: 101578914,
+ },
+ {
+ date: '2014-04-23',
+ value: 95877608,
+ },
+ {
+ date: '2014-04-24',
+ value: 62088857,
+ },
+ {
+ date: '2014-04-25',
+ value: 92071353,
+ },
+ {
+ date: '2014-04-26',
+ value: 81790062,
+ },
+ {
+ date: '2014-04-27',
+ value: 105003761,
+ },
+ {
+ date: '2014-04-28',
+ value: 100457727,
+ },
+ {
+ date: '2014-04-29',
+ value: 98253926,
+ },
+ {
+ date: '2014-04-30',
+ value: 67956992,
+ },
+ ],
+]
+
+//Irregular TimeSeries
+let ts1 = 1388534400000
+let ts2 = 1388620800000
+let ts3 = 1389052800000
+
+let dataSet: number[][][] = [[], [], []]
+
+for (let i = 0; i < 12; i++) {
+ ts1 = ts1 + 86400000
+ let innerArr = [ts1, dataSeries[2][i].value]
+ dataSet[0].push(innerArr)
+}
+for (let i = 0; i < 18; i++) {
+ ts2 = ts2 + 86400000
+ let innerArr = [ts2, dataSeries[1][i].value]
+ dataSet[1].push(innerArr)
+}
+for (let i = 0; i < 12; i++) {
+ ts3 = ts3 + 86400000
+ let innerArr = [ts3, dataSeries[0][i].value]
+ dataSet[2].push(innerArr)
+}
+
+@Component({
+ selector: 'app-area',
+ standalone: true,
+ imports: [NgApexchartsModule, PageTitleComponent, UIExamplesListComponent],
+ templateUrl: './area.component.html',
+ styles: ``,
+})
+export class AreaComponent {
+ credits = credits
+ constructor() {}
+
+ basicAreaChart: Partial = {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ height: 380,
+ type: 'area',
+ zoom: {
+ enabled: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 3,
+ curve: 'straight',
+ },
+ colors: ['#4ecac2'],
+ series: [
+ {
+ name: 'STOCK ABC',
+ data: series.monthDataSeries2.prices,
+ },
+ ],
+ title: {
+ text: 'Fundamental Analysis of Stocks',
+ align: 'right',
+ },
+ subtitle: {
+ text: 'Price Movements',
+ align: 'left',
+ },
+ labels: series.monthDataSeries2.dates,
+ xaxis: {
+ type: 'datetime',
+ },
+ yaxis: {
+ opposite: false,
+ },
+ legend: {
+ horizontalAlign: 'left',
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ splineAreaChart: Partial = {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ height: 380,
+ type: 'area',
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 3,
+ curve: 'smooth',
+ },
+ colors: ['#1c84ee', '#22c55e'],
+ series: [
+ {
+ name: 'Series 1',
+ data: [92, 88, 98, 72, 92, 100, 122],
+ },
+ {
+ name: 'Series 2',
+ data: [102, 98, 108, 82, 102, 110, 134],
+ },
+ ],
+ legend: {
+ offsetY: 5,
+ },
+ xaxis: {
+ categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'],
+ },
+ tooltip: {
+ fixed: {
+ enabled: false,
+ position: 'topRight',
+ },
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'],
+ opacity: 0.2,
+ },
+ padding: {
+ bottom: 5,
+ },
+ },
+ }
+
+ datetimeAreaChart: Partial = {
+ annotations: {
+ yaxis: [
+ {
+ y: 30,
+ borderColor: '#999',
+ label: {
+ text: 'Support',
+ style: {
+ color: '#fff',
+ background: '#00E396',
+ },
+ },
+ },
+ ],
+ xaxis: [
+ {
+ x: new Date('14 Nov 2012').getTime(),
+ borderColor: '#999',
+ label: {
+ text: 'Rally',
+ style: {
+ color: '#fff',
+ background: '#775DD0',
+ },
+ },
+ },
+ ],
+ },
+ chart: {
+ type: 'area',
+ height: 350,
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ width: 3,
+ curve: 'smooth',
+ },
+ colors: ['#4ecac2'],
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ data: [
+ [1327359600000, 30.95],
+ [1327446000000, 31.34],
+ [1327532400000, 31.18],
+ [1327618800000, 31.05],
+ [1327878000000, 31.0],
+ [1327964400000, 30.95],
+ [1328050800000, 31.24],
+ [1328137200000, 31.29],
+ [1328223600000, 31.85],
+ [1328482800000, 31.86],
+ [1328569200000, 32.28],
+ [1328655600000, 32.1],
+ [1328742000000, 32.65],
+ [1328828400000, 32.21],
+ [1329087600000, 32.35],
+ [1329174000000, 32.44],
+ [1329260400000, 32.46],
+ [1329346800000, 32.86],
+ [1329433200000, 32.75],
+ [1329778800000, 32.54],
+ [1329865200000, 32.33],
+ [1329951600000, 32.97],
+ [1330038000000, 33.41],
+ [1330297200000, 33.27],
+ [1330383600000, 33.27],
+ [1330470000000, 32.89],
+ [1330556400000, 33.1],
+ [1330642800000, 33.73],
+ [1330902000000, 33.22],
+ [1330988400000, 31.99],
+ [1331074800000, 32.41],
+ [1331161200000, 33.05],
+ [1331247600000, 33.64],
+ [1331506800000, 33.56],
+ [1331593200000, 34.22],
+ [1331679600000, 33.77],
+ [1331766000000, 34.17],
+ [1331852400000, 33.82],
+ [1332111600000, 34.51],
+ [1332198000000, 33.16],
+ [1332284400000, 33.56],
+ [1332370800000, 33.71],
+ [1332457200000, 33.81],
+ [1332712800000, 34.4],
+ [1332799200000, 34.63],
+ [1332885600000, 34.46],
+ [1332972000000, 34.48],
+ [1333058400000, 34.31],
+ [1333317600000, 34.7],
+ [1333404000000, 34.31],
+ [1333490400000, 33.46],
+ [1333576800000, 33.59],
+ [1333922400000, 33.22],
+ [1334008800000, 32.61],
+ [1334095200000, 33.01],
+ [1334181600000, 33.55],
+ [1334268000000, 33.18],
+ [1334527200000, 32.84],
+ [1334613600000, 33.84],
+ [1334700000000, 33.39],
+ [1334786400000, 32.91],
+ [1334872800000, 33.06],
+ [1335132000000, 32.62],
+ [1335218400000, 32.4],
+ [1335304800000, 33.13],
+ [1335391200000, 33.26],
+ [1335477600000, 33.58],
+ [1335736800000, 33.55],
+ [1335823200000, 33.77],
+ [1335909600000, 33.76],
+ [1335996000000, 33.32],
+ [1336082400000, 32.61],
+ [1336341600000, 32.52],
+ [1336428000000, 32.67],
+ [1336514400000, 32.52],
+ [1336600800000, 31.92],
+ [1336687200000, 32.2],
+ [1336946400000, 32.23],
+ [1337032800000, 32.33],
+ [1337119200000, 32.36],
+ [1337205600000, 32.01],
+ [1337292000000, 31.31],
+ [1337551200000, 32.01],
+ [1337637600000, 32.01],
+ [1337724000000, 32.18],
+ [1337810400000, 31.54],
+ [1337896800000, 31.6],
+ [1338242400000, 32.05],
+ [1338328800000, 31.29],
+ [1338415200000, 31.05],
+ [1338501600000, 29.82],
+ [1338760800000, 30.31],
+ [1338847200000, 30.7],
+ [1338933600000, 31.69],
+ [1339020000000, 31.32],
+ [1339106400000, 31.65],
+ [1339365600000, 31.13],
+ [1339452000000, 31.77],
+ [1339538400000, 31.79],
+ [1339624800000, 31.67],
+ [1339711200000, 32.39],
+ [1339970400000, 32.63],
+ [1340056800000, 32.89],
+ [1340143200000, 31.99],
+ [1340229600000, 31.23],
+ [1340316000000, 31.57],
+ [1340575200000, 30.84],
+ [1340661600000, 31.07],
+ [1340748000000, 31.41],
+ [1340834400000, 31.17],
+ [1340920800000, 32.37],
+ [1341180000000, 32.19],
+ [1341266400000, 32.51],
+ [1341439200000, 32.53],
+ [1341525600000, 31.37],
+ [1341784800000, 30.43],
+ [1341871200000, 30.44],
+ [1341957600000, 30.2],
+ [1342044000000, 30.14],
+ [1342130400000, 30.65],
+ [1342389600000, 30.4],
+ [1342476000000, 30.65],
+ [1342562400000, 31.43],
+ [1342648800000, 31.89],
+ [1342735200000, 31.38],
+ [1342994400000, 30.64],
+ [1343080800000, 30.02],
+ [1343167200000, 30.33],
+ [1343253600000, 30.95],
+ [1343340000000, 31.89],
+ [1343599200000, 31.01],
+ [1343685600000, 30.88],
+ [1343772000000, 30.69],
+ [1343858400000, 30.58],
+ [1343944800000, 32.02],
+ [1344204000000, 32.14],
+ [1344290400000, 32.37],
+ [1344376800000, 32.51],
+ [1344463200000, 32.65],
+ [1344549600000, 32.64],
+ [1344808800000, 32.27],
+ [1344895200000, 32.1],
+ [1344981600000, 32.91],
+ [1345068000000, 33.65],
+ [1345154400000, 33.8],
+ [1345413600000, 33.92],
+ [1345500000000, 33.75],
+ [1345586400000, 33.84],
+ [1345672800000, 33.5],
+ [1345759200000, 32.26],
+ [1346018400000, 32.32],
+ [1346104800000, 32.06],
+ [1346191200000, 31.96],
+ [1346277600000, 31.46],
+ [1346364000000, 31.27],
+ [1346709600000, 31.43],
+ [1346796000000, 32.26],
+ [1346882400000, 32.79],
+ [1346968800000, 32.46],
+ [1347228000000, 32.13],
+ [1347314400000, 32.43],
+ [1347400800000, 32.42],
+ [1347487200000, 32.81],
+ [1347573600000, 33.34],
+ [1347832800000, 33.41],
+ [1347919200000, 32.57],
+ [1348005600000, 33.12],
+ [1348092000000, 34.53],
+ [1348178400000, 33.83],
+ [1348437600000, 33.41],
+ [1348524000000, 32.9],
+ [1348610400000, 32.53],
+ [1348696800000, 32.8],
+ [1348783200000, 32.44],
+ [1349042400000, 32.62],
+ [1349128800000, 32.57],
+ [1349215200000, 32.6],
+ [1349301600000, 32.68],
+ [1349388000000, 32.47],
+ [1349647200000, 32.23],
+ [1349733600000, 31.68],
+ [1349820000000, 31.51],
+ [1349906400000, 31.78],
+ [1349992800000, 31.94],
+ [1350252000000, 32.33],
+ [1350338400000, 33.24],
+ [1350424800000, 33.44],
+ [1350511200000, 33.48],
+ [1350597600000, 33.24],
+ [1350856800000, 33.49],
+ [1350943200000, 33.31],
+ [1351029600000, 33.36],
+ [1351116000000, 33.4],
+ [1351202400000, 34.01],
+ [1351638000000, 34.02],
+ [1351724400000, 34.36],
+ [1351810800000, 34.39],
+ [1352070000000, 34.24],
+ [1352156400000, 34.39],
+ [1352242800000, 33.47],
+ [1352329200000, 32.98],
+ [1352415600000, 32.9],
+ [1352674800000, 32.7],
+ [1352761200000, 32.54],
+ [1352847600000, 32.23],
+ [1352934000000, 32.64],
+ [1353020400000, 32.65],
+ [1353279600000, 32.92],
+ [1353366000000, 32.64],
+ [1353452400000, 32.84],
+ [1353625200000, 33.4],
+ [1353884400000, 33.3],
+ [1353970800000, 33.18],
+ [1354057200000, 33.88],
+ [1354143600000, 34.09],
+ [1354230000000, 34.61],
+ [1354489200000, 34.7],
+ [1354575600000, 35.3],
+ [1354662000000, 35.4],
+ [1354748400000, 35.14],
+ [1354834800000, 35.48],
+ [1355094000000, 35.75],
+ [1355180400000, 35.54],
+ [1355266800000, 35.96],
+ [1355353200000, 35.53],
+ [1355439600000, 37.56],
+ [1355698800000, 37.42],
+ [1355785200000, 37.49],
+ [1355871600000, 38.09],
+ [1355958000000, 37.87],
+ [1356044400000, 37.71],
+ [1356303600000, 37.53],
+ [1356476400000, 37.55],
+ [1356562800000, 37.3],
+ [1356649200000, 36.9],
+ [1356908400000, 37.68],
+ [1357081200000, 38.34],
+ [1357167600000, 37.75],
+ [1357254000000, 38.13],
+ [1357513200000, 37.94],
+ [1357599600000, 38.14],
+ [1357686000000, 38.66],
+ [1357772400000, 38.62],
+ [1357858800000, 38.09],
+ [1358118000000, 38.16],
+ [1358204400000, 38.15],
+ [1358290800000, 37.88],
+ [1358377200000, 37.73],
+ [1358463600000, 37.98],
+ [1358809200000, 37.95],
+ [1358895600000, 38.25],
+ [1358982000000, 38.1],
+ [1359068400000, 38.32],
+ [1359327600000, 38.24],
+ [1359414000000, 38.52],
+ [1359500400000, 37.94],
+ [1359586800000, 37.83],
+ [1359673200000, 38.34],
+ [1359932400000, 38.1],
+ [1360018800000, 38.51],
+ [1360105200000, 38.4],
+ [1360191600000, 38.07],
+ [1360278000000, 39.12],
+ [1360537200000, 38.64],
+ [1360623600000, 38.89],
+ [1360710000000, 38.81],
+ [1360796400000, 38.61],
+ [1360882800000, 38.63],
+ [1361228400000, 38.99],
+ [1361314800000, 38.77],
+ [1361401200000, 38.34],
+ [1361487600000, 38.55],
+ [1361746800000, 38.11],
+ [1361833200000, 38.59],
+ [1361919600000, 39.6],
+ ],
+ },
+ ],
+ markers: {
+ size: 0,
+ },
+ xaxis: {
+ type: 'datetime',
+ min: new Date('01 Mar 2012').getTime(),
+ tickAmount: 6,
+ },
+ tooltip: {
+ x: {
+ format: 'dd MMM yyyy',
+ },
+ },
+ fill: {
+ type: 'gradient',
+ gradient: {
+ shadeIntensity: 1,
+ opacityFrom: 0.7,
+ opacityTo: 0.9,
+ stops: [0, 100],
+ },
+ },
+ }
+
+ negativeAreaChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'area',
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 2,
+ curve: 'straight',
+ },
+ colors: ['#0acf97', '#ffbc00'],
+ series: [
+ {
+ name: 'North',
+ data: [
+ {
+ x: 1996,
+ y: 396,
+ },
+ {
+ x: 1997,
+ y: 334,
+ },
+ {
+ x: 1998,
+ y: 242,
+ },
+ {
+ x: 1999,
+ y: 356,
+ },
+ {
+ x: 2000,
+ y: 351,
+ },
+ {
+ x: 2001,
+ y: 334,
+ },
+ {
+ x: 2002,
+ y: 392,
+ },
+ {
+ x: 2003,
+ y: 317,
+ },
+ {
+ x: 2004,
+ y: 320,
+ },
+ {
+ x: 2005,
+ y: 335,
+ },
+ {
+ x: 2006,
+ y: 365,
+ },
+ {
+ x: 2007,
+ y: 376,
+ },
+ {
+ x: 2008,
+ y: 334,
+ },
+ {
+ x: 2009,
+ y: 365,
+ },
+ {
+ x: 2010,
+ y: 388,
+ },
+ {
+ x: 2011,
+ y: 398,
+ },
+ {
+ x: 2012,
+ y: 354,
+ },
+ {
+ x: 2013,
+ y: 368,
+ },
+ {
+ x: 2014,
+ y: 398,
+ },
+ {
+ x: 2015,
+ y: 356,
+ },
+ ],
+ },
+ {
+ name: 'South',
+ data: [
+ {
+ x: 1996,
+ y: 162,
+ },
+ {
+ x: 1997,
+ y: 90,
+ },
+ {
+ x: 1998,
+ y: 50,
+ },
+ {
+ x: 1999,
+ y: 77,
+ },
+ {
+ x: 2000,
+ y: 35,
+ },
+ {
+ x: 2001,
+ y: -45,
+ },
+ {
+ x: 2002,
+ y: -88,
+ },
+ {
+ x: 2003,
+ y: -120,
+ },
+ {
+ x: 2004,
+ y: -156,
+ },
+ {
+ x: 2005,
+ y: -123,
+ },
+ {
+ x: 2006,
+ y: -88,
+ },
+ {
+ x: 2007,
+ y: -66,
+ },
+ {
+ x: 2008,
+ y: -45,
+ },
+ {
+ x: 2009,
+ y: -29,
+ },
+ {
+ x: 2010,
+ y: -45,
+ },
+ {
+ x: 2011,
+ y: -88,
+ },
+ {
+ x: 2012,
+ y: -132,
+ },
+ {
+ x: 2013,
+ y: -146,
+ },
+ {
+ x: 2014,
+ y: -169,
+ },
+ {
+ x: 2015,
+ y: -184,
+ },
+ ],
+ },
+ ],
+ xaxis: {
+ type: 'datetime',
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ },
+ yaxis: {
+ tickAmount: 4,
+ floating: false,
+
+ labels: {
+ style: {
+ colors: '#8e8da4',
+ },
+ offsetY: -7,
+ offsetX: 0,
+ },
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ },
+ fill: {
+ opacity: 0.5,
+ },
+ tooltip: {
+ x: {
+ format: 'yyyy',
+ },
+ fixed: {
+ enabled: false,
+ position: 'topRight',
+ },
+ },
+ legend: {
+ offsetY: 5,
+ },
+ grid: {
+ yaxis: {
+ lines: {
+ offsetX: -30,
+ },
+ },
+ padding: {
+ left: 0,
+ bottom: 10,
+ },
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ /**
+ * Negative Months Values Chart
+ */
+
+ githubmMonthAreaChart: Partial = {
+ chart: {
+ height: 175,
+ type: 'area',
+ toolbar: {
+ autoSelected: 'selection',
+ },
+ brush: {
+ enabled: true,
+ target: 'chartyear',
+ },
+ selection: {
+ enabled: true,
+ xaxis: {
+ min: new Date('05 Jan 2014').getTime(),
+ max: new Date('04 Jan 2015').getTime(),
+ },
+ },
+ },
+ colors: ['#4ecac2'],
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 0,
+ curve: 'smooth',
+ },
+
+ series: [
+ {
+ name: 'commits',
+ data: githubdata.series,
+ },
+ ],
+ fill: {
+ opacity: 1,
+ type: 'solid',
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'left',
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ }
+
+ /**
+ * Negative Years Values Chart
+ */
+
+ githubmYearAreaChart: Partial = {
+ chart: {
+ id: 'chartyear',
+ type: 'area',
+ height: 200,
+ toolbar: {
+ show: false,
+ autoSelected: 'pan',
+ },
+ },
+ colors: ['#1c84ee'],
+ stroke: {
+ width: 0,
+ curve: 'smooth',
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ fill: {
+ opacity: 1,
+ type: 'solid',
+ },
+ series: [
+ {
+ name: 'commits',
+ data: githubdata.series,
+ },
+ ],
+ yaxis: {
+ tickAmount: 10,
+ labels: {
+ show: false,
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ }
+
+ generateDayWiseTimeSeries(
+ baseval: number,
+ count: number,
+ yrange: { max: number; min: number }
+ ) {
+ var i = 0
+ var series = []
+ while (i < count) {
+ var x = baseval
+ var y =
+ Math.floor(Math.random() * (yrange.max - yrange.min + 1)) + yrange.min
+
+ series.push([x, y])
+ baseval += 86400000
+ i++
+ }
+ return series
+ }
+
+ stackedAreaChart: Partial = {
+ chart: {
+ height: 422,
+ type: 'area',
+ stacked: true,
+ events: {
+ selection: function (chart, e) {},
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#1c84ee', '#7f56da', '#4ecac2'],
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 2,
+ curve: 'smooth',
+ },
+
+ series: [
+ {
+ name: 'South',
+ data: this.generateDayWiseTimeSeries(
+ new Date('12 Apr ' + currentYear).getTime(),
+ 20,
+ {
+ min: 40,
+ max: 80,
+ }
+ ),
+ },
+ {
+ name: 'North',
+ data: this.generateDayWiseTimeSeries(
+ new Date('12 Apr ' + currentYear).getTime(),
+ 20,
+ {
+ min: 30,
+ max: 50,
+ }
+ ),
+ },
+
+ {
+ name: 'Central',
+ data: this.generateDayWiseTimeSeries(
+ new Date('12 Apr ' + currentYear).getTime(),
+ 20,
+ {
+ min: 20,
+ max: 30,
+ }
+ ),
+ },
+ ],
+ fill: {
+ gradient: {
+ opacityFrom: 0.6,
+ opacityTo: 0.8,
+ },
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'left',
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ },
+ },
+ ],
+ }
+
+ timeSeriesChart: Partial = {
+ chart: {
+ type: 'area',
+ stacked: false,
+ height: 380,
+ zoom: {
+ enabled: false,
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ line: {},
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ name: 'Product A',
+ data: dataSet[0],
+ },
+ {
+ name: 'Product B',
+ data: dataSet[1],
+ },
+ {
+ name: 'Product C',
+ data: dataSet[2],
+ },
+ ],
+ colors: ['#1c84ee', '#7f56da', '#ef5f5f'],
+ markers: {
+ size: 0,
+ },
+ stroke: {
+ width: 3,
+ },
+ fill: {
+ gradient: {
+ shadeIntensity: 1,
+ inverseColors: false,
+ opacityFrom: 0.45,
+ opacityTo: 0.05,
+ stops: [20, 100, 100, 100],
+ },
+ },
+ yaxis: {
+ labels: {
+ style: {
+ colors: ['#8e8da4'],
+ },
+ offsetX: 0,
+ formatter: function (val) {
+ return (val / 1000000).toFixed(0)
+ },
+ },
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ tickAmount: 8,
+ labels: {
+ formatter: function (val) {
+ return moment(new Date(val)).format('DD MMM YYYY')
+ },
+ },
+ },
+ title: {
+ text: 'Irregular Data in Time Series',
+ align: 'left',
+ offsetX: 0,
+ },
+ tooltip: {
+ shared: true,
+ y: {
+ formatter: function (val) {
+ return (val / 1000000).toFixed(0) + ' points'
+ },
+ },
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'center',
+ offsetX: -10,
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ nullvaluesChart: Partial = {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ height: 380,
+ type: 'area',
+ animations: {
+ enabled: false,
+ },
+ zoom: {
+ enabled: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ curve: 'straight',
+ },
+ colors: ['#ff6c2f'],
+ series: [
+ {
+ name: 'Network',
+ data: [
+ {
+ x: 'Dec 23 2022',
+ y: null,
+ },
+ {
+ x: 'Dec 24 2022',
+ y: 44,
+ },
+ {
+ x: 'Dec 25 2022',
+ y: 31,
+ },
+ {
+ x: 'Dec 26 2022',
+ y: 38,
+ },
+ {
+ x: 'Dec 27 2022',
+ y: null,
+ },
+ {
+ x: 'Dec 28 2022',
+ y: 32,
+ },
+ {
+ x: 'Dec 29 2022',
+ y: 55,
+ },
+ {
+ x: 'Dec 30 2022',
+ y: 51,
+ },
+ {
+ x: 'Dec 31 2022',
+ y: 67,
+ },
+ {
+ x: 'Jan 01 ' + currentYear,
+ y: 22,
+ },
+ {
+ x: 'Jan 02 ' + currentYear,
+ y: 34,
+ },
+ {
+ x: 'Jan 03 ' + currentYear,
+ y: null,
+ },
+ {
+ x: 'Jan 04 ' + currentYear,
+ y: null,
+ },
+ {
+ x: 'Jan 05 ' + currentYear,
+ y: 11,
+ },
+ {
+ x: 'Jan 06 ' + currentYear,
+ y: 4,
+ },
+ {
+ x: 'Jan 07 ' + currentYear,
+ y: 15,
+ },
+ {
+ x: 'Jan 08 ' + currentYear,
+ y: null,
+ },
+ {
+ x: 'Jan 09 ' + currentYear,
+ y: 9,
+ },
+ {
+ x: 'Jan 10 ' + currentYear,
+ y: 34,
+ },
+ {
+ x: 'Jan 11 ' + currentYear,
+ y: null,
+ },
+ {
+ x: 'Jan 12 ' + currentYear,
+ y: null,
+ },
+ {
+ x: 'Jan 13 ' + currentYear,
+ y: 13,
+ },
+ {
+ x: 'Jan 14 ' + currentYear,
+ y: null,
+ },
+ ],
+ },
+ ],
+ fill: {
+ opacity: 0.8,
+ gradient: {},
+ pattern: {
+ style: ['verticalLines', 'horizontalLines'],
+ width: 5,
+ },
+ },
+ markers: {
+ size: 5,
+ hover: {
+ size: 9,
+ },
+ },
+ title: {
+ text: 'Network Monitoring',
+ },
+ tooltip: {
+ intersect: true,
+ shared: false,
+ },
+ // theme: {
+ // palette: 'palette1',
+ // },
+ xaxis: {
+ type: 'datetime',
+ },
+ yaxis: {
+ title: {
+ text: 'Bytes Received',
+ },
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ },
+ },
+ ],
+ }
+}
diff --git a/apiferia/src/app/views/charts/bar/bar.component.html b/apiferia/src/app/views/charts/bar/bar.component.html
new file mode 100644
index 00000000..36c05d92
--- /dev/null
+++ b/apiferia/src/app/views/charts/bar/bar.component.html
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
Overview
+
+ Find the TS file for the following chart at:
+ src/app/views/charts/bar.component.ts
+
+
+
+
+
+
+
+ Basic Bar Chart#
+
+
+
+
+
+
+
+
+
+ Grouped Bar Chart#
+
+
+
+
+
+
+
+
+
+ Stacked Bar Chart#
+
+
+
+
+
+
+
+
+
+ 100% Stacked Bar Chart#
+
+
+
+
+
+
+
+
+
+ Bar with Negative Values#
+
+
+
+
+
+
+
+
+
+ Reversed Bar Chart#
+
+
+
+
+
+
+
+
+
+ Bar with Image Fill#
+
+
+
+
+
+
+
+
+
+ Custom DataLabels Bar#
+
+
+
+
+
+
+
+
+
+ Patterned Bar Chart#
+
+
+
+
+
+
+
+
+
+ Bar with Markers#
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/bar/bar.component.spec.ts b/apiferia/src/app/views/charts/bar/bar.component.spec.ts
new file mode 100644
index 00000000..62c3e804
--- /dev/null
+++ b/apiferia/src/app/views/charts/bar/bar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { BarComponent } from './bar.component'
+
+describe('BarComponent', () => {
+ let component: BarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [BarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(BarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/bar/bar.component.ts b/apiferia/src/app/views/charts/bar/bar.component.ts
new file mode 100644
index 00000000..950052c8
--- /dev/null
+++ b/apiferia/src/app/views/charts/bar/bar.component.ts
@@ -0,0 +1,784 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-bar',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './bar.component.html',
+ styles: ``,
+})
+export class BarComponent {
+ barChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ data: [455, 435, 410, 480, 530, 575, 685, 1345, 1165, 1075],
+ },
+ ],
+ colors: ['#1c84ee'],
+ xaxis: {
+ categories: [
+ 'South Korea',
+ 'Canada',
+ 'United Kingdom',
+ 'Netherlands',
+ 'Italy',
+ 'France',
+ 'Japan',
+ 'United States',
+ 'China',
+ 'Germany',
+ ],
+ },
+ states: {
+ hover: {},
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ // Group bar chart
+ groupedChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ dataLabels: {
+ position: 'top',
+ },
+ },
+ },
+ dataLabels: {
+ enabled: true,
+ offsetX: -6,
+ style: {
+ fontSize: '12px',
+ colors: ['#fff'],
+ },
+ },
+ colors: ['#1c84ee', '#4ecac2'],
+ stroke: {
+ show: true,
+ width: 1,
+ colors: ['#fff'],
+ },
+ series: [
+ {
+ name: 'Series 1',
+ data: [51, 30, 31, 50, 11, 42, 30],
+ },
+ {
+ name: 'Series 2',
+ data: [46, 57, 43, 66, 24, 45, 23],
+ },
+ ],
+ xaxis: {
+ categories: [2016, 2017, 2018, 2019, 2021, 2022, 2023],
+ },
+ legend: {
+ offsetY: 5,
+ },
+ states: {
+ hover: {},
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ }
+
+ // Group bar chart
+ stackedChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ stacked: true,
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ },
+ },
+ stroke: {
+ show: false,
+ },
+ series: [
+ {
+ name: 'Marine Sprite',
+ data: [30, 17, 24, 37, 30, 29, 15],
+ },
+ {
+ name: 'Striking Calf',
+ data: [11, 9, 7, 10, 8, 11, 6],
+ },
+ {
+ name: 'Tank Picture',
+ data: [14, 19, 13, 11, 17, 13, 22],
+ },
+ {
+ name: 'Bucket Slope',
+ data: [55, 34, 35, 54, 15, 45, 34],
+ },
+ {
+ name: 'Reborn Kid',
+ data: [46, 57, 43, 39, 24, 45, 23],
+ },
+ ],
+ xaxis: {
+ categories: [2016, 2017, 2018, 2019, 2021, 2022, 2023],
+ labels: {
+ formatter: function (val) {
+ return val + 'K'
+ },
+ },
+ },
+ yaxis: {
+ title: {
+ text: undefined,
+ },
+ },
+ colors: ['#1c84ee', '#4ecac2', '#22c55e', '#f9b931', '#ff6c2f'],
+ tooltip: {
+ y: {
+ formatter: function (val) {
+ return val + 'K'
+ },
+ },
+ },
+ fill: {
+ opacity: 1,
+ },
+ states: {
+ hover: {},
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'center',
+ offsetY: 10,
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ // full stacked bar chart
+ fullstackedChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ stacked: true,
+ stackType: '100%',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ },
+ },
+ stroke: {
+ width: 1,
+ colors: ['#fff'],
+ },
+ series: [
+ {
+ name: 'Marine Sprite',
+ data: [30, 17, 24, 37, 30, 29, 15],
+ },
+ {
+ name: 'Striking Calf',
+ data: [11, 9, 7, 10, 8, 11, 6],
+ },
+ {
+ name: 'Tank Picture',
+ data: [14, 19, 13, 11, 17, 13, 22],
+ },
+ {
+ name: 'Bucket Slope',
+ data: [55, 34, 35, 54, 15, 45, 34],
+ },
+ {
+ name: 'Reborn Kid',
+ data: [46, 57, 43, 39, 24, 45, 23],
+ },
+ ],
+ xaxis: {
+ categories: [2008, 2009, 2010, 2011, 2012, 2013, 2014],
+ },
+ colors: ['#1c84ee', '#4ecac2', '#22c55e', '#f9b931', '#ff6c2f'],
+ tooltip: {
+ y: {
+ formatter: function (val) {
+ return val + 'K'
+ },
+ },
+ },
+ fill: {
+ opacity: 1,
+ },
+ states: {
+ hover: {
+ filter: {
+ type: 'none',
+ },
+ },
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'center',
+ offsetY: 10,
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ top: 0,
+ },
+ },
+ }
+
+ // Negative Bar Chart
+
+ negativeChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ stacked: true,
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#1c84ee', '#4ecac2'],
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ barHeight: '80%',
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 1,
+ colors: ['#fff'],
+ },
+ series: [
+ {
+ name: 'Males',
+ data: [
+ 0.75, 0.85, 0.96, 1.08, 1.7, 2.3, 3.1, 4.0, 4.1, 4.4, 4.2, 4.5, 4.3,
+ 4.4, 4.7, 4.1, 3.7, 3.2,
+ ],
+ },
+ {
+ name: 'Females',
+ data: [
+ -0.75, -0.85, -0.86, -0.98, -1.2, -2.0, -2.65, -3.5, -3.76, -4.02,
+ -4.1, -4.2, -3.9, -3.8, -3.9, -3.2, -2.9, -2.6,
+ ],
+ },
+ ],
+ yaxis: {
+ min: -5,
+ max: 5,
+ title: {
+ // text: 'Age',
+ },
+ },
+ tooltip: {
+ shared: false,
+ x: {
+ formatter: function (val) {
+ return val.toString()
+ },
+ },
+ y: {
+ formatter: function (val) {
+ return Math.abs(val) + '%'
+ },
+ },
+ },
+ xaxis: {
+ categories: [
+ '90+',
+ '85-89',
+ '80-84',
+ '75-79',
+ '70-74',
+ '65-69',
+ '60-64',
+ '55-59',
+ '50-54',
+ '45-49',
+ '40-44',
+ '35-39',
+ '30-34',
+ '25-29',
+ '20-24',
+ '15-19',
+ '10-14',
+ '0-9',
+ ],
+ title: {
+ text: 'Percent',
+ },
+ labels: {
+ formatter: function (val) {
+ return Math.abs(Math.round(Number(val))) + '%'
+ },
+ },
+ },
+ legend: {
+ offsetY: 7,
+ },
+ }
+
+ reversedChart: Partial = {
+ series: [
+ {
+ data: [380, 400, 418, 440, 500, 530, 580],
+ },
+ ],
+ chart: {
+ type: 'bar',
+ height: 380,
+ toolbar: {
+ show: false,
+ },
+ },
+ annotations: {
+ xaxis: [
+ {
+ x: 500,
+ borderColor: '#f9b931',
+ label: {
+ borderColor: '#f9b931',
+ style: {
+ color: '#fff',
+ background: '#f9b931',
+ },
+ text: 'X annotation',
+ },
+ },
+ ],
+ yaxis: [
+ {
+ y: 'July',
+ y2: 'September',
+ label: {
+ text: 'Y annotation',
+ },
+ },
+ ],
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ },
+ },
+ dataLabels: {
+ enabled: true,
+ },
+ xaxis: {
+ categories: ['Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec', 'Jan'],
+ },
+ colors: ['#f9b931'],
+ grid: {
+ xaxis: {
+ lines: {
+ show: true,
+ },
+ },
+ },
+ yaxis: {
+ reversed: true,
+ axisTicks: {
+ show: true,
+ },
+ },
+ }
+
+ imagefillChart: Partial = {
+ chart: {
+ height: 450,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ animations: {
+ enabled: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ barHeight: '100%',
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ colors: ['#fff'],
+ width: 0.2,
+ },
+ series: [
+ {
+ name: 'coins',
+ data: [
+ 2, 4, 3, 4, 3, 5, 5, 6.5, 6, 5, 4, 5, 8, 7, 7, 8, 8, 10, 9, 9, 12, 12,
+ 11, 12, 13, 14, 16, 14, 15, 17, 19, 21,
+ ],
+ },
+ ],
+ yaxis: {
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ labels: {
+ show: false,
+ },
+ title: {
+ text: 'Weight',
+ },
+ },
+ grid: {
+ position: 'back',
+ borderColor: '#f1f3fa',
+ },
+ fill: {
+ type: 'image',
+ opacity: 0.87,
+ image: {
+ src: ['../../../assets/images/small/img-4.jpg'],
+ width: 466,
+ height: 406,
+ },
+ },
+ }
+
+ datalablesChart: Partial = {
+ chart: {
+ height: 450,
+ type: 'bar',
+ },
+ plotOptions: {
+ bar: {
+ barHeight: '100%',
+ distributed: true,
+ horizontal: true,
+ dataLabels: {
+ position: 'bottom',
+ },
+ },
+ },
+ colors: [
+ '#1c84ee',
+ '#53389f',
+ '#7f56da',
+ '#ff86c8',
+ '#ef5f5f',
+ '#ff6c2f',
+ '#f9b931',
+ '#22c55e',
+ '#040505',
+ '#4ecac2',
+ ],
+ dataLabels: {
+ enabled: true,
+ textAnchor: 'start',
+ style: {
+ colors: ['#fff'],
+ },
+ formatter: function (val, opt) {
+ return opt.w.globals.labels[opt.dataPointIndex] + ': ' + val
+ },
+ offsetX: 0,
+ dropShadow: {
+ enabled: false,
+ },
+ },
+ series: [
+ {
+ data: [400, 430, 448, 470, 540, 580, 690, 1100, 1200, 1380],
+ },
+ ],
+ stroke: {
+ width: 0,
+ colors: ['#fff'],
+ },
+ xaxis: {
+ categories: [
+ 'South Korea',
+ 'Canada',
+ 'United Kingdom',
+ 'Netherlands',
+ 'Italy',
+ 'France',
+ 'Japan',
+ 'United States',
+ 'China',
+ 'India',
+ ],
+ axisBorder: {
+ show: false,
+ },
+ },
+ yaxis: {
+ labels: {
+ show: false,
+ },
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+
+ tooltip: {
+ theme: 'dark',
+ x: {
+ show: false,
+ },
+ y: {
+ title: {
+ formatter: function () {
+ return ''
+ },
+ },
+ },
+ },
+ }
+
+ patternChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ stacked: true,
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ barHeight: '60%',
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 0,
+ },
+ series: [
+ {
+ name: 'Marine Sprite',
+ data: [44, 55, 41, 37, 22, 43, 21],
+ },
+ {
+ name: 'Striking Calf',
+ data: [53, 32, 33, 52, 13, 43, 32],
+ },
+ {
+ name: 'Tank Picture',
+ data: [12, 17, 11, 9, 15, 11, 20],
+ },
+ {
+ name: 'Bucket Slope',
+ data: [9, 7, 5, 8, 6, 9, 4],
+ },
+ ],
+ xaxis: {
+ categories: [2008, 2009, 2010, 2011, 2012, 2013, 2014],
+ },
+ yaxis: {
+ title: {
+ text: undefined,
+ },
+ },
+ tooltip: {
+ shared: false,
+ y: {
+ formatter: function (val) {
+ return val + 'K'
+ },
+ },
+ },
+ colors: ['#1c84ee', '#22c55e', '#040505', '#4ecac2'],
+ fill: {
+ type: 'pattern',
+ opacity: 1,
+ pattern: {
+ style: ['circles', 'slantedLines', 'verticalLines', 'horizontalLines'], // string or array of strings
+ },
+ },
+ states: {
+ hover: {
+ filter: { type: 'none' },
+ },
+ },
+ legend: {
+ position: 'right',
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ markerChart: Partial = {
+ series: [
+ {
+ name: 'Actual',
+ data: [
+ {
+ x: '2017',
+ y: 12,
+ goals: [
+ {
+ name: 'Expected',
+ value: 14,
+ strokeWidth: 2,
+ strokeDashArray: 2,
+ strokeColor: '#22c55e',
+ },
+ ],
+ },
+ {
+ x: '2018',
+ y: 44,
+ goals: [
+ {
+ name: 'Expected',
+ value: 54,
+ strokeWidth: 5,
+ strokeHeight: 10,
+ strokeColor: '#22c55e',
+ },
+ ],
+ },
+ {
+ x: '2019',
+ y: 54,
+ goals: [
+ {
+ name: 'Expected',
+ value: 52,
+ strokeWidth: 10,
+ strokeHeight: 0,
+ strokeLineCap: 'round',
+ strokeColor: '#22c55e',
+ },
+ ],
+ },
+ {
+ x: '2020',
+ y: 66,
+ goals: [
+ {
+ name: 'Expected',
+ value: 61,
+ strokeWidth: 10,
+ strokeHeight: 0,
+ strokeLineCap: 'round',
+ strokeColor: '#22c55e',
+ },
+ ],
+ },
+ {
+ x: '2021',
+ y: 81,
+ goals: [
+ {
+ name: 'Expected',
+ value: 66,
+ strokeWidth: 10,
+ strokeHeight: 0,
+ strokeLineCap: 'round',
+ strokeColor: '#22c55e1',
+ },
+ ],
+ },
+ {
+ x: '2022',
+ y: 67,
+ goals: [
+ {
+ name: 'Expected',
+ value: 70,
+ strokeWidth: 5,
+ strokeHeight: 10,
+ strokeColor: '#22c55e',
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 380,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ },
+ },
+ colors: ['#f9b931', '#22c55e'],
+ dataLabels: {},
+ legend: {
+ show: true,
+ showForSingleSeries: true,
+ customLegendItems: ['Actual', 'Expected'],
+ },
+ xaxis: {
+ axisBorder: {
+ show: false,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/boxplot/boxplot.component.html b/apiferia/src/app/views/charts/boxplot/boxplot.component.html
new file mode 100644
index 00000000..0adbfb17
--- /dev/null
+++ b/apiferia/src/app/views/charts/boxplot/boxplot.component.html
@@ -0,0 +1,68 @@
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/boxplot.component.ts
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/boxplot/boxplot.component.spec.ts b/apiferia/src/app/views/charts/boxplot/boxplot.component.spec.ts
new file mode 100644
index 00000000..22697f33
--- /dev/null
+++ b/apiferia/src/app/views/charts/boxplot/boxplot.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { BoxplotComponent } from './boxplot.component'
+
+describe('BoxplotComponent', () => {
+ let component: BoxplotComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [BoxplotComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(BoxplotComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/boxplot/boxplot.component.ts b/apiferia/src/app/views/charts/boxplot/boxplot.component.ts
new file mode 100644
index 00000000..5eee06d4
--- /dev/null
+++ b/apiferia/src/app/views/charts/boxplot/boxplot.component.ts
@@ -0,0 +1,165 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-boxplot',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './boxplot.component.html',
+ styles: ``,
+})
+export class BoxplotComponent {
+ boxplotChart: Partial = {
+ series: [
+ {
+ type: 'boxPlot',
+ data: [
+ {
+ x: 'Jan 2015',
+ y: [54, 66, 69, 75, 88],
+ },
+ {
+ x: 'Jan 2016',
+ y: [43, 65, 69, 76, 81],
+ },
+ {
+ x: 'Jan 2017',
+ y: [31, 39, 45, 51, 59],
+ },
+ {
+ x: 'Jan 2018',
+ y: [39, 46, 55, 65, 71],
+ },
+ {
+ x: 'Jan 2019',
+ y: [29, 31, 35, 39, 44],
+ },
+ {
+ x: 'Jan 2020',
+ y: [41, 49, 58, 61, 67],
+ },
+ {
+ x: 'Jan 2021',
+ y: [54, 59, 66, 71, 88],
+ },
+ ],
+ },
+ ],
+ chart: {
+ type: 'boxPlot',
+ height: 350,
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ boxPlot: {
+ colors: {
+ upper: '#1c84ee',
+ lower: '#22c55e',
+ },
+ },
+ },
+ stroke: {
+ colors: ['#a1a9b1'],
+ },
+ }
+
+ scatterChart: Partial = {
+ series: [
+ {
+ name: 'Box',
+ type: 'boxPlot',
+ data: [
+ {
+ x: new Date('2017-01-01').getTime(),
+ y: [54, 66, 69, 75, 88],
+ },
+ {
+ x: new Date('2018-01-01').getTime(),
+ y: [43, 65, 69, 76, 81],
+ },
+ {
+ x: new Date('2019-01-01').getTime(),
+ y: [31, 39, 45, 51, 59],
+ },
+ {
+ x: new Date('2020-01-01').getTime(),
+ y: [39, 46, 55, 65, 71],
+ },
+ {
+ x: new Date('2021-01-01').getTime(),
+ y: [29, 31, 35, 39, 44],
+ },
+ ],
+ },
+ {
+ name: 'Outliers',
+ type: 'scatter',
+ data: [
+ {
+ x: new Date('2017-01-01').getTime(),
+ y: 32,
+ },
+ {
+ x: new Date('2018-01-01').getTime(),
+ y: 25,
+ },
+ {
+ x: new Date('2019-01-01').getTime(),
+ y: 64,
+ },
+ {
+ x: new Date('2020-01-01').getTime(),
+ y: 27,
+ },
+ {
+ x: new Date('2020-01-01').getTime(),
+ y: 78,
+ },
+ {
+ x: new Date('2021-01-01').getTime(),
+ y: 15,
+ },
+ ],
+ },
+ ],
+ chart: {
+ type: 'boxPlot',
+ height: 350,
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#1c84ee', '#22c55e'],
+ stroke: {
+ colors: ['#a1a9b1'],
+ },
+ legend: {
+ offsetY: 10,
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ grid: {
+ padding: {
+ bottom: 5,
+ },
+ },
+ tooltip: {
+ shared: false,
+ intersect: true,
+ },
+ plotOptions: {
+ boxPlot: {
+ colors: {
+ upper: '#1c84ee',
+ lower: '#22c55e',
+ },
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/bubble/bubble.component.html b/apiferia/src/app/views/charts/bubble/bubble.component.html
new file mode 100644
index 00000000..c41f5c1d
--- /dev/null
+++ b/apiferia/src/app/views/charts/bubble/bubble.component.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the TS file for the following chart at:
+ src/app/views/charts/bubble.component.ts
+
+
+
+
+
+
+
Simple Bubble Chart
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/bubble/bubble.component.spec.ts b/apiferia/src/app/views/charts/bubble/bubble.component.spec.ts
new file mode 100644
index 00000000..fe9c4c77
--- /dev/null
+++ b/apiferia/src/app/views/charts/bubble/bubble.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { BubbleComponent } from './bubble.component'
+
+describe('BubbleComponent', () => {
+ let component: BubbleComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [BubbleComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(BubbleComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/bubble/bubble.component.ts b/apiferia/src/app/views/charts/bubble/bubble.component.ts
new file mode 100644
index 00000000..a5794481
--- /dev/null
+++ b/apiferia/src/app/views/charts/bubble/bubble.component.ts
@@ -0,0 +1,205 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { currentYear } from '@/app/common/constants'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-bubble',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './bubble.component.html',
+ styles: ``,
+})
+export class BubbleComponent {
+ generateData(
+ baseval: number,
+ count: number,
+ yrange: { min: number; max: number }
+ ) {
+ var i = 0
+ var series = []
+ while (i < count) {
+ var x = Math.floor(Math.random() * (750 - 1 + 1)) + 1
+ var y =
+ Math.floor(Math.random() * (yrange.max - yrange.min + 1)) + yrange.min
+ var z = Math.floor(Math.random() * (75 - 15 + 1)) + 15
+
+ series.push([x, y, z])
+ baseval += 86400000
+ i++
+ }
+ return series
+ }
+
+ generateData1(
+ baseval: number,
+ count: number,
+ yrange: { min: number; max: number }
+ ) {
+ var i = 0
+ var series = []
+ while (i < count) {
+ var y =
+ Math.floor(Math.random() * (yrange.max - yrange.min + 1)) + yrange.min
+ var z = Math.floor(Math.random() * (75 - 15 + 1)) + 15
+
+ series.push([baseval, y, z])
+ baseval += 86400000
+ i++
+ }
+ return series
+ }
+
+ bubbleChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bubble',
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ name: 'Bubble 1',
+ data: this.generateData(
+ new Date('23 Oct ' + currentYear + ' GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ {
+ name: 'Bubble 2',
+ data: this.generateData(
+ new Date('23 Oct ' + currentYear + ' GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ {
+ name: 'Bubble 3',
+ data: this.generateData(
+ new Date('23 Oct ' + currentYear + ' GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ ],
+ fill: {
+ opacity: 0.8,
+ },
+ colors: ['#1c84ee', '#7f56da'],
+ xaxis: {
+ tickAmount: 12,
+ type: 'category',
+ },
+ yaxis: {
+ max: 70,
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ legend: {
+ offsetY: 7,
+ },
+ }
+
+ secondbubbleChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bubble',
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ name: 'Product 1',
+ data: this.generateData1(
+ new Date('23 Oct ' + currentYear + ' GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 80,
+ }
+ ),
+ },
+ {
+ name: 'Product 2',
+ data: this.generateData1(
+ new Date('23 Oct ' + currentYear + ' GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 80,
+ }
+ ),
+ },
+ {
+ name: 'Product 3',
+ data: this.generateData1(
+ new Date('23 Oct ' + currentYear + ' GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 80,
+ }
+ ),
+ },
+ {
+ name: 'Product 4',
+ data: this.generateData1(
+ new Date('23 Oct ' + currentYear + ' GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 80,
+ }
+ ),
+ },
+ ],
+ fill: {
+ type: 'gradient',
+ },
+ colors: ['#1c84ee', '#7f56da', '#ff6c2f', '#4ecac2'],
+ xaxis: {
+ tickAmount: 12,
+ type: 'datetime',
+
+ labels: {
+ rotate: 0,
+ },
+ },
+ yaxis: {
+ max: 70,
+ },
+ legend: {
+ offsetY: 7,
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/candlestick/candlestick.component.html b/apiferia/src/app/views/charts/candlestick/candlestick.component.html
new file mode 100644
index 00000000..a03795b2
--- /dev/null
+++ b/apiferia/src/app/views/charts/candlestick/candlestick.component.html
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the TS file for the following chart at:
+ src/app/views/charts/candlestick.component.ts
+
+
+
+
+
+
+
Simple Candlestick Chart
+
+
+
+
+
+
+
+
Combo Candlestick Chart
+
+
+
+
+
+
+
+
+
+
Candlestick with Line
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/candlestick/candlestick.component.spec.ts b/apiferia/src/app/views/charts/candlestick/candlestick.component.spec.ts
new file mode 100644
index 00000000..d70666b3
--- /dev/null
+++ b/apiferia/src/app/views/charts/candlestick/candlestick.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { CandlestickComponent } from './candlestick.component'
+
+describe('CandlestickComponent', () => {
+ let component: CandlestickComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [CandlestickComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(CandlestickComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/candlestick/candlestick.component.ts b/apiferia/src/app/views/charts/candlestick/candlestick.component.ts
new file mode 100644
index 00000000..95b595d7
--- /dev/null
+++ b/apiferia/src/app/views/charts/candlestick/candlestick.component.ts
@@ -0,0 +1,1000 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+import dayjs from 'dayjs'
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+const seriesData = [
+ {
+ x: new Date(2016, 1, 1),
+ y: [51.98, 56.29, 51.59, 53.85],
+ },
+ {
+ x: new Date(2016, 2, 1),
+ y: [53.66, 54.99, 51.35, 52.95],
+ },
+ {
+ x: new Date(2016, 3, 1),
+ y: [52.96, 53.78, 51.54, 52.48],
+ },
+ {
+ x: new Date(2016, 4, 1),
+ y: [52.54, 52.79, 47.88, 49.24],
+ },
+ {
+ x: new Date(2016, 5, 1),
+ y: [49.1, 52.86, 47.7, 52.78],
+ },
+ {
+ x: new Date(2016, 6, 1),
+ y: [52.83, 53.48, 50.32, 52.29],
+ },
+ {
+ x: new Date(2016, 7, 1),
+ y: [52.2, 54.48, 51.64, 52.58],
+ },
+ {
+ x: new Date(2016, 8, 1),
+ y: [52.76, 57.35, 52.15, 57.03],
+ },
+ {
+ x: new Date(2016, 9, 1),
+ y: [57.04, 58.15, 48.88, 56.19],
+ },
+ {
+ x: new Date(2016, 10, 1),
+ y: [56.09, 58.85, 55.48, 58.79],
+ },
+ {
+ x: new Date(2016, 11, 1),
+ y: [58.78, 59.65, 58.23, 59.05],
+ },
+ {
+ x: new Date(2017, 0, 1),
+ y: [59.37, 61.11, 59.35, 60.34],
+ },
+ {
+ x: new Date(2017, 1, 1),
+ y: [60.4, 60.52, 56.71, 56.93],
+ },
+ {
+ x: new Date(2017, 2, 1),
+ y: [57.02, 59.71, 56.04, 56.82],
+ },
+ {
+ x: new Date(2017, 3, 1),
+ y: [56.97, 59.62, 54.77, 59.3],
+ },
+ {
+ x: new Date(2017, 4, 1),
+ y: [59.11, 62.29, 59.1, 59.85],
+ },
+ {
+ x: new Date(2017, 5, 1),
+ y: [59.97, 60.11, 55.66, 58.42],
+ },
+ {
+ x: new Date(2017, 6, 1),
+ y: [58.34, 60.93, 56.75, 57.42],
+ },
+ {
+ x: new Date(2017, 7, 1),
+ y: [57.76, 58.08, 51.18, 54.71],
+ },
+ {
+ x: new Date(2017, 8, 1),
+ y: [54.8, 61.42, 53.18, 57.35],
+ },
+ {
+ x: new Date(2017, 9, 1),
+ y: [57.56, 63.09, 57.0, 62.99],
+ },
+ {
+ x: new Date(2017, 10, 1),
+ y: [62.89, 63.42, 59.72, 61.76],
+ },
+ {
+ x: new Date(2017, 11, 1),
+ y: [61.71, 64.15, 61.29, 63.04],
+ },
+]
+const seriesDataLinear = [
+ {
+ x: new Date(2016, 1, 1),
+ y: 3.85,
+ },
+ {
+ x: new Date(2016, 2, 1),
+ y: 2.95,
+ },
+ {
+ x: new Date(2016, 3, 1),
+ y: -12.48,
+ },
+ {
+ x: new Date(2016, 4, 1),
+ y: 19.24,
+ },
+ {
+ x: new Date(2016, 5, 1),
+ y: 12.78,
+ },
+ {
+ x: new Date(2016, 6, 1),
+ y: 22.29,
+ },
+ {
+ x: new Date(2016, 7, 1),
+ y: -12.58,
+ },
+ {
+ x: new Date(2016, 8, 1),
+ y: -17.03,
+ },
+ {
+ x: new Date(2016, 9, 1),
+ y: -19.19,
+ },
+ {
+ x: new Date(2016, 10, 1),
+ y: -28.79,
+ },
+ {
+ x: new Date(2016, 11, 1),
+ y: -39.05,
+ },
+ {
+ x: new Date(2017, 0, 1),
+ y: 20.34,
+ },
+ {
+ x: new Date(2017, 1, 1),
+ y: 36.93,
+ },
+ {
+ x: new Date(2017, 2, 1),
+ y: 36.82,
+ },
+ {
+ x: new Date(2017, 3, 1),
+ y: 29.3,
+ },
+ {
+ x: new Date(2017, 4, 1),
+ y: 39.85,
+ },
+ {
+ x: new Date(2017, 5, 1),
+ y: 28.42,
+ },
+ {
+ x: new Date(2017, 6, 1),
+ y: 37.42,
+ },
+ {
+ x: new Date(2017, 7, 1),
+ y: 24.71,
+ },
+ {
+ x: new Date(2017, 8, 1),
+ y: 37.35,
+ },
+ {
+ x: new Date(2017, 9, 1),
+ y: 32.99,
+ },
+ {
+ x: new Date(2017, 10, 1),
+ y: 31.76,
+ },
+ {
+ x: new Date(2017, 11, 1),
+ y: 43.04,
+ },
+]
+
+@Component({
+ selector: 'app-candlestick',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './candlestick.component.html',
+ styles: ``,
+})
+export class CandlestickComponent {
+ candlestickChart: Partial = {
+ chart: {
+ height: 400,
+ type: 'candlestick',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ candlestick: {
+ colors: {
+ upward: '#ef5f5f',
+ downward: '#22c55e',
+ },
+ },
+ },
+ series: [
+ {
+ data: seriesData,
+ },
+ ],
+
+ stroke: {
+ show: true,
+ width: 1,
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ comboChart: Partial = {
+ chart: {
+ height: 240,
+ type: 'candlestick',
+ toolbar: {
+ show: false,
+ },
+ zoom: {
+ enabled: false,
+ },
+ },
+ series: [
+ {
+ data: seriesData,
+ },
+ ],
+ plotOptions: {
+ candlestick: {
+ colors: {
+ upward: '#ef5f5f',
+ downward: '#22c55e',
+ },
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ combobarChart: Partial = {
+ chart: {
+ height: 160,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ autoSelected: 'selection',
+ },
+ selection: {
+ xaxis: {
+ min: new Date('20 Jan 2017').getTime(),
+ max: new Date('10 Dec 2017').getTime(),
+ },
+ fill: {
+ color: '#6c757d',
+ opacity: 0.4,
+ },
+ stroke: {
+ color: '#6c757d',
+ },
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '80%',
+ colors: {
+ ranges: [
+ {
+ from: -1000,
+ to: 0,
+ color: '#1c84ee',
+ },
+ {
+ from: 1,
+ to: 10000,
+ color: '#4ecac2',
+ },
+ ],
+ },
+ },
+ },
+ series: [
+ {
+ name: 'volume',
+ data: seriesDataLinear,
+ },
+ ],
+ xaxis: {
+ type: 'datetime',
+ axisBorder: {
+ offsetX: 13,
+ },
+ },
+ yaxis: {
+ labels: {
+ show: false,
+ },
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ xaxiscandlestickChart: Partial = {
+ series: [
+ {
+ name: 'candle',
+ data: [
+ {
+ x: new Date(1538778600000),
+ y: [6629.81, 6650.5, 6623.04, 6633.33],
+ },
+ {
+ x: new Date(1538780400000),
+ y: [6632.01, 6643.59, 6620, 6630.11],
+ },
+ {
+ x: new Date(1538782200000),
+ y: [6630.71, 6648.95, 6623.34, 6635.65],
+ },
+ {
+ x: new Date(1538784000000),
+ y: [6635.65, 6651, 6629.67, 6638.24],
+ },
+ {
+ x: new Date(1538785800000),
+ y: [6638.24, 6640, 6620, 6624.47],
+ },
+ {
+ x: new Date(1538787600000),
+ y: [6624.53, 6636.03, 6621.68, 6624.31],
+ },
+ {
+ x: new Date(1538789400000),
+ y: [6624.61, 6632.2, 6617, 6626.02],
+ },
+ {
+ x: new Date(1538791200000),
+ y: [6627, 6627.62, 6584.22, 6603.02],
+ },
+ {
+ x: new Date(1538793000000),
+ y: [6605, 6608.03, 6598.95, 6604.01],
+ },
+ {
+ x: new Date(1538794800000),
+ y: [6604.5, 6614.4, 6602.26, 6608.02],
+ },
+ {
+ x: new Date(1538796600000),
+ y: [6608.02, 6610.68, 6601.99, 6608.91],
+ },
+ {
+ x: new Date(1538798400000),
+ y: [6608.91, 6618.99, 6608.01, 6612],
+ },
+ {
+ x: new Date(1538800200000),
+ y: [6612, 6615.13, 6605.09, 6612],
+ },
+ {
+ x: new Date(1538802000000),
+ y: [6612, 6624.12, 6608.43, 6622.95],
+ },
+ {
+ x: new Date(1538803800000),
+ y: [6623.91, 6623.91, 6615, 6615.67],
+ },
+ {
+ x: new Date(1538805600000),
+ y: [6618.69, 6618.74, 6610, 6610.4],
+ },
+ {
+ x: new Date(1538807400000),
+ y: [6611, 6622.78, 6610.4, 6614.9],
+ },
+ {
+ x: new Date(1538809200000),
+ y: [6614.9, 6626.2, 6613.33, 6623.45],
+ },
+ {
+ x: new Date(1538811000000),
+ y: [6623.48, 6627, 6618.38, 6620.35],
+ },
+ {
+ x: new Date(1538812800000),
+ y: [6619.43, 6620.35, 6610.05, 6615.53],
+ },
+ {
+ x: new Date(1538814600000),
+ y: [6615.53, 6617.93, 6610, 6615.19],
+ },
+ {
+ x: new Date(1538816400000),
+ y: [6615.19, 6621.6, 6608.2, 6620],
+ },
+ {
+ x: new Date(1538818200000),
+ y: [6619.54, 6625.17, 6614.15, 6620],
+ },
+ {
+ x: new Date(1538820000000),
+ y: [6620.33, 6634.15, 6617.24, 6624.61],
+ },
+ {
+ x: new Date(1538821800000),
+ y: [6625.95, 6626, 6611.66, 6617.58],
+ },
+ {
+ x: new Date(1538823600000),
+ y: [6619, 6625.97, 6595.27, 6598.86],
+ },
+ {
+ x: new Date(1538825400000),
+ y: [6598.86, 6598.88, 6570, 6587.16],
+ },
+ {
+ x: new Date(1538827200000),
+ y: [6588.86, 6600, 6580, 6593.4],
+ },
+ {
+ x: new Date(1538829000000),
+ y: [6593.99, 6598.89, 6585, 6587.81],
+ },
+ {
+ x: new Date(1538830800000),
+ y: [6587.81, 6592.73, 6567.14, 6578],
+ },
+ {
+ x: new Date(1538832600000),
+ y: [6578.35, 6581.72, 6567.39, 6579],
+ },
+ {
+ x: new Date(1538834400000),
+ y: [6579.38, 6580.92, 6566.77, 6575.96],
+ },
+ {
+ x: new Date(1538836200000),
+ y: [6575.96, 6589, 6571.77, 6588.92],
+ },
+ {
+ x: new Date(1538838000000),
+ y: [6588.92, 6594, 6577.55, 6589.22],
+ },
+ {
+ x: new Date(1538839800000),
+ y: [6589.3, 6598.89, 6589.1, 6596.08],
+ },
+ {
+ x: new Date(1538841600000),
+ y: [6597.5, 6600, 6588.39, 6596.25],
+ },
+ {
+ x: new Date(1538843400000),
+ y: [6598.03, 6600, 6588.73, 6595.97],
+ },
+ {
+ x: new Date(1538845200000),
+ y: [6595.97, 6602.01, 6588.17, 6602],
+ },
+ {
+ x: new Date(1538847000000),
+ y: [6602, 6607, 6596.51, 6599.95],
+ },
+ {
+ x: new Date(1538848800000),
+ y: [6600.63, 6601.21, 6590.39, 6591.02],
+ },
+ {
+ x: new Date(1538850600000),
+ y: [6591.02, 6603.08, 6591, 6591],
+ },
+ {
+ x: new Date(1538852400000),
+ y: [6591, 6601.32, 6585, 6592],
+ },
+ {
+ x: new Date(1538854200000),
+ y: [6593.13, 6596.01, 6590, 6593.34],
+ },
+ {
+ x: new Date(1538856000000),
+ y: [6593.34, 6604.76, 6582.63, 6593.86],
+ },
+ {
+ x: new Date(1538857800000),
+ y: [6593.86, 6604.28, 6586.57, 6600.01],
+ },
+ {
+ x: new Date(1538859600000),
+ y: [6601.81, 6603.21, 6592.78, 6596.25],
+ },
+ {
+ x: new Date(1538861400000),
+ y: [6596.25, 6604.2, 6590, 6602.99],
+ },
+ {
+ x: new Date(1538863200000),
+ y: [6602.99, 6606, 6584.99, 6587.81],
+ },
+ {
+ x: new Date(1538865000000),
+ y: [6587.81, 6595, 6583.27, 6591.96],
+ },
+ {
+ x: new Date(1538866800000),
+ y: [6591.97, 6596.07, 6585, 6588.39],
+ },
+ {
+ x: new Date(1538868600000),
+ y: [6587.6, 6598.21, 6587.6, 6594.27],
+ },
+ {
+ x: new Date(1538870400000),
+ y: [6596.44, 6601, 6590, 6596.55],
+ },
+ {
+ x: new Date(1538872200000),
+ y: [6598.91, 6605, 6596.61, 6600.02],
+ },
+ {
+ x: new Date(1538874000000),
+ y: [6600.55, 6605, 6589.14, 6593.01],
+ },
+ {
+ x: new Date(1538875800000),
+ y: [6593.15, 6605, 6592, 6603.06],
+ },
+ {
+ x: new Date(1538877600000),
+ y: [6603.07, 6604.5, 6599.09, 6603.89],
+ },
+ {
+ x: new Date(1538879400000),
+ y: [6604.44, 6604.44, 6600, 6603.5],
+ },
+ {
+ x: new Date(1538881200000),
+ y: [6603.5, 6603.99, 6597.5, 6603.86],
+ },
+ {
+ x: new Date(1538883000000),
+ y: [6603.85, 6605, 6600, 6604.07],
+ },
+ {
+ x: new Date(1538884800000),
+ y: [6604.98, 6606, 6604.07, 6606],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 380,
+ type: 'candlestick',
+ toolbar: {
+ show: false,
+ },
+ },
+ title: {
+ text: 'CandleStick Chart - Category X-axis',
+ align: 'left',
+ },
+ grid: {
+ padding: {
+ top: 0,
+ right: -2,
+ bottom: -25,
+ left: 0,
+ },
+ },
+ annotations: {
+ xaxis: [
+ {
+ x: 'Oct 06 14:00',
+ borderColor: '#22c55e',
+ label: {
+ borderColor: '#22c55e',
+ style: {
+ fontSize: '12px',
+ color: '#fff',
+ background: '#22c55e',
+ },
+ orientation: 'horizontal',
+ offsetY: 7,
+ text: 'Annotation Test',
+ },
+ },
+ ],
+ },
+ plotOptions: {
+ candlestick: {
+ colors: {
+ upward: '#ef5f5f',
+ downward: '#22c55e',
+ },
+ },
+ },
+ tooltip: {
+ enabled: true,
+ },
+ colors: ['#ef5f5f', '#22c55e'],
+ xaxis: {
+ type: 'category',
+ labels: {
+ formatter: function (val) {
+ return dayjs(val).format('MMM DD HH:mm')
+ },
+ },
+ },
+ yaxis: {
+ tooltip: {
+ enabled: true,
+ },
+ },
+ }
+
+ linecandlestickChart: Partial = {
+ series: [
+ {
+ name: 'Line',
+ type: 'line',
+ data: [
+ {
+ x: new Date(1538778600000),
+ y: 6604,
+ },
+ {
+ x: new Date(1538782200000),
+ y: 6602,
+ },
+ {
+ x: new Date(1538814600000),
+ y: 6607,
+ },
+ {
+ x: new Date(1538884800000),
+ y: 6620,
+ },
+ ],
+ },
+ {
+ name: 'Candle',
+ type: 'candlestick',
+ data: [
+ {
+ x: new Date(1538778600000),
+ y: [6629.81, 6650.5, 6623.04, 6633.33],
+ },
+ {
+ x: new Date(1538780400000),
+ y: [6632.01, 6643.59, 6620, 6630.11],
+ },
+ {
+ x: new Date(1538782200000),
+ y: [6630.71, 6648.95, 6623.34, 6635.65],
+ },
+ {
+ x: new Date(1538784000000),
+ y: [6635.65, 6651, 6629.67, 6638.24],
+ },
+ {
+ x: new Date(1538785800000),
+ y: [6638.24, 6640, 6620, 6624.47],
+ },
+ {
+ x: new Date(1538787600000),
+ y: [6624.53, 6636.03, 6621.68, 6624.31],
+ },
+ {
+ x: new Date(1538789400000),
+ y: [6624.61, 6632.2, 6617, 6626.02],
+ },
+ {
+ x: new Date(1538791200000),
+ y: [6627, 6627.62, 6584.22, 6603.02],
+ },
+ {
+ x: new Date(1538793000000),
+ y: [6605, 6608.03, 6598.95, 6604.01],
+ },
+ {
+ x: new Date(1538794800000),
+ y: [6604.5, 6614.4, 6602.26, 6608.02],
+ },
+ {
+ x: new Date(1538796600000),
+ y: [6608.02, 6610.68, 6601.99, 6608.91],
+ },
+ {
+ x: new Date(1538798400000),
+ y: [6608.91, 6618.99, 6608.01, 6612],
+ },
+ {
+ x: new Date(1538800200000),
+ y: [6612, 6615.13, 6605.09, 6612],
+ },
+ {
+ x: new Date(1538802000000),
+ y: [6612, 6624.12, 6608.43, 6622.95],
+ },
+ {
+ x: new Date(1538803800000),
+ y: [6623.91, 6623.91, 6615, 6615.67],
+ },
+ {
+ x: new Date(1538805600000),
+ y: [6618.69, 6618.74, 6610, 6610.4],
+ },
+ {
+ x: new Date(1538807400000),
+ y: [6611, 6622.78, 6610.4, 6614.9],
+ },
+ {
+ x: new Date(1538809200000),
+ y: [6614.9, 6626.2, 6613.33, 6623.45],
+ },
+ {
+ x: new Date(1538811000000),
+ y: [6623.48, 6627, 6618.38, 6620.35],
+ },
+ {
+ x: new Date(1538812800000),
+ y: [6619.43, 6620.35, 6610.05, 6615.53],
+ },
+ {
+ x: new Date(1538814600000),
+ y: [6615.53, 6617.93, 6610, 6615.19],
+ },
+ {
+ x: new Date(1538816400000),
+ y: [6615.19, 6621.6, 6608.2, 6620],
+ },
+ {
+ x: new Date(1538818200000),
+ y: [6619.54, 6625.17, 6614.15, 6620],
+ },
+ {
+ x: new Date(1538820000000),
+ y: [6620.33, 6634.15, 6617.24, 6624.61],
+ },
+ {
+ x: new Date(1538821800000),
+ y: [6625.95, 6626, 6611.66, 6617.58],
+ },
+ {
+ x: new Date(1538823600000),
+ y: [6619, 6625.97, 6595.27, 6598.86],
+ },
+ {
+ x: new Date(1538825400000),
+ y: [6598.86, 6598.88, 6570, 6587.16],
+ },
+ {
+ x: new Date(1538827200000),
+ y: [6588.86, 6600, 6580, 6593.4],
+ },
+ {
+ x: new Date(1538829000000),
+ y: [6593.99, 6598.89, 6585, 6587.81],
+ },
+ {
+ x: new Date(1538830800000),
+ y: [6587.81, 6592.73, 6567.14, 6578],
+ },
+ {
+ x: new Date(1538832600000),
+ y: [6578.35, 6581.72, 6567.39, 6579],
+ },
+ {
+ x: new Date(1538834400000),
+ y: [6579.38, 6580.92, 6566.77, 6575.96],
+ },
+ {
+ x: new Date(1538836200000),
+ y: [6575.96, 6589, 6571.77, 6588.92],
+ },
+ {
+ x: new Date(1538838000000),
+ y: [6588.92, 6594, 6577.55, 6589.22],
+ },
+ {
+ x: new Date(1538839800000),
+ y: [6589.3, 6598.89, 6589.1, 6596.08],
+ },
+ {
+ x: new Date(1538841600000),
+ y: [6597.5, 6600, 6588.39, 6596.25],
+ },
+ {
+ x: new Date(1538843400000),
+ y: [6598.03, 6600, 6588.73, 6595.97],
+ },
+ {
+ x: new Date(1538845200000),
+ y: [6595.97, 6602.01, 6588.17, 6602],
+ },
+ {
+ x: new Date(1538847000000),
+ y: [6602, 6607, 6596.51, 6599.95],
+ },
+ {
+ x: new Date(1538848800000),
+ y: [6600.63, 6601.21, 6590.39, 6591.02],
+ },
+ {
+ x: new Date(1538850600000),
+ y: [6591.02, 6603.08, 6591, 6591],
+ },
+ {
+ x: new Date(1538852400000),
+ y: [6591, 6601.32, 6585, 6592],
+ },
+ {
+ x: new Date(1538854200000),
+ y: [6593.13, 6596.01, 6590, 6593.34],
+ },
+ {
+ x: new Date(1538856000000),
+ y: [6593.34, 6604.76, 6582.63, 6593.86],
+ },
+ {
+ x: new Date(1538857800000),
+ y: [6593.86, 6604.28, 6586.57, 6600.01],
+ },
+ {
+ x: new Date(1538859600000),
+ y: [6601.81, 6603.21, 6592.78, 6596.25],
+ },
+ {
+ x: new Date(1538861400000),
+ y: [6596.25, 6604.2, 6590, 6602.99],
+ },
+ {
+ x: new Date(1538863200000),
+ y: [6602.99, 6606, 6584.99, 6587.81],
+ },
+ {
+ x: new Date(1538865000000),
+ y: [6587.81, 6595, 6583.27, 6591.96],
+ },
+ {
+ x: new Date(1538866800000),
+ y: [6591.97, 6596.07, 6585, 6588.39],
+ },
+ {
+ x: new Date(1538868600000),
+ y: [6587.6, 6598.21, 6587.6, 6594.27],
+ },
+ {
+ x: new Date(1538870400000),
+ y: [6596.44, 6601, 6590, 6596.55],
+ },
+ {
+ x: new Date(1538872200000),
+ y: [6598.91, 6605, 6596.61, 6600.02],
+ },
+ {
+ x: new Date(1538874000000),
+ y: [6600.55, 6605, 6589.14, 6593.01],
+ },
+ {
+ x: new Date(1538875800000),
+ y: [6593.15, 6605, 6592, 6603.06],
+ },
+ {
+ x: new Date(1538877600000),
+ y: [6603.07, 6604.5, 6599.09, 6603.89],
+ },
+ {
+ x: new Date(1538879400000),
+ y: [6604.44, 6604.44, 6600, 6603.5],
+ },
+ {
+ x: new Date(1538881200000),
+ y: [6603.5, 6603.99, 6597.5, 6603.86],
+ },
+ {
+ x: new Date(1538883000000),
+ y: [6603.85, 6605, 6600, 6604.07],
+ },
+ {
+ x: new Date(1538884800000),
+ y: [6604.98, 6606, 6604.07, 6606],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 380,
+ type: 'line',
+ toolbar: {
+ show: false,
+ },
+ },
+ title: {
+ text: 'CandleStick Chart',
+ align: 'left',
+ },
+ stroke: {
+ width: [3, 1],
+ },
+ legend: {
+ show: true,
+ horizontalAlign: 'center',
+ offsetX: 0,
+ offsetY: 5,
+ },
+ grid: {
+ padding: {
+ top: 0,
+ right: -2,
+ bottom: 15,
+ left: 10,
+ },
+ },
+ colors: ['#22c55e', '#ef5f5f'],
+ plotOptions: {
+ candlestick: {
+ colors: {
+ upward: '#ef5f5f',
+ downward: '#ef5f5f',
+ },
+ },
+ },
+
+ tooltip: {
+ shared: true,
+ custom: [
+ function (_ref) {
+ var seriesIndex = _ref.seriesIndex
+ var dataPointIndex = _ref.dataPointIndex
+ var w = _ref.w
+
+ return w.globals.series[seriesIndex][dataPointIndex]
+ },
+ function (_ref2) {
+ var seriesIndex = _ref2.seriesIndex
+ var dataPointIndex = _ref2.dataPointIndex
+ var w = _ref2.w
+
+ var o = w.globals.seriesCandleO[seriesIndex][dataPointIndex]
+ var h = w.globals.seriesCandleH[seriesIndex][dataPointIndex]
+ var l = w.globals.seriesCandleL[seriesIndex][dataPointIndex]
+ var c = w.globals.seriesCandleC[seriesIndex][dataPointIndex]
+ return (
+ ''
+ )
+ },
+ ],
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/charts.route.ts b/apiferia/src/app/views/charts/charts.route.ts
new file mode 100644
index 00000000..c8ff06ab
--- /dev/null
+++ b/apiferia/src/app/views/charts/charts.route.ts
@@ -0,0 +1,101 @@
+import type { Route } from '@angular/router'
+import { AreaComponent } from './area/area.component'
+import { BarComponent } from './bar/bar.component'
+import { BubbleComponent } from './bubble/bubble.component'
+import { CandlestickComponent } from './candlestick/candlestick.component'
+import { ColumnComponent } from './column/column.component'
+import { HeatmapComponent } from './heatmap/heatmap.component'
+import { LineComponent } from './line/line.component'
+import { MixedComponent } from './mixed/mixed.component'
+import { TimelineComponent } from './timeline/timeline.component'
+import { BoxplotComponent } from './boxplot/boxplot.component'
+import { TreemapComponent } from './treemap/treemap.component'
+import { PieComponent } from './pie/pie.component'
+import { RadarComponent } from './radar/radar.component'
+import { RadialBarComponent } from './radial-bar/radial-bar.component'
+import { ScatterComponent } from './scatter/scatter.component'
+import { PolarComponent } from './polar/polar.component'
+
+export const CHART_ROUTE: Route[] = [
+ {
+ path: 'area',
+ component: AreaComponent,
+ data: { title: 'Apex Area Charts' },
+ },
+ {
+ path: 'bar',
+ component: BarComponent,
+ data: { title: 'Apex Bar Charts' },
+ },
+ {
+ path: 'bubble',
+ component: BubbleComponent,
+ data: { title: 'Apex Bubble Charts' },
+ },
+ {
+ path: 'candlestick',
+ component: CandlestickComponent,
+ data: { title: 'Apex Candlestick Charts' },
+ },
+ {
+ path: 'column',
+ component: ColumnComponent,
+ data: { title: 'Apex Column Charts' },
+ },
+ {
+ path: 'heatmap',
+ component: HeatmapComponent,
+ data: { title: 'Apex Heatmap Charts' },
+ },
+ {
+ path: 'line',
+ component: LineComponent,
+ data: { title: 'Apex Line Charts' },
+ },
+ {
+ path: 'mixed',
+ component: MixedComponent,
+ data: { title: 'Apex Mixed Charts' },
+ },
+ {
+ path: 'timeline',
+ component: TimelineComponent,
+ data: { title: 'Apex Timeline Charts' },
+ },
+ {
+ path: 'boxplot',
+ component: BoxplotComponent,
+ data: { title: 'Apex Boxplot Charts' },
+ },
+ {
+ path: 'treemap',
+ component: TreemapComponent,
+ data: { title: 'Apex Treemap Charts' },
+ },
+ {
+ path: 'pie',
+ component: PieComponent,
+ data: { title: 'Apex Pie Charts' },
+ },
+ {
+ path: 'radar',
+ component: RadarComponent,
+ data: { title: 'Apex Radar Charts' },
+ },
+ {
+ path: 'radial-bar',
+ component: RadialBarComponent,
+ data: { title: 'Apex RadialBar Charts' },
+ },
+ {
+ path: 'scatter',
+ component: ScatterComponent,
+ data: { title: 'Apex Scatter Charts' },
+ },
+
+ {
+ path: 'polar',
+ component: PolarComponent,
+ data: { title: 'Apex Polar Area Charts' },
+ },
+]
diff --git a/apiferia/src/app/views/charts/column/column.component.html b/apiferia/src/app/views/charts/column/column.component.html
new file mode 100644
index 00000000..193f9766
--- /dev/null
+++ b/apiferia/src/app/views/charts/column/column.component.html
@@ -0,0 +1,327 @@
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/column.component.ts
+
+
+
+
+
+
+
+
+
+ Column Chart with Datalabels
+
+
+
+
+
+
+
+
+
Stacked Column Chart
+
+
+
+
+
+
+
+
+ 100% Stacked Column Chart
+
+
+
+
+
+
+
+
+
Column with Markers
+
+
+
+
+
+
+
+
Column with Group Label
+
+
+
+
+
+
+
+
+ Column Chart with rotated labels & Annotations
+
+
+
+
+
+
+
+
+
+ Column Chart with negative values
+
+
+
+
+
+
+
+
+
+ Distributed Column Chart
+
+
+
+
+
+
+
+
+
+
+
+
+ Dynamic Loaded Chart
+
+
+
+ iPhone 5
+ iPhone 6
+ iPhone 7
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/column/column.component.spec.ts b/apiferia/src/app/views/charts/column/column.component.spec.ts
new file mode 100644
index 00000000..ae9ce26e
--- /dev/null
+++ b/apiferia/src/app/views/charts/column/column.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ColumnComponent } from './column.component'
+
+describe('ColumnComponent', () => {
+ let component: ColumnComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ColumnComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ColumnComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/column/column.component.ts b/apiferia/src/app/views/charts/column/column.component.ts
new file mode 100644
index 00000000..0981d572
--- /dev/null
+++ b/apiferia/src/app/views/charts/column/column.component.ts
@@ -0,0 +1,1256 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+import ApexCharts from 'apexcharts'
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+
+function updateQuarterChart(sourceChart: any, destChartIDToUpdate: string) {
+ let series = []
+ let seriesIndex = 0
+ let colors = []
+ if (sourceChart.w.globals.selectedDataPoints[0]) {
+ let selectedPoints = sourceChart.w.globals.selectedDataPoints
+ for (let i = 0; i < selectedPoints[seriesIndex].length; i++) {
+ let selectedIndex = selectedPoints[seriesIndex][i]
+ let yearSeries = sourceChart.w.config.series[seriesIndex]
+ series.push({
+ name: yearSeries.data[selectedIndex].x,
+ data: yearSeries.data[selectedIndex].quarters,
+ })
+ colors.push(yearSeries.data[selectedIndex].color)
+ }
+ if (series.length === 0)
+ series = [
+ {
+ data: [],
+ },
+ ]
+ return ApexCharts.exec(destChartIDToUpdate, 'updateOptions', {
+ series: series,
+ colors: colors,
+ fill: {
+ colors: colors,
+ },
+ })
+ }
+}
+
+function shuffleArray(
+ array: { y: number; quarters: { x: string; y: number }[] }[]
+) {
+ for (let i = array.length - 1; i > 0; i--) {
+ let j = Math.floor(Math.random() * (i + 1))
+ let temp = array[i]
+ array[i] = array[j]
+ array[j] = temp
+ }
+ return array
+}
+
+let arrayData = [
+ {
+ y: 400,
+ quarters: [
+ {
+ x: 'Q1',
+ y: 120,
+ },
+ {
+ x: 'Q2',
+ y: 90,
+ },
+ {
+ x: 'Q3',
+ y: 100,
+ },
+ {
+ x: 'Q4',
+ y: 90,
+ },
+ ],
+ },
+ {
+ y: 430,
+ quarters: [
+ {
+ x: 'Q1',
+ y: 120,
+ },
+ {
+ x: 'Q2',
+ y: 110,
+ },
+ {
+ x: 'Q3',
+ y: 90,
+ },
+ {
+ x: 'Q4',
+ y: 110,
+ },
+ ],
+ },
+ {
+ y: 448,
+ quarters: [
+ {
+ x: 'Q1',
+ y: 70,
+ },
+ {
+ x: 'Q2',
+ y: 100,
+ },
+ {
+ x: 'Q3',
+ y: 140,
+ },
+ {
+ x: 'Q4',
+ y: 138,
+ },
+ ],
+ },
+ {
+ y: 470,
+ quarters: [
+ {
+ x: 'Q1',
+ y: 150,
+ },
+ {
+ x: 'Q2',
+ y: 60,
+ },
+ {
+ x: 'Q3',
+ y: 190,
+ },
+ {
+ x: 'Q4',
+ y: 70,
+ },
+ ],
+ },
+ {
+ y: 540,
+ quarters: [
+ {
+ x: 'Q1',
+ y: 120,
+ },
+ {
+ x: 'Q2',
+ y: 120,
+ },
+ {
+ x: 'Q3',
+ y: 130,
+ },
+ {
+ x: 'Q4',
+ y: 170,
+ },
+ ],
+ },
+ {
+ y: 580,
+ quarters: [
+ {
+ x: 'Q1',
+ y: 170,
+ },
+ {
+ x: 'Q2',
+ y: 130,
+ },
+ {
+ x: 'Q3',
+ y: 120,
+ },
+ {
+ x: 'Q4',
+ y: 160,
+ },
+ ],
+ },
+]
+
+@Component({
+ selector: 'app-column',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './column.component.html',
+ styles: ``,
+})
+export class ColumnComponent {
+ basicColumnChart: Partial = {
+ chart: {
+ height: 396,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: false,
+ columnWidth: '55%',
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ show: true,
+ width: 0,
+ colors: ['transparent'],
+ },
+ colors: ['#f9b931', '#ef5f5f', '#4ecac2'],
+ series: [
+ {
+ name: 'Net Profit',
+ data: [47, 58, 59, 54, 62, 59, 65, 61, 68],
+ },
+ {
+ name: 'Revenue',
+ data: [79, 86, 103, 97, 89, 107, 93, 116, 96],
+ },
+ {
+ name: 'Free Cash Flow',
+ data: [38, 42, 39, 28, 47, 50, 54, 55, 43],
+ },
+ ],
+ xaxis: {
+ categories: [
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ ],
+ },
+ legend: {
+ offsetY: 7,
+ },
+ yaxis: {
+ title: {
+ text: '$ (thousands)',
+ },
+ },
+ fill: {
+ opacity: 1,
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ tooltip: {
+ y: {
+ formatter: function (val) {
+ return '$ ' + val + ' thousands'
+ },
+ },
+ },
+ }
+
+ datalabelsColumnChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ borderRadius: 10,
+ dataLabels: {
+ position: 'top', // top, center, bottom
+ },
+ },
+ },
+ dataLabels: {
+ enabled: true,
+ formatter: function (val) {
+ return val + '%'
+ },
+ offsetY: -25,
+ style: {
+ fontSize: '12px',
+ colors: ['#4ecac2'],
+ },
+ },
+ colors: ['#4ecac2'],
+ legend: {
+ show: true,
+ horizontalAlign: 'center',
+ offsetX: 0,
+ offsetY: -5,
+ },
+ series: [
+ {
+ name: 'Inflation',
+ data: [2.3, 3.1, 4.0, 10.1, 4.0, 3.6, 3.2, 2.3, 1.4, 0.8, 0.5, 0.2],
+ },
+ ],
+ xaxis: {
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ],
+ position: 'top',
+ labels: {
+ offsetY: 0,
+ },
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ crosshairs: {
+ fill: {
+ type: 'gradient',
+ gradient: {
+ colorFrom: '#D8E3F0',
+ colorTo: '#BED1E6',
+ stops: [0, 100],
+ opacityFrom: 0.4,
+ opacityTo: 0.5,
+ },
+ },
+ },
+ tooltip: {
+ enabled: true,
+ offsetY: -10,
+ },
+ },
+ fill: {
+ gradient: {
+ shade: 'light',
+ type: 'horizontal',
+ shadeIntensity: 0.25,
+ gradientToColors: undefined,
+ inverseColors: true,
+ opacityFrom: 1,
+ opacityTo: 1,
+ stops: [50, 0, 100, 100],
+ },
+ },
+ yaxis: {
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ labels: {
+ show: false,
+ formatter: function (val) {
+ return val + '%'
+ },
+ },
+ },
+ title: {
+ text: 'Monthly Inflation in Argentina, 2002',
+ floating: true,
+ offsetY: 360,
+ align: 'center',
+ style: {
+ color: '#444',
+ },
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ stackedColumnChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ stacked: true,
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: false,
+ columnWidth: '50%',
+ },
+ },
+ series: [
+ {
+ name: 'Product A',
+ data: [47, 58, 44, 70, 25, 46, 24, 52],
+ },
+ {
+ name: 'Product B',
+ data: [16, 26, 23, 11, 16, 30, 36, 15],
+ },
+ {
+ name: 'Product C',
+ data: [14, 20, 18, 18, 24, 17, 18, 16],
+ },
+ ],
+ xaxis: {
+ categories: [
+ '2011 Q1',
+ '2011 Q2',
+ '2011 Q3',
+ '2011 Q4',
+ '2012 Q1',
+ '2012 Q2',
+ '2012 Q3',
+ '2012 Q4',
+ ],
+ },
+ colors: ['#1c84ee', '#f9b931', '#4ecac2'],
+ fill: {
+ opacity: 1,
+ },
+ legend: {
+ offsetY: 7,
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ }
+
+ fullstackedColumnChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ stacked: true,
+ stackType: '100%',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '50%',
+ },
+ },
+ series: [
+ {
+ name: 'Product A',
+ data: [11, 17, 15, 15, 21, 14, 15, 13],
+ },
+ {
+ name: 'Product B',
+ data: [44, 55, 41, 67, 22, 43, 21, 49],
+ },
+ {
+ name: 'Product C',
+ data: [13, 23, 20, 8, 13, 27, 33, 12],
+ },
+ ],
+ xaxis: {
+ categories: [
+ '2011 Q1',
+ '2011 Q2',
+ '2011 Q3',
+ '2011 Q4',
+ '2012 Q1',
+ '2012 Q2',
+ '2012 Q3',
+ '2012 Q4',
+ ],
+ },
+ fill: {
+ opacity: 1,
+ },
+ legend: {
+ offsetY: 7,
+ },
+ colors: ['#e3eaef', '#1c84ee', '#323a46'],
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ }
+
+ markersColumnChart: Partial = {
+ series: [
+ {
+ name: 'Actual',
+ data: [
+ {
+ x: '2011',
+ y: 1292,
+ goals: [
+ {
+ name: 'Expected',
+ value: 1400,
+ strokeHeight: 5,
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ {
+ x: '2012',
+ y: 4432,
+ goals: [
+ {
+ name: 'Expected',
+ value: 5400,
+ strokeHeight: 5,
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ {
+ x: '2013',
+ y: 5423,
+ goals: [
+ {
+ name: 'Expected',
+ value: 5200,
+ strokeHeight: 5,
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ {
+ x: '2014',
+ y: 6653,
+ goals: [
+ {
+ name: 'Expected',
+ value: 6500,
+ strokeHeight: 5,
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ {
+ x: '2015',
+ y: 8133,
+ goals: [
+ {
+ name: 'Expected',
+ value: 6600,
+ strokeHeight: 13,
+ strokeWidth: 0,
+ strokeLineCap: 'round',
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ {
+ x: '2016',
+ y: 7132,
+ goals: [
+ {
+ name: 'Expected',
+ value: 7500,
+ strokeHeight: 5,
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ {
+ x: '2017',
+ y: 7332,
+ goals: [
+ {
+ name: 'Expected',
+ value: 8700,
+ strokeHeight: 5,
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ {
+ x: '2018',
+ y: 6553,
+ goals: [
+ {
+ name: 'Expected',
+ value: 7300,
+ strokeHeight: 2,
+ strokeDashArray: 2,
+ strokeColor: '#57606c',
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 380,
+ type: 'bar',
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '60%',
+ },
+ },
+ colors: ['#ff6c2f', '#57606c'],
+ dataLabels: {
+ enabled: false,
+ },
+ legend: {
+ show: true,
+ showForSingleSeries: true,
+ customLegendItems: ['Actual', 'Expected'],
+ markers: {
+ fillColors: ['#ff6c2f', '#57606c'],
+ },
+ },
+ }
+
+ groupColumnChart: Partial = {
+ series: [
+ {
+ name: 'Sales',
+ data: [
+ {
+ x: 'Q1',
+ y: 400,
+ },
+ {
+ x: 'Q2',
+ y: 430,
+ },
+ {
+ x: 'Q3',
+ y: 448,
+ },
+ {
+ x: 'Q4',
+ y: 470,
+ },
+ {
+ x: 'Q1',
+ y: 540,
+ },
+ {
+ x: 'Q2',
+ y: 580,
+ },
+ {
+ x: 'Q3',
+ y: 690,
+ },
+ {
+ x: 'Q4',
+ y: 690,
+ },
+ ],
+ },
+ ],
+ chart: {
+ type: 'bar',
+ height: 380,
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: false,
+ columnWidth: '45%',
+ },
+ },
+ colors: ['#1c84ee', '#fa5c7c'],
+ xaxis: {
+ type: 'category',
+ group: {
+ style: {
+ fontSize: '10px',
+ fontWeight: 700,
+ },
+ groups: [
+ {
+ title: '2020',
+ cols: 4,
+ },
+ {
+ title: '2021',
+ cols: 4,
+ },
+ ],
+ },
+ },
+ }
+
+ rotatelabelColumnChart: Partial = {
+ annotations: {
+ points: [
+ {
+ x: 'Bananas',
+ seriesIndex: 0,
+ label: {
+ borderColor: '#727cf5',
+ offsetY: 0,
+ style: {
+ color: '#fff',
+ background: '#727cf5',
+ },
+ text: 'Bananas are good',
+ },
+ },
+ ],
+ },
+ chart: {
+ height: 380,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '50%',
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: 2,
+ },
+ colors: ['#f9b931'],
+ series: [
+ {
+ name: 'Servings',
+ data: [20, 15, 30, 25, 35, 40, 45, 50, 55, 60, 65, 70, 75],
+ },
+ ],
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ top: 0,
+ right: -2,
+ bottom: -35,
+ left: 10,
+ },
+ },
+ xaxis: {
+ labels: {
+ rotate: -45,
+ },
+ categories: [
+ 'Apples',
+ 'Oranges',
+ 'Strawberries',
+ 'Pineapples',
+ 'Mangoes',
+ 'Bananas',
+ 'Blackberries',
+ 'Pears',
+ 'Watermelons',
+ 'Cherries',
+ 'Pomegranates',
+ 'Tangerines',
+ 'Papayas',
+ ],
+ },
+ yaxis: {
+ title: {
+ text: 'Servings',
+ },
+ },
+ fill: {
+ type: 'gradient',
+ gradient: {
+ shade: 'light',
+ type: 'horizontal',
+ shadeIntensity: 0.25,
+ gradientToColors: undefined,
+ inverseColors: true,
+ opacityFrom: 0.85,
+ opacityTo: 0.85,
+ stops: [50, 0, 100],
+ },
+ },
+ }
+
+ negativeColumnChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ colors: {
+ ranges: [
+ {
+ from: -100,
+ to: -46,
+ color: '#ff86c8',
+ },
+ {
+ from: -45,
+ to: 0,
+ color: '#7f56da',
+ },
+ ],
+ },
+ columnWidth: '80%',
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ colors: ['#22c55e'],
+ series: [
+ {
+ name: 'Cash Flow',
+ data: [
+ 1.45, 5.42, 5.9, -0.42, -12.6, -18.1, -18.2, -14.16, -11.1, -6.09,
+ 0.34, 3.88, 13.07, 5.8, 2, 7.37, 8.1, 13.57, 15.75, 17.1, 19.8,
+ -27.03, -54.4, -47.2, -43.3, -18.6, -48.6, -41.1, -39.6, -37.6, -29.4,
+ -21.4, -2.4,
+ ],
+ },
+ ],
+ yaxis: {
+ title: {
+ text: 'Growth',
+ },
+ labels: {
+ formatter: function (y) {
+ return y.toFixed(0) + '%'
+ },
+ },
+ },
+ xaxis: {
+ // TODO: uncomment below and fix the error
+ //type: 'datetime',
+ categories: [
+ '2021-01-01',
+ '2021-02-01',
+ '2021-03-01',
+ '2021-04-01',
+ '2021-05-01',
+ '2021-06-01',
+ '2021-07-01',
+ '2021-08-01',
+ '2021-09-01',
+ '2021-10-01',
+ '2021-11-01',
+ '2021-12-01',
+ '2022-01-01',
+ '2022-02-01',
+ '2022-03-01',
+ '2022-04-01',
+ '2022-05-01',
+ '2022-06-01',
+ '2022-07-01',
+ '2022-08-01',
+ '2022-09-01',
+ '2022-10-01',
+ '2022-11-01',
+ '2022-12-01',
+ '2023-01-01',
+ '2023-02-01',
+ '2023-03-01',
+ '2023-04-01',
+ '2023-05-01',
+ '2023-06-01',
+ '2023-07-01',
+ '2023-08-01',
+ '2023-09-01',
+ ],
+ labels: {
+ rotate: -90,
+ },
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ distributedChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: [
+ '#1c84ee',
+ '#53389f',
+ '#7f56da',
+ '#ff86c8',
+ '#ef5f5f',
+ '#ff6c2f',
+ '#f9b931',
+ '#22c55e',
+ ],
+ plotOptions: {
+ bar: {
+ columnWidth: '45%',
+ distributed: true,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ data: [21, 22, 10, 28, 16, 21, 13, 30],
+ },
+ ],
+ xaxis: {
+ categories: [
+ 'John',
+ 'Joe',
+ 'Jake',
+ 'Amber',
+ 'Peter',
+ 'Mary',
+ 'David',
+ 'Lily',
+ ],
+ labels: {
+ style: {
+ colors: [
+ '#1c84ee',
+ '#53389f',
+ '#7f56da',
+ '#ff86c8',
+ '#ef5f5f',
+ '#ff6c2f',
+ '#f9b931',
+ '#22c55e',
+ ],
+ fontSize: '14px',
+ },
+ },
+ },
+ legend: {
+ offsetY: 7,
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ rangeColumnChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'rangeBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: false,
+ },
+ },
+ dataLabels: {
+ enabled: true,
+ },
+ legend: {
+ offsetY: 7,
+ },
+ colors: ['#1c84ee', '#7f56da'],
+ series: [
+ {
+ name: 'Product A',
+ data: [
+ {
+ x: 'Team A',
+ y: [1, 5],
+ },
+ {
+ x: 'Team B',
+ y: [4, 6],
+ },
+ {
+ x: 'Team C',
+ y: [5, 8],
+ },
+ {
+ x: 'Team D',
+ y: [3, 11],
+ },
+ ],
+ },
+ {
+ name: 'Product B',
+ data: [
+ {
+ x: 'Team A',
+ y: [2, 6],
+ },
+ {
+ x: 'Team B',
+ y: [1, 3],
+ },
+ {
+ x: 'Team C',
+ y: [7, 8],
+ },
+ {
+ x: 'Team D',
+ y: [5, 9],
+ },
+ ],
+ },
+ ],
+ }
+ makeData() {
+ let dataSet = shuffleArray(arrayData)
+
+ return [
+ {
+ x: '2011',
+ y: dataSet[0].y,
+ color: '#727cf5',
+ quarters: dataSet[0].quarters,
+ },
+ {
+ x: '2012',
+ y: dataSet[1].y,
+ color: '#6c757d',
+ quarters: dataSet[1].quarters,
+ },
+ {
+ x: '2013',
+ y: dataSet[2].y,
+ color: '#0acf97',
+ quarters: dataSet[2].quarters,
+ },
+ {
+ x: '2014',
+ y: dataSet[3].y,
+ color: '#fa5c7c',
+ quarters: dataSet[3].quarters,
+ },
+ {
+ x: '2015',
+ y: dataSet[4].y,
+ color: '#ffbc00',
+ quarters: dataSet[4].quarters,
+ },
+ {
+ x: '2016',
+ y: dataSet[5].y,
+ color: '#39afd1',
+ quarters: dataSet[5].quarters,
+ },
+ ]
+ }
+
+ yearColumnChart: Partial = {
+ series: [
+ {
+ data: this.makeData(),
+ },
+ ],
+ chart: {
+ id: 'barYear',
+ height: 400,
+ width: '100%',
+ type: 'bar',
+ toolbar: {
+ show: false,
+ },
+ events: {
+ dataPointSelection: function (e, chart, opts) {
+ let quarterChartEl = document.querySelector('#chart-quarter')
+ var yearChartEl = document.querySelector('#chart-year')
+
+ if (opts.selectedDataPoints[0].length === 1) {
+ if (quarterChartEl?.classList.contains('active')) {
+ updateQuarterChart(chart, 'barQuarter')
+ } else {
+ yearChartEl?.classList.add('chart-quarter-activated')
+ quarterChartEl?.classList.add('active')
+ updateQuarterChart(chart, 'barQuarter')
+ }
+ } else {
+ updateQuarterChart(chart, 'barQuarter')
+ }
+
+ if (opts.selectedDataPoints[0].length === 0) {
+ yearChartEl?.classList.remove('chart-quarter-activated')
+ quarterChartEl?.classList.remove('active')
+ }
+ },
+ updated: function (chart) {
+ updateQuarterChart(chart, 'barQuarter')
+ },
+ },
+ },
+ plotOptions: {
+ bar: {
+ distributed: true,
+ horizontal: true,
+ barHeight: '75%',
+ dataLabels: {
+ position: 'bottom',
+ },
+ },
+ },
+ dataLabels: {
+ enabled: true,
+ textAnchor: 'start',
+ style: {
+ colors: ['#fff'],
+ },
+ formatter: function (val, opt) {
+ return opt.w.globals.labels[opt.dataPointIndex]
+ },
+ offsetX: 0,
+ dropShadow: {
+ enabled: true,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ colors: ['#727cf5', '#6c757d', '#0acf97', '#fa5c7c', '#ffbc00', '#39afd1'],
+
+ states: {
+ active: {
+ allowMultipleDataPointsSelection: true,
+ filter: {
+ type: 'darken',
+ },
+ },
+ },
+ tooltip: {
+ x: {
+ show: false,
+ },
+ },
+ title: {
+ text: 'Yearly Results',
+ offsetX: 15,
+ },
+ subtitle: {
+ text: '(Click on bar to see details)',
+ offsetX: 15,
+ },
+ yaxis: {
+ labels: {
+ show: false,
+ },
+ },
+ }
+
+ quarterChart: Partial = {
+ series: [
+ {
+ data: [],
+ },
+ ],
+ chart: {
+ id: 'barQuarter',
+ height: 400,
+ width: '100%',
+ type: 'bar',
+ stacked: true,
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '50%',
+ horizontal: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ colors: ['#1c84ee', '#7f56da', '#ff86c8', '#ef5f5f', '#f9b931', '#22c55e'],
+ grid: {
+ yaxis: {
+ lines: {
+ show: false,
+ },
+ },
+ xaxis: {
+ lines: {
+ show: true,
+ },
+ },
+ },
+ xaxis: {
+ axisBorder: {
+ show: false,
+ },
+ },
+ yaxis: {
+ labels: {
+ show: false,
+ },
+ },
+ title: {
+ text: 'Quarterly Results',
+ offsetX: 10,
+ },
+ tooltip: {
+ x: {
+ formatter: function (val, opts) {
+ return opts.w.globals.seriesNames[opts.seriesIndex]
+ },
+ },
+ },
+ }
+
+ updateQuarter() {
+ this.yearColumnChart.series = [
+ {
+ data: this.makeData(),
+ },
+ ]
+ }
+}
diff --git a/apiferia/src/app/views/charts/heatmap/heatmap.component.html b/apiferia/src/app/views/charts/heatmap/heatmap.component.html
new file mode 100644
index 00000000..5d56065e
--- /dev/null
+++ b/apiferia/src/app/views/charts/heatmap/heatmap.component.html
@@ -0,0 +1,116 @@
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/heatmap.component.ts
+
+
+
+
+
+
+
+ Basic Heatmap - Single Series
+
+
+
+
+
+
+
+
+
+ Heatmap - Multiple Series
+
+
+
+
+
+
+
+
+
+ Heatmap - Color Range
+
+
+
+
+
+
+
+
+
+ Heatmap - Range without Shades
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/heatmap/heatmap.component.spec.ts b/apiferia/src/app/views/charts/heatmap/heatmap.component.spec.ts
new file mode 100644
index 00000000..d2ab4305
--- /dev/null
+++ b/apiferia/src/app/views/charts/heatmap/heatmap.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { HeatmapComponent } from './heatmap.component'
+
+describe('HeatmapComponent', () => {
+ let component: HeatmapComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [HeatmapComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(HeatmapComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/heatmap/heatmap.component.ts b/apiferia/src/app/views/charts/heatmap/heatmap.component.ts
new file mode 100644
index 00000000..0b802aea
--- /dev/null
+++ b/apiferia/src/app/views/charts/heatmap/heatmap.component.ts
@@ -0,0 +1,429 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+function generateData(count: number, yrange: { min: number; max: number }) {
+ var i = 0
+ var series = []
+ while (i < count) {
+ var x = (i + 1).toString()
+ var y =
+ Math.floor(Math.random() * (yrange.max - yrange.min + 1)) + yrange.min
+
+ series.push({
+ x: x,
+ y: y,
+ })
+ i++
+ }
+ return series
+}
+
+@Component({
+ selector: 'app-heatmap',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './heatmap.component.html',
+ styles: ``,
+})
+export class HeatmapComponent {
+ basicheatmapChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'heatmap',
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ colors: ['#1c84ee'],
+ series: [
+ {
+ name: 'Metric 1',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 2',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 3',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 4',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 5',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 6',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 7',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 8',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 9',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ ],
+ xaxis: {
+ type: 'category',
+ },
+ }
+
+ multipleheatmapChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'heatmap',
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ colors: [
+ '#1c84ee',
+ '#53389f',
+ '#7f56da',
+ '#ff86c8',
+ '#ef5f5f',
+ '#ff6c2f',
+ '#f9b931',
+ '#22c55e',
+ '#4ecac2',
+ ],
+ series: [
+ {
+ name: 'Metric 1',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 2',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 3',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 4',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 5',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 6',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 7',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 8',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric 9',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ ],
+ xaxis: {
+ type: 'category',
+ },
+ }
+
+ colorheatmapChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'heatmap',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ heatmap: {
+ shadeIntensity: 0.5,
+
+ colorScale: {
+ ranges: [
+ {
+ from: -30,
+ to: 5,
+ name: 'Low',
+ color: '#1c84ee',
+ },
+ {
+ from: 6,
+ to: 20,
+ name: 'Medium',
+ color: '#ef5f5f',
+ },
+ {
+ from: 21,
+ to: 45,
+ name: 'High',
+ color: '#f9b931',
+ },
+ {
+ from: 46,
+ to: 55,
+ name: 'Extreme',
+ color: '#22c55e',
+ },
+ ],
+ },
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ name: 'Jan',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'Feb',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'Mar',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'Apr',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'May',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'Jun',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'Jul',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'Aug',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ {
+ name: 'Sep',
+ data: generateData(20, {
+ min: -30,
+ max: 55,
+ }),
+ },
+ ],
+ }
+
+ roundedheatmapChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'heatmap',
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ width: 0,
+ },
+ plotOptions: {
+ heatmap: {
+ radius: 30,
+ enableShades: false,
+ colorScale: {
+ ranges: [
+ {
+ from: 0,
+ to: 50,
+ color: '#1c84ee',
+ },
+ {
+ from: 51,
+ to: 100,
+ color: '#4ecac2',
+ },
+ ],
+ },
+ },
+ },
+ colors: ['#1c84ee', '#4ecac2'],
+ dataLabels: {
+ enabled: true,
+ style: {
+ colors: ['#fff'],
+ },
+ },
+ series: [
+ {
+ name: 'Metric1',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric2',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric3',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric4',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric5',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric6',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric7',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric8',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ {
+ name: 'Metric8',
+ data: generateData(20, {
+ min: 0,
+ max: 90,
+ }),
+ },
+ ],
+
+ xaxis: {
+ type: 'category',
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/line/line.component.html b/apiferia/src/app/views/charts/line/line.component.html
new file mode 100644
index 00000000..c84140ae
--- /dev/null
+++ b/apiferia/src/app/views/charts/line/line.component.html
@@ -0,0 +1,307 @@
+
+
+
+
+
+
+
Overview
+
+ Find the TS file for the following chart at:
+ src/app/views/charts/line.component.ts
+
+
+
+
+
+
+
+
+
+ Line with Data Labels
+
+
+
+
+
+
+
+
+
+ Zoomable Timeseries
+
+
+
+
+
+
+
+
+
+ Line Chart with Annotations
+
+
+
+
+
+
+
+
+
+
+
+ Gradient Line Chart
+
+
+
+
+
+
+
+
+
+ Missing / Null values
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/line/line.component.spec.ts b/apiferia/src/app/views/charts/line/line.component.spec.ts
new file mode 100644
index 00000000..18541f8a
--- /dev/null
+++ b/apiferia/src/app/views/charts/line/line.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { LineComponent } from './line.component'
+
+describe('LineComponent', () => {
+ let component: LineComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [LineComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(LineComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/line/line.component.ts b/apiferia/src/app/views/charts/line/line.component.ts
new file mode 100644
index 00000000..a2ae6042
--- /dev/null
+++ b/apiferia/src/app/views/charts/line/line.component.ts
@@ -0,0 +1,2572 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+const dataSeries = [
+ [
+ {
+ date: '2014-01-01',
+ value: 20000000,
+ },
+ {
+ date: '2014-01-02',
+ value: 10379978,
+ },
+ {
+ date: '2014-01-03',
+ value: 30493749,
+ },
+ {
+ date: '2014-01-04',
+ value: 10785250,
+ },
+ {
+ date: '2014-01-05',
+ value: 33901904,
+ },
+ {
+ date: '2014-01-06',
+ value: 11576838,
+ },
+ {
+ date: '2014-01-07',
+ value: 14413854,
+ },
+ {
+ date: '2014-01-08',
+ value: 15177211,
+ },
+ {
+ date: '2014-01-09',
+ value: 16622100,
+ },
+ {
+ date: '2014-01-10',
+ value: 17381072,
+ },
+ {
+ date: '2014-01-11',
+ value: 18802310,
+ },
+ {
+ date: '2014-01-12',
+ value: 15531790,
+ },
+ {
+ date: '2014-01-13',
+ value: 15748881,
+ },
+ {
+ date: '2014-01-14',
+ value: 18706437,
+ },
+ {
+ date: '2014-01-15',
+ value: 19752685,
+ },
+ {
+ date: '2014-01-16',
+ value: 21016418,
+ },
+ {
+ date: '2014-01-17',
+ value: 25622924,
+ },
+ {
+ date: '2014-01-18',
+ value: 25337480,
+ },
+ {
+ date: '2014-01-19',
+ value: 22258882,
+ },
+ {
+ date: '2014-01-20',
+ value: 23829538,
+ },
+ {
+ date: '2014-01-21',
+ value: 24245689,
+ },
+ {
+ date: '2014-01-22',
+ value: 26429711,
+ },
+ {
+ date: '2014-01-23',
+ value: 26259017,
+ },
+ {
+ date: '2014-01-24',
+ value: 25396183,
+ },
+ {
+ date: '2014-01-25',
+ value: 23107346,
+ },
+ {
+ date: '2014-01-26',
+ value: 28659852,
+ },
+ {
+ date: '2014-01-27',
+ value: 25270783,
+ },
+ {
+ date: '2014-01-28',
+ value: 26270783,
+ },
+ {
+ date: '2014-01-29',
+ value: 27270783,
+ },
+ {
+ date: '2014-01-30',
+ value: 28270783,
+ },
+ {
+ date: '2014-01-31',
+ value: 29270783,
+ },
+ {
+ date: '2014-02-01',
+ value: 30270783,
+ },
+ {
+ date: '2014-02-02',
+ value: 31270783,
+ },
+ {
+ date: '2014-02-03',
+ value: 32270783,
+ },
+ {
+ date: '2014-02-04',
+ value: 33270783,
+ },
+ {
+ date: '2014-02-05',
+ value: 28270783,
+ },
+ {
+ date: '2014-02-06',
+ value: 27270783,
+ },
+ {
+ date: '2014-02-07',
+ value: 35270783,
+ },
+ {
+ date: '2014-02-08',
+ value: 34270783,
+ },
+ {
+ date: '2014-02-09',
+ value: 28270783,
+ },
+ {
+ date: '2014-02-10',
+ value: 35270783,
+ },
+ {
+ date: '2014-02-11',
+ value: 36270783,
+ },
+ {
+ date: '2014-02-12',
+ value: 34127078,
+ },
+ {
+ date: '2014-02-13',
+ value: 33124078,
+ },
+ {
+ date: '2014-02-14',
+ value: 36227078,
+ },
+ {
+ date: '2014-02-15',
+ value: 37827078,
+ },
+ {
+ date: '2014-02-16',
+ value: 36427073,
+ },
+ {
+ date: '2014-02-17',
+ value: 37570783,
+ },
+ {
+ date: '2014-02-18',
+ value: 38627073,
+ },
+ {
+ date: '2014-02-19',
+ value: 37727078,
+ },
+ {
+ date: '2014-02-20',
+ value: 38827073,
+ },
+ {
+ date: '2014-02-21',
+ value: 40927078,
+ },
+ {
+ date: '2014-02-22',
+ value: 41027078,
+ },
+ {
+ date: '2014-02-23',
+ value: 42127073,
+ },
+ {
+ date: '2014-02-24',
+ value: 43220783,
+ },
+ {
+ date: '2014-02-25',
+ value: 44327078,
+ },
+ {
+ date: '2014-02-26',
+ value: 40427078,
+ },
+ {
+ date: '2014-02-27',
+ value: 41027078,
+ },
+ {
+ date: '2014-02-28',
+ value: 45627078,
+ },
+ {
+ date: '2014-03-01',
+ value: 44727078,
+ },
+ {
+ date: '2014-03-02',
+ value: 44227078,
+ },
+ {
+ date: '2014-03-03',
+ value: 45227078,
+ },
+ {
+ date: '2014-03-04',
+ value: 46027078,
+ },
+ {
+ date: '2014-03-05',
+ value: 46927078,
+ },
+ {
+ date: '2014-03-06',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-07',
+ value: 46227078,
+ },
+ {
+ date: '2014-03-08',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-09',
+ value: 48027078,
+ },
+ {
+ date: '2014-03-10',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-11',
+ value: 47027078,
+ },
+ {
+ date: '2014-03-12',
+ value: 48017078,
+ },
+ {
+ date: '2014-03-13',
+ value: 48077078,
+ },
+ {
+ date: '2014-03-14',
+ value: 48087078,
+ },
+ {
+ date: '2014-03-15',
+ value: 48017078,
+ },
+ {
+ date: '2014-03-16',
+ value: 48047078,
+ },
+ {
+ date: '2014-03-17',
+ value: 48067078,
+ },
+ {
+ date: '2014-03-18',
+ value: 48077078,
+ },
+ {
+ date: '2014-03-19',
+ value: 48027074,
+ },
+ {
+ date: '2014-03-20',
+ value: 48927079,
+ },
+ {
+ date: '2014-03-21',
+ value: 48727071,
+ },
+ {
+ date: '2014-03-22',
+ value: 48127072,
+ },
+ {
+ date: '2014-03-23',
+ value: 48527072,
+ },
+ {
+ date: '2014-03-24',
+ value: 48627027,
+ },
+ {
+ date: '2014-03-25',
+ value: 48027040,
+ },
+ {
+ date: '2014-03-26',
+ value: 48027043,
+ },
+ {
+ date: '2014-03-27',
+ value: 48057022,
+ },
+ {
+ date: '2014-03-28',
+ value: 49057022,
+ },
+ {
+ date: '2014-03-29',
+ value: 50057022,
+ },
+ {
+ date: '2014-03-30',
+ value: 51057022,
+ },
+ {
+ date: '2014-03-31',
+ value: 52057022,
+ },
+ {
+ date: '2014-04-01',
+ value: 53057022,
+ },
+ {
+ date: '2014-04-02',
+ value: 54057022,
+ },
+ {
+ date: '2014-04-03',
+ value: 52057022,
+ },
+ {
+ date: '2014-04-04',
+ value: 55057022,
+ },
+ {
+ date: '2014-04-05',
+ value: 58270783,
+ },
+ {
+ date: '2014-04-06',
+ value: 56270783,
+ },
+ {
+ date: '2014-04-07',
+ value: 55270783,
+ },
+ {
+ date: '2014-04-08',
+ value: 58270783,
+ },
+ {
+ date: '2014-04-09',
+ value: 59270783,
+ },
+ {
+ date: '2014-04-10',
+ value: 60270783,
+ },
+ {
+ date: '2014-04-11',
+ value: 61270783,
+ },
+ {
+ date: '2014-04-12',
+ value: 62270783,
+ },
+ {
+ date: '2014-04-13',
+ value: 63270783,
+ },
+ {
+ date: '2014-04-14',
+ value: 64270783,
+ },
+ {
+ date: '2014-04-15',
+ value: 65270783,
+ },
+ {
+ date: '2014-04-16',
+ value: 66270783,
+ },
+ {
+ date: '2014-04-17',
+ value: 67270783,
+ },
+ {
+ date: '2014-04-18',
+ value: 68270783,
+ },
+ {
+ date: '2014-04-19',
+ value: 69270783,
+ },
+ {
+ date: '2014-04-20',
+ value: 70270783,
+ },
+ {
+ date: '2014-04-21',
+ value: 71270783,
+ },
+ {
+ date: '2014-04-22',
+ value: 72270783,
+ },
+ {
+ date: '2014-04-23',
+ value: 73270783,
+ },
+ {
+ date: '2014-04-24',
+ value: 74270783,
+ },
+ {
+ date: '2014-04-25',
+ value: 75270783,
+ },
+ {
+ date: '2014-04-26',
+ value: 76660783,
+ },
+ {
+ date: '2014-04-27',
+ value: 77270783,
+ },
+ {
+ date: '2014-04-28',
+ value: 78370783,
+ },
+ {
+ date: '2014-04-29',
+ value: 79470783,
+ },
+ {
+ date: '2014-04-30',
+ value: 80170783,
+ },
+ ],
+ [
+ {
+ date: '2014-01-01',
+ value: 150000000,
+ },
+ {
+ date: '2014-01-02',
+ value: 160379978,
+ },
+ {
+ date: '2014-01-03',
+ value: 170493749,
+ },
+ {
+ date: '2014-01-04',
+ value: 160785250,
+ },
+ {
+ date: '2014-01-05',
+ value: 167391904,
+ },
+ {
+ date: '2014-01-06',
+ value: 161576838,
+ },
+ {
+ date: '2014-01-07',
+ value: 161413854,
+ },
+ {
+ date: '2014-01-08',
+ value: 152177211,
+ },
+ {
+ date: '2014-01-09',
+ value: 140762210,
+ },
+ {
+ date: '2014-01-10',
+ value: 144381072,
+ },
+ {
+ date: '2014-01-11',
+ value: 154352310,
+ },
+ {
+ date: '2014-01-12',
+ value: 165531790,
+ },
+ {
+ date: '2014-01-13',
+ value: 175748881,
+ },
+ {
+ date: '2014-01-14',
+ value: 187064037,
+ },
+ {
+ date: '2014-01-15',
+ value: 197520685,
+ },
+ {
+ date: '2014-01-16',
+ value: 210176418,
+ },
+ {
+ date: '2014-01-17',
+ value: 196122924,
+ },
+ {
+ date: '2014-01-18',
+ value: 207337480,
+ },
+ {
+ date: '2014-01-19',
+ value: 200258882,
+ },
+ {
+ date: '2014-01-20',
+ value: 186829538,
+ },
+ {
+ date: '2014-01-21',
+ value: 192456897,
+ },
+ {
+ date: '2014-01-22',
+ value: 204299711,
+ },
+ {
+ date: '2014-01-23',
+ value: 192759017,
+ },
+ {
+ date: '2014-01-24',
+ value: 203596183,
+ },
+ {
+ date: '2014-01-25',
+ value: 208107346,
+ },
+ {
+ date: '2014-01-26',
+ value: 196359852,
+ },
+ {
+ date: '2014-01-27',
+ value: 192570783,
+ },
+ {
+ date: '2014-01-28',
+ value: 177967768,
+ },
+ {
+ date: '2014-01-29',
+ value: 190632803,
+ },
+ {
+ date: '2014-01-30',
+ value: 203725316,
+ },
+ {
+ date: '2014-01-31',
+ value: 218226177,
+ },
+ {
+ date: '2014-02-01',
+ value: 210698669,
+ },
+ {
+ date: '2014-02-02',
+ value: 217640656,
+ },
+ {
+ date: '2014-02-03',
+ value: 216142362,
+ },
+ {
+ date: '2014-02-04',
+ value: 201410971,
+ },
+ {
+ date: '2014-02-05',
+ value: 196704289,
+ },
+ {
+ date: '2014-02-06',
+ value: 190436945,
+ },
+ {
+ date: '2014-02-07',
+ value: 178891686,
+ },
+ {
+ date: '2014-02-08',
+ value: 171613962,
+ },
+ {
+ date: '2014-02-09',
+ value: 157579773,
+ },
+ {
+ date: '2014-02-10',
+ value: 158677098,
+ },
+ {
+ date: '2014-02-11',
+ value: 147129977,
+ },
+ {
+ date: '2014-02-12',
+ value: 151561876,
+ },
+ {
+ date: '2014-02-13',
+ value: 151627421,
+ },
+ {
+ date: '2014-02-14',
+ value: 143543872,
+ },
+ {
+ date: '2014-02-15',
+ value: 136581057,
+ },
+ {
+ date: '2014-02-16',
+ value: 135560715,
+ },
+ {
+ date: '2014-02-17',
+ value: 122625263,
+ },
+ {
+ date: '2014-02-18',
+ value: 112091484,
+ },
+ {
+ date: '2014-02-19',
+ value: 98810329,
+ },
+ {
+ date: '2014-02-20',
+ value: 99882912,
+ },
+ {
+ date: '2014-02-21',
+ value: 94943095,
+ },
+ {
+ date: '2014-02-22',
+ value: 104875743,
+ },
+ {
+ date: '2014-02-23',
+ value: 116383678,
+ },
+ {
+ date: '2014-02-24',
+ value: 125028841,
+ },
+ {
+ date: '2014-02-25',
+ value: 123967310,
+ },
+ {
+ date: '2014-02-26',
+ value: 133167029,
+ },
+ {
+ date: '2014-02-27',
+ value: 128577263,
+ },
+ {
+ date: '2014-02-28',
+ value: 115836969,
+ },
+ {
+ date: '2014-03-01',
+ value: 119264529,
+ },
+ {
+ date: '2014-03-02',
+ value: 109363374,
+ },
+ {
+ date: '2014-03-03',
+ value: 113985628,
+ },
+ {
+ date: '2014-03-04',
+ value: 114650999,
+ },
+ {
+ date: '2014-03-05',
+ value: 110866108,
+ },
+ {
+ date: '2014-03-06',
+ value: 96473454,
+ },
+ {
+ date: '2014-03-07',
+ value: 104075886,
+ },
+ {
+ date: '2014-03-08',
+ value: 103568384,
+ },
+ {
+ date: '2014-03-09',
+ value: 101534883,
+ },
+ {
+ date: '2014-03-10',
+ value: 115825447,
+ },
+ {
+ date: '2014-03-11',
+ value: 126133916,
+ },
+ {
+ date: '2014-03-12',
+ value: 116502109,
+ },
+ {
+ date: '2014-03-13',
+ value: 130169411,
+ },
+ {
+ date: '2014-03-14',
+ value: 124296886,
+ },
+ {
+ date: '2014-03-15',
+ value: 126347399,
+ },
+ {
+ date: '2014-03-16',
+ value: 131483669,
+ },
+ {
+ date: '2014-03-17',
+ value: 142811333,
+ },
+ {
+ date: '2014-03-18',
+ value: 129675396,
+ },
+ {
+ date: '2014-03-19',
+ value: 115514483,
+ },
+ {
+ date: '2014-03-20',
+ value: 117630630,
+ },
+ {
+ date: '2014-03-21',
+ value: 122340239,
+ },
+ {
+ date: '2014-03-22',
+ value: 132349091,
+ },
+ {
+ date: '2014-03-23',
+ value: 125613305,
+ },
+ {
+ date: '2014-03-24',
+ value: 135592466,
+ },
+ {
+ date: '2014-03-25',
+ value: 123408762,
+ },
+ {
+ date: '2014-03-26',
+ value: 111991454,
+ },
+ {
+ date: '2014-03-27',
+ value: 116123955,
+ },
+ {
+ date: '2014-03-28',
+ value: 112817214,
+ },
+ {
+ date: '2014-03-29',
+ value: 113029590,
+ },
+ {
+ date: '2014-03-30',
+ value: 108753398,
+ },
+ {
+ date: '2014-03-31',
+ value: 99383763,
+ },
+ {
+ date: '2014-04-01',
+ value: 100151737,
+ },
+ {
+ date: '2014-04-02',
+ value: 94985209,
+ },
+ {
+ date: '2014-04-03',
+ value: 82913669,
+ },
+ {
+ date: '2014-04-04',
+ value: 78748268,
+ },
+ {
+ date: '2014-04-05',
+ value: 63829135,
+ },
+ {
+ date: '2014-04-06',
+ value: 78694727,
+ },
+ {
+ date: '2014-04-07',
+ value: 80868994,
+ },
+ {
+ date: '2014-04-08',
+ value: 93799013,
+ },
+ {
+ date: '2014-04-09',
+ value: 99042416,
+ },
+ {
+ date: '2014-04-10',
+ value: 97298692,
+ },
+ {
+ date: '2014-04-11',
+ value: 83353499,
+ },
+ {
+ date: '2014-04-12',
+ value: 71248129,
+ },
+ {
+ date: '2014-04-13',
+ value: 75253744,
+ },
+ {
+ date: '2014-04-14',
+ value: 68976648,
+ },
+ {
+ date: '2014-04-15',
+ value: 71002284,
+ },
+ {
+ date: '2014-04-16',
+ value: 75052401,
+ },
+ {
+ date: '2014-04-17',
+ value: 83894030,
+ },
+ {
+ date: '2014-04-18',
+ value: 90236528,
+ },
+ {
+ date: '2014-04-19',
+ value: 99739114,
+ },
+ {
+ date: '2014-04-20',
+ value: 96407136,
+ },
+ {
+ date: '2014-04-21',
+ value: 108323177,
+ },
+ {
+ date: '2014-04-22',
+ value: 101578914,
+ },
+ {
+ date: '2014-04-23',
+ value: 115877608,
+ },
+ {
+ date: '2014-04-24',
+ value: 112088857,
+ },
+ {
+ date: '2014-04-25',
+ value: 112071353,
+ },
+ {
+ date: '2014-04-26',
+ value: 101790062,
+ },
+ {
+ date: '2014-04-27',
+ value: 115003761,
+ },
+ {
+ date: '2014-04-28',
+ value: 120457727,
+ },
+ {
+ date: '2014-04-29',
+ value: 118253926,
+ },
+ {
+ date: '2014-04-30',
+ value: 117956992,
+ },
+ ],
+ [
+ {
+ date: '2014-01-01',
+ value: 50000000,
+ },
+ {
+ date: '2014-01-02',
+ value: 60379978,
+ },
+ {
+ date: '2014-01-03',
+ value: 40493749,
+ },
+ {
+ date: '2014-01-04',
+ value: 60785250,
+ },
+ {
+ date: '2014-01-05',
+ value: 67391904,
+ },
+ {
+ date: '2014-01-06',
+ value: 61576838,
+ },
+ {
+ date: '2014-01-07',
+ value: 61413854,
+ },
+ {
+ date: '2014-01-08',
+ value: 82177211,
+ },
+ {
+ date: '2014-01-09',
+ value: 103762210,
+ },
+ {
+ date: '2014-01-10',
+ value: 84381072,
+ },
+ {
+ date: '2014-01-11',
+ value: 54352310,
+ },
+ {
+ date: '2014-01-12',
+ value: 65531790,
+ },
+ {
+ date: '2014-01-13',
+ value: 75748881,
+ },
+ {
+ date: '2014-01-14',
+ value: 47064037,
+ },
+ {
+ date: '2014-01-15',
+ value: 67520685,
+ },
+ {
+ date: '2014-01-16',
+ value: 60176418,
+ },
+ {
+ date: '2014-01-17',
+ value: 66122924,
+ },
+ {
+ date: '2014-01-18',
+ value: 57337480,
+ },
+ {
+ date: '2014-01-19',
+ value: 100258882,
+ },
+ {
+ date: '2014-01-20',
+ value: 46829538,
+ },
+ {
+ date: '2014-01-21',
+ value: 92456897,
+ },
+ {
+ date: '2014-01-22',
+ value: 94299711,
+ },
+ {
+ date: '2014-01-23',
+ value: 62759017,
+ },
+ {
+ date: '2014-01-24',
+ value: 103596183,
+ },
+ {
+ date: '2014-01-25',
+ value: 108107346,
+ },
+ {
+ date: '2014-01-26',
+ value: 66359852,
+ },
+ {
+ date: '2014-01-27',
+ value: 62570783,
+ },
+ {
+ date: '2014-01-28',
+ value: 77967768,
+ },
+ {
+ date: '2014-01-29',
+ value: 60632803,
+ },
+ {
+ date: '2014-01-30',
+ value: 103725316,
+ },
+ {
+ date: '2014-01-31',
+ value: 98226177,
+ },
+ {
+ date: '2014-02-01',
+ value: 60698669,
+ },
+ {
+ date: '2014-02-02',
+ value: 67640656,
+ },
+ {
+ date: '2014-02-03',
+ value: 66142362,
+ },
+ {
+ date: '2014-02-04',
+ value: 101410971,
+ },
+ {
+ date: '2014-02-05',
+ value: 66704289,
+ },
+ {
+ date: '2014-02-06',
+ value: 60436945,
+ },
+ {
+ date: '2014-02-07',
+ value: 78891686,
+ },
+ {
+ date: '2014-02-08',
+ value: 71613962,
+ },
+ {
+ date: '2014-02-09',
+ value: 107579773,
+ },
+ {
+ date: '2014-02-10',
+ value: 58677098,
+ },
+ {
+ date: '2014-02-11',
+ value: 87129977,
+ },
+ {
+ date: '2014-02-12',
+ value: 51561876,
+ },
+ {
+ date: '2014-02-13',
+ value: 51627421,
+ },
+ {
+ date: '2014-02-14',
+ value: 83543872,
+ },
+ {
+ date: '2014-02-15',
+ value: 66581057,
+ },
+ {
+ date: '2014-02-16',
+ value: 65560715,
+ },
+ {
+ date: '2014-02-17',
+ value: 62625263,
+ },
+ {
+ date: '2014-02-18',
+ value: 92091484,
+ },
+ {
+ date: '2014-02-19',
+ value: 48810329,
+ },
+ {
+ date: '2014-02-20',
+ value: 49882912,
+ },
+ {
+ date: '2014-02-21',
+ value: 44943095,
+ },
+ {
+ date: '2014-02-22',
+ value: 104875743,
+ },
+ {
+ date: '2014-02-23',
+ value: 96383678,
+ },
+ {
+ date: '2014-02-24',
+ value: 105028841,
+ },
+ {
+ date: '2014-02-25',
+ value: 63967310,
+ },
+ {
+ date: '2014-02-26',
+ value: 63167029,
+ },
+ {
+ date: '2014-02-27',
+ value: 68577263,
+ },
+ {
+ date: '2014-02-28',
+ value: 95836969,
+ },
+ {
+ date: '2014-03-01',
+ value: 99264529,
+ },
+ {
+ date: '2014-03-02',
+ value: 109363374,
+ },
+ {
+ date: '2014-03-03',
+ value: 93985628,
+ },
+ {
+ date: '2014-03-04',
+ value: 94650999,
+ },
+ {
+ date: '2014-03-05',
+ value: 90866108,
+ },
+ {
+ date: '2014-03-06',
+ value: 46473454,
+ },
+ {
+ date: '2014-03-07',
+ value: 84075886,
+ },
+ {
+ date: '2014-03-08',
+ value: 103568384,
+ },
+ {
+ date: '2014-03-09',
+ value: 101534883,
+ },
+ {
+ date: '2014-03-10',
+ value: 95825447,
+ },
+ {
+ date: '2014-03-11',
+ value: 66133916,
+ },
+ {
+ date: '2014-03-12',
+ value: 96502109,
+ },
+ {
+ date: '2014-03-13',
+ value: 80169411,
+ },
+ {
+ date: '2014-03-14',
+ value: 84296886,
+ },
+ {
+ date: '2014-03-15',
+ value: 86347399,
+ },
+ {
+ date: '2014-03-16',
+ value: 31483669,
+ },
+ {
+ date: '2014-03-17',
+ value: 82811333,
+ },
+ {
+ date: '2014-03-18',
+ value: 89675396,
+ },
+ {
+ date: '2014-03-19',
+ value: 95514483,
+ },
+ {
+ date: '2014-03-20',
+ value: 97630630,
+ },
+ {
+ date: '2014-03-21',
+ value: 62340239,
+ },
+ {
+ date: '2014-03-22',
+ value: 62349091,
+ },
+ {
+ date: '2014-03-23',
+ value: 65613305,
+ },
+ {
+ date: '2014-03-24',
+ value: 65592466,
+ },
+ {
+ date: '2014-03-25',
+ value: 63408762,
+ },
+ {
+ date: '2014-03-26',
+ value: 91991454,
+ },
+ {
+ date: '2014-03-27',
+ value: 96123955,
+ },
+ {
+ date: '2014-03-28',
+ value: 92817214,
+ },
+ {
+ date: '2014-03-29',
+ value: 93029590,
+ },
+ {
+ date: '2014-03-30',
+ value: 108753398,
+ },
+ {
+ date: '2014-03-31',
+ value: 49383763,
+ },
+ {
+ date: '2014-04-01',
+ value: 100151737,
+ },
+ {
+ date: '2014-04-02',
+ value: 44985209,
+ },
+ {
+ date: '2014-04-03',
+ value: 52913669,
+ },
+ {
+ date: '2014-04-04',
+ value: 48748268,
+ },
+ {
+ date: '2014-04-05',
+ value: 23829135,
+ },
+ {
+ date: '2014-04-06',
+ value: 58694727,
+ },
+ {
+ date: '2014-04-07',
+ value: 50868994,
+ },
+ {
+ date: '2014-04-08',
+ value: 43799013,
+ },
+ {
+ date: '2014-04-09',
+ value: 4042416,
+ },
+ {
+ date: '2014-04-10',
+ value: 47298692,
+ },
+ {
+ date: '2014-04-11',
+ value: 53353499,
+ },
+ {
+ date: '2014-04-12',
+ value: 71248129,
+ },
+ {
+ date: '2014-04-13',
+ value: 75253744,
+ },
+ {
+ date: '2014-04-14',
+ value: 68976648,
+ },
+ {
+ date: '2014-04-15',
+ value: 71002284,
+ },
+ {
+ date: '2014-04-16',
+ value: 75052401,
+ },
+ {
+ date: '2014-04-17',
+ value: 83894030,
+ },
+ {
+ date: '2014-04-18',
+ value: 50236528,
+ },
+ {
+ date: '2014-04-19',
+ value: 59739114,
+ },
+ {
+ date: '2014-04-20',
+ value: 56407136,
+ },
+ {
+ date: '2014-04-21',
+ value: 108323177,
+ },
+ {
+ date: '2014-04-22',
+ value: 101578914,
+ },
+ {
+ date: '2014-04-23',
+ value: 95877608,
+ },
+ {
+ date: '2014-04-24',
+ value: 62088857,
+ },
+ {
+ date: '2014-04-25',
+ value: 92071353,
+ },
+ {
+ date: '2014-04-26',
+ value: 81790062,
+ },
+ {
+ date: '2014-04-27',
+ value: 105003761,
+ },
+ {
+ date: '2014-04-28',
+ value: 100457727,
+ },
+ {
+ date: '2014-04-29',
+ value: 98253926,
+ },
+ {
+ date: '2014-04-30',
+ value: 67956992,
+ },
+ ],
+]
+
+const series = {
+ monthDataSeries1: {
+ prices: [
+ 8107.85, 8128.0, 8122.9, 8165.5, 8340.7, 8423.7, 8423.5, 8514.3, 8481.85,
+ 8487.7, 8506.9, 8626.2, 8668.95, 8602.3, 8607.55, 8512.9, 8496.25,
+ 8600.65, 8881.1, 9340.85,
+ ],
+ dates: [
+ '13 Nov 2017',
+ '14 Nov 2017',
+ '15 Nov 2017',
+ '16 Nov 2017',
+ '17 Nov 2017',
+ '20 Nov 2017',
+ '21 Nov 2017',
+ '22 Nov 2017',
+ '23 Nov 2017',
+ '24 Nov 2017',
+ '27 Nov 2017',
+ '28 Nov 2017',
+ '29 Nov 2017',
+ '30 Nov 2017',
+ '01 Dec 2017',
+ '04 Dec 2017',
+ '05 Dec 2017',
+ '06 Dec 2017',
+ '07 Dec 2017',
+ '08 Dec 2017',
+ ],
+ },
+ monthDataSeries2: {
+ prices: [
+ 8423.7, 8423.5, 8514.3, 8481.85, 8487.7, 8506.9, 8626.2, 8668.95, 8602.3,
+ 8607.55, 8512.9, 8496.25, 8600.65, 8881.1, 9040.85, 8340.7, 8165.5,
+ 8122.9, 8107.85, 8128.0,
+ ],
+ dates: [
+ '13 Nov 2017',
+ '14 Nov 2017',
+ '15 Nov 2017',
+ '16 Nov 2017',
+ '17 Nov 2017',
+ '20 Nov 2017',
+ '21 Nov 2017',
+ '22 Nov 2017',
+ '23 Nov 2017',
+ '24 Nov 2017',
+ '27 Nov 2017',
+ '28 Nov 2017',
+ '29 Nov 2017',
+ '30 Nov 2017',
+ '01 Dec 2017',
+ '04 Dec 2017',
+ '05 Dec 2017',
+ '06 Dec 2017',
+ '07 Dec 2017',
+ '08 Dec 2017',
+ ],
+ },
+ monthDataSeries3: {
+ prices: [
+ 7114.25, 7126.6, 7116.95, 7203.7, 7233.75, 7451.0, 7381.15, 7348.95,
+ 7347.75, 7311.25, 7266.4, 7253.25, 7215.45, 7266.35, 7315.25, 7237.2,
+ 7191.4, 7238.95, 7222.6, 7217.9, 7359.3, 7371.55, 7371.15, 7469.2,
+ 7429.25, 7434.65, 7451.1, 7475.25, 7566.25, 7556.8, 7525.55, 7555.45,
+ 7560.9, 7490.7, 7527.6, 7551.9, 7514.85, 7577.95, 7592.3, 7621.95,
+ 7707.95, 7859.1, 7815.7, 7739.0, 7778.7, 7839.45, 7756.45, 7669.2,
+ 7580.45, 7452.85, 7617.25, 7701.6, 7606.8, 7620.05, 7513.85, 7498.45,
+ 7575.45, 7601.95, 7589.1, 7525.85, 7569.5, 7702.5, 7812.7, 7803.75,
+ 7816.3, 7851.15, 7912.2, 7972.8, 8145.0, 8161.1, 8121.05, 8071.25, 8088.2,
+ 8154.45, 8148.3, 8122.05, 8132.65, 8074.55, 7952.8, 7885.55, 7733.9,
+ 7897.15, 7973.15, 7888.5, 7842.8, 7838.4, 7909.85, 7892.75, 7897.75,
+ 7820.05, 7904.4, 7872.2, 7847.5, 7849.55, 7789.6, 7736.35, 7819.4,
+ 7875.35, 7871.8, 8076.5, 8114.8, 8193.55, 8217.1, 8235.05, 8215.3, 8216.4,
+ 8301.55, 8235.25, 8229.75, 8201.95, 8164.95, 8107.85, 8128.0, 8122.9,
+ 8165.5, 8340.7, 8423.7, 8423.5, 8514.3, 8481.85, 8487.7, 8506.9, 8626.2,
+ ],
+ dates: [
+ '02 Jun 2017',
+ '05 Jun 2017',
+ '06 Jun 2017',
+ '07 Jun 2017',
+ '08 Jun 2017',
+ '09 Jun 2017',
+ '12 Jun 2017',
+ '13 Jun 2017',
+ '14 Jun 2017',
+ '15 Jun 2017',
+ '16 Jun 2017',
+ '19 Jun 2017',
+ '20 Jun 2017',
+ '21 Jun 2017',
+ '22 Jun 2017',
+ '23 Jun 2017',
+ '27 Jun 2017',
+ '28 Jun 2017',
+ '29 Jun 2017',
+ '30 Jun 2017',
+ '03 Jul 2017',
+ '04 Jul 2017',
+ '05 Jul 2017',
+ '06 Jul 2017',
+ '07 Jul 2017',
+ '10 Jul 2017',
+ '11 Jul 2017',
+ '12 Jul 2017',
+ '13 Jul 2017',
+ '14 Jul 2017',
+ '17 Jul 2017',
+ '18 Jul 2017',
+ '19 Jul 2017',
+ '20 Jul 2017',
+ '21 Jul 2017',
+ '24 Jul 2017',
+ '25 Jul 2017',
+ '26 Jul 2017',
+ '27 Jul 2017',
+ '28 Jul 2017',
+ '31 Jul 2017',
+ '01 Aug 2017',
+ '02 Aug 2017',
+ '03 Aug 2017',
+ '04 Aug 2017',
+ '07 Aug 2017',
+ '08 Aug 2017',
+ '09 Aug 2017',
+ '10 Aug 2017',
+ '11 Aug 2017',
+ '14 Aug 2017',
+ '16 Aug 2017',
+ '17 Aug 2017',
+ '18 Aug 2017',
+ '21 Aug 2017',
+ '22 Aug 2017',
+ '23 Aug 2017',
+ '24 Aug 2017',
+ '28 Aug 2017',
+ '29 Aug 2017',
+ '30 Aug 2017',
+ '31 Aug 2017',
+ '01 Sep 2017',
+ '04 Sep 2017',
+ '05 Sep 2017',
+ '06 Sep 2017',
+ '07 Sep 2017',
+ '08 Sep 2017',
+ '11 Sep 2017',
+ '12 Sep 2017',
+ '13 Sep 2017',
+ '14 Sep 2017',
+ '15 Sep 2017',
+ '18 Sep 2017',
+ '19 Sep 2017',
+ '20 Sep 2017',
+ '21 Sep 2017',
+ '22 Sep 2017',
+ '25 Sep 2017',
+ '26 Sep 2017',
+ '27 Sep 2017',
+ '28 Sep 2017',
+ '29 Sep 2017',
+ '03 Oct 2017',
+ '04 Oct 2017',
+ '05 Oct 2017',
+ '06 Oct 2017',
+ '09 Oct 2017',
+ '10 Oct 2017',
+ '11 Oct 2017',
+ '12 Oct 2017',
+ '13 Oct 2017',
+ '16 Oct 2017',
+ '17 Oct 2017',
+ '18 Oct 2017',
+ '19 Oct 2017',
+ '23 Oct 2017',
+ '24 Oct 2017',
+ '25 Oct 2017',
+ '26 Oct 2017',
+ '27 Oct 2017',
+ '30 Oct 2017',
+ '31 Oct 2017',
+ '01 Nov 2017',
+ '02 Nov 2017',
+ '03 Nov 2017',
+ '06 Nov 2017',
+ '07 Nov 2017',
+ '08 Nov 2017',
+ '09 Nov 2017',
+ '10 Nov 2017',
+ '13 Nov 2017',
+ '14 Nov 2017',
+ '15 Nov 2017',
+ '16 Nov 2017',
+ '17 Nov 2017',
+ '20 Nov 2017',
+ '21 Nov 2017',
+ '22 Nov 2017',
+ '23 Nov 2017',
+ '24 Nov 2017',
+ '27 Nov 2017',
+ '28 Nov 2017',
+ ],
+ },
+}
+
+let ts2 = 1484418600000
+let dates: number[][] = []
+let spikes = [5, -5, 3, -3, 8, -8]
+for (let i = 0; i < 120; i++) {
+ ts2 = ts2 + 86400000
+ let innerArr = [ts2, dataSeries[1][i].value]
+ dates.push(innerArr)
+}
+
+function generateDayWiseTimeSeries(
+ baseval: number,
+ count: number,
+ yrange: { min: number; max: number }
+) {
+ var i = 0
+ var series = []
+ while (i < count) {
+ var x = baseval
+ var y =
+ Math.floor(Math.random() * (yrange.max - yrange.min + 1)) + yrange.min
+
+ series.push([x, y])
+ baseval += 86400000
+ i++
+ }
+ return series
+}
+@Component({
+ selector: 'app-line',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './line.component.html',
+ styles: ``,
+})
+export class LineComponent {
+ lineChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ zoom: {
+ enabled: false,
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ colors: ['#7f56da'],
+ stroke: {
+ width: [4],
+ curve: 'straight',
+ },
+ series: [
+ {
+ name: 'Desktops',
+ data: [30, 41, 35, 51, 49, 62, 69, 91, 126],
+ },
+ ],
+ title: {
+ text: 'Product Trends by Month',
+ align: 'center',
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ labels: series.monthDataSeries1.dates,
+ xaxis: {
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ ],
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ datalabellineChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ zoom: {
+ enabled: false,
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#ef5f5f', '#22c55e'],
+ dataLabels: {
+ enabled: true,
+ },
+ stroke: {
+ width: [3, 3],
+ curve: 'smooth',
+ },
+ series: [
+ {
+ name: 'High - 2018',
+ data: [28, 29, 33, 36, 32, 32, 33],
+ },
+ {
+ name: 'Low - 2018',
+ data: [12, 11, 14, 18, 17, 13, 13],
+ },
+ ],
+ title: {
+ text: 'Average High & Low Temperature',
+ align: 'left',
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ markers: {
+ size: 6,
+ },
+ xaxis: {
+ categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'],
+ title: {
+ text: 'Month',
+ },
+ },
+ yaxis: {
+ title: {
+ text: 'Temperature',
+ },
+ min: 5,
+ max: 40,
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'right',
+ floating: true,
+ offsetY: -25,
+ offsetX: -5,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ zoomablelineChart: Partial = {
+ chart: {
+ type: 'area',
+ stacked: false,
+ height: 380,
+ zoom: {
+ enabled: true,
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: [3],
+ },
+ series: [
+ {
+ name: 'XYZ MOTORS',
+ data: dates,
+ },
+ ],
+ markers: {
+ size: 0,
+ },
+ colors: ['#7f56da'],
+ title: {
+ text: 'Stock Price Movement',
+ align: 'left',
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ fill: {
+ gradient: {
+ shadeIntensity: 1,
+ inverseColors: false,
+ opacityFrom: 0.5,
+ opacityTo: 0.1,
+ stops: [0, 70, 80, 100],
+ },
+ },
+ yaxis: {
+ min: 20000000,
+ max: 250000000,
+ labels: {
+ formatter: function (val) {
+ return (val / 1000000).toFixed(0)
+ },
+ },
+ title: {
+ text: 'Price',
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+
+ tooltip: {
+ shared: false,
+ y: {
+ formatter: function (val) {
+ return (val / 1000000).toFixed(0)
+ },
+ },
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ annotationslineChart: Partial = {
+ annotations: {
+ yaxis: [
+ {
+ y: 8200,
+ borderColor: '#f9b931',
+ label: {
+ borderColor: '#f9b931',
+ style: {
+ color: '#fff',
+ background: '#f9b931',
+ },
+ text: 'Support',
+ },
+ },
+ ],
+ xaxis: [
+ {
+ x: new Date('23 Nov 2017').getTime(),
+ borderColor: '#1c84ee',
+ label: {
+ borderColor: '#1c84ee',
+ style: {
+ color: '#fff',
+ background: '#1c84ee',
+ },
+ text: 'Anno Test',
+ },
+ },
+ {
+ x: new Date('03 Dec 2017').getTime(),
+ borderColor: '#ffbc00',
+ label: {
+ borderColor: '#ffbc00',
+ style: {
+ color: '#fff',
+ background: '#ffbc00',
+ },
+ orientation: 'horizontal',
+ text: 'New Beginning',
+ },
+ },
+ ],
+ points: [
+ {
+ x: new Date('27 Nov 2017').getTime(),
+ y: 8506.9,
+ marker: {
+ size: 8,
+ fillColor: '#fff',
+ strokeColor: '#fa5c7c',
+ },
+ label: {
+ borderColor: '#fa5c7c',
+ offsetY: 0,
+ style: {
+ color: '#fff',
+ background: '#fa5c7c',
+ },
+
+ text: 'Point Annotation',
+ },
+ },
+ ],
+ },
+ chart: {
+ height: 380,
+ type: 'line',
+ id: 'areachart-2',
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#ef5f5f'],
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: [3],
+ curve: 'straight',
+ },
+ series: [
+ {
+ data: series.monthDataSeries1.prices,
+ },
+ ],
+ title: {
+ text: 'Line with Annotations',
+ align: 'left',
+ },
+ labels: series.monthDataSeries1.dates,
+ xaxis: {
+ type: 'datetime',
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ syncinglineChart: Partial = {
+ chart: {
+ type: 'line',
+ height: 160,
+ id: 'fb',
+ group: 'social',
+ toolbar: {
+ show: false,
+ tools: {
+ selection: false,
+ },
+ },
+ },
+ colors: ['#1c84ee'],
+ stroke: {
+ width: [3],
+ curve: 'straight',
+ },
+
+ fill: {
+ opacity: 1,
+ },
+ tooltip: {
+ followCursor: false,
+ theme: 'dark',
+ x: {
+ show: false,
+ },
+ marker: {
+ show: false,
+ },
+ y: {
+ title: {
+ formatter: function () {
+ return ''
+ },
+ },
+ },
+ },
+ series: [
+ {
+ data: generateDayWiseTimeSeries(new Date('11 Feb 2017').getTime(), 20, {
+ min: 10,
+ max: 30,
+ }),
+ },
+ ],
+ xaxis: {
+ type: 'datetime',
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ syncing2lineChart: Partial = {
+ chart: {
+ height: 200,
+ type: 'line',
+ id: 'yt',
+ group: 'social',
+ toolbar: {
+ show: false,
+ tools: {
+ selection: false,
+ },
+ },
+ },
+ colors: ['#4ecac2'],
+ dataLabels: {
+ enabled: false,
+ },
+
+ tooltip: {
+ followCursor: false,
+ theme: 'dark',
+ x: {
+ show: false,
+ },
+ marker: {
+ show: false,
+ },
+ y: {
+ title: {
+ formatter: function () {
+ return ''
+ },
+ },
+ },
+ },
+ stroke: {
+ width: [3],
+ curve: 'smooth',
+ },
+
+ series: [
+ {
+ data: generateDayWiseTimeSeries(new Date('11 Feb 2017').getTime(), 20, {
+ min: 10,
+ max: 60,
+ }),
+ },
+ ],
+ fill: {
+ gradient: {
+ opacityFrom: 0.6,
+ opacityTo: 0.8,
+ },
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'left',
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ }
+
+ gradientlineChart: Partial = {
+ chart: {
+ height: 374,
+ type: 'line',
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ width: 5,
+ curve: 'smooth',
+ },
+ series: [
+ {
+ name: 'Likes',
+ data: [4, 3, 10, 9, 29, 19, 22, 9, 12, 7, 19, 5, 13, 9, 17, 2, 7, 5],
+ },
+ ],
+ xaxis: {
+ type: 'datetime',
+ categories: [
+ '1/11/2000',
+ '2/11/2000',
+ '3/11/2000',
+ '4/11/2000',
+ '5/11/2000',
+ '6/11/2000',
+ '7/11/2000',
+ '8/11/2000',
+ '9/11/2000',
+ '10/11/2000',
+ '11/11/2000',
+ '12/11/2000',
+ '1/11/2001',
+ '2/11/2001',
+ '3/11/2001',
+ '4/11/2001',
+ '5/11/2001',
+ '6/11/2001',
+ ],
+ },
+ title: {
+ text: 'Social Media',
+ align: 'left',
+ style: {
+ fontSize: '16px',
+ color: '#666',
+ },
+ },
+ fill: {
+ type: 'gradient',
+ gradient: {
+ shade: 'dark',
+ gradientToColors: ['#fa5c7c'],
+ shadeIntensity: 1,
+ type: 'horizontal',
+ opacityFrom: 1,
+ opacityTo: 1,
+ stops: [0, 100, 100, 100],
+ },
+ },
+ markers: {
+ size: 4,
+ colors: ['#ffbc00'],
+ strokeWidth: 2,
+ hover: {
+ size: 7,
+ },
+ },
+ yaxis: {
+ min: -10,
+ max: 40,
+ title: {
+ text: 'Engagement',
+ },
+ },
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ missinglineChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ zoom: {
+ enabled: false,
+ },
+ toolbar: {
+ show: false,
+ },
+ animations: {
+ enabled: false,
+ },
+ },
+ stroke: {
+ width: [5, 5, 4],
+ curve: 'straight',
+ },
+
+ series: [
+ {
+ name: 'Peter',
+ data: [5, 5, 10, 8, 7, 5, 4, null, null, null, 10, 10, 7, 8, 6, 9],
+ },
+ {
+ name: 'Johnny',
+ data: [
+ 10,
+ 15,
+ null,
+ 12,
+ null,
+ 10,
+ 12,
+ 15,
+ null,
+ null,
+ 12,
+ null,
+ 14,
+ null,
+ null,
+ null,
+ ],
+ },
+ {
+ name: 'David',
+ data: [
+ null,
+ null,
+ null,
+ null,
+ 3,
+ 4,
+ 1,
+ 3,
+ 4,
+ 6,
+ 7,
+ 9,
+ 5,
+ null,
+ null,
+ null,
+ ],
+ },
+ ],
+ colors: ['#1c84ee', '#ef5f5f', '#4ecac2'],
+ labels: [
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ '10',
+ '11',
+ '12',
+ '13',
+ '14',
+ '15',
+ '16',
+ ],
+ grid: {
+ row: {
+ colors: ['transparent', 'transparent'], // takes an array which will be repeated on columns
+ opacity: 0.2,
+ },
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ legend: {
+ offsetY: 7,
+ },
+ }
+
+ dashedlineChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ zoom: {
+ enabled: false,
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: [3, 5, 3],
+ curve: 'straight',
+ dashArray: [0, 8, 5],
+ },
+ series: [
+ {
+ name: 'Session Duration',
+ data: [45, 52, 38, 24, 33, 26, 21, 20, 6, 8, 15, 10],
+ },
+ {
+ name: 'Page Views',
+ data: [35, 41, 62, 42, 13, 18, 29, 37, 36, 51, 32, 35],
+ },
+ {
+ name: 'Total Visits',
+ data: [87, 57, 74, 99, 75, 38, 62, 47, 82, 56, 45, 47],
+ },
+ ],
+ markers: {
+ size: 0,
+ },
+ xaxis: {
+ categories: [
+ '01 Jan',
+ '02 Jan',
+ '03 Jan',
+ '04 Jan',
+ '05 Jan',
+ '06 Jan',
+ '07 Jan',
+ '08 Jan',
+ '09 Jan',
+ '10 Jan',
+ '11 Jan',
+ '12 Jan',
+ ],
+ },
+ colors: ['#1c84ee', '#ef5f5f', '#4ecac2'],
+ tooltip: {
+ y: {
+ title: {
+ formatter: function (val) {
+ if (val === 'Session Duration') return val + ' (mins)'
+ else if (val === 'Page Views') return val + ' per session'
+ return val
+ },
+ },
+ },
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ },
+ legend: {
+ offsetY: 7,
+ },
+ }
+
+ steplineChart: Partial = {
+ chart: {
+ type: 'line',
+ height: 344,
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ curve: 'stepline',
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [
+ {
+ data: [34, 44, 54, 21, 12, 43, 33, 23, 66, 66, 58],
+ },
+ ],
+ colors: ['#ff6c2f'],
+ title: {
+ text: 'Stepline Chart',
+ align: 'left',
+ },
+ markers: {
+ hover: {
+ sizeOffset: 4,
+ },
+ },
+ }
+
+ brushlineChart: Partial = {
+ series: [
+ {
+ data: generateDayWiseTimeSeries(
+ new Date('11 Feb 2017').getTime(),
+ 185,
+ {
+ min: 30,
+ max: 90,
+ }
+ ),
+ },
+ ],
+ chart: {
+ id: 'chart2',
+ type: 'line',
+ height: 230,
+ toolbar: {
+ autoSelected: 'pan',
+ show: false,
+ },
+ },
+ colors: ['#1c84ee'],
+ stroke: {
+ width: 3,
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ fill: {
+ opacity: 1,
+ },
+ markers: {
+ size: 0,
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ }
+
+ brushline2Chart: Partial = {
+ series: [
+ {
+ data: generateDayWiseTimeSeries(
+ new Date('11 Feb 2017').getTime(),
+ 185,
+ {
+ min: 30,
+ max: 90,
+ }
+ ),
+ },
+ ],
+ chart: {
+ id: 'chart1',
+ height: 130,
+ type: 'area',
+ toolbar: {
+ show: false,
+ },
+ brush: {
+ target: 'chart2',
+ enabled: true,
+ },
+ selection: {
+ enabled: true,
+ xaxis: {
+ min: new Date('19 Jun 2017').getTime(),
+ max: new Date('14 Aug 2017').getTime(),
+ },
+ },
+ },
+ colors: ['#1c84ee'],
+ fill: {
+ type: 'gradient',
+ gradient: {
+ opacityFrom: 0.91,
+ opacityTo: 0.1,
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ tooltip: {
+ enabled: false,
+ },
+ },
+ yaxis: {
+ tickAmount: 2,
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/mixed/mixed.component.html b/apiferia/src/app/views/charts/mixed/mixed.component.html
new file mode 100644
index 00000000..781f5297
--- /dev/null
+++ b/apiferia/src/app/views/charts/mixed/mixed.component.html
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/mixed.component.ts
+
+
+
+
+
+
+
+ Line & Column Chart
+
+
+
+
+
+
+
+
+
+ Multiple Y-Axis Chart
+
+
+
+
+
+
+
+
+
+
+
+ Line, Column & Area Chart
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/mixed/mixed.component.spec.ts b/apiferia/src/app/views/charts/mixed/mixed.component.spec.ts
new file mode 100644
index 00000000..f923dd1a
--- /dev/null
+++ b/apiferia/src/app/views/charts/mixed/mixed.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { MixedComponent } from './mixed.component'
+
+describe('MixedComponent', () => {
+ let component: MixedComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [MixedComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(MixedComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/mixed/mixed.component.ts b/apiferia/src/app/views/charts/mixed/mixed.component.ts
new file mode 100644
index 00000000..17c74a36
--- /dev/null
+++ b/apiferia/src/app/views/charts/mixed/mixed.component.ts
@@ -0,0 +1,395 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-mixed',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './mixed.component.html',
+ styles: ``,
+})
+export class MixedComponent {
+ lineMixedChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ toolbar: {
+ show: false,
+ },
+ },
+ series: [
+ {
+ name: 'Website Blog',
+ type: 'column',
+ data: [440, 505, 414, 671, 227, 413, 201, 352, 752, 320, 257, 160],
+ },
+ {
+ name: 'Social Media',
+ type: 'line',
+ data: [23, 42, 35, 27, 43, 22, 17, 31, 22, 22, 12, 16],
+ },
+ ],
+ stroke: {
+ width: [0, 4],
+ },
+ labels: [
+ '01 Jan 2001',
+ '02 Jan 2001',
+ '03 Jan 2001',
+ '04 Jan 2001',
+ '05 Jan 2001',
+ '06 Jan 2001',
+ '07 Jan 2001',
+ '08 Jan 2001',
+ '09 Jan 2001',
+ '10 Jan 2001',
+ '11 Jan 2001',
+ '12 Jan 2001',
+ ],
+ xaxis: {
+ type: 'datetime',
+ },
+ colors: ['#1c84ee', '#4ecac2'],
+ yaxis: [
+ {
+ title: {
+ text: 'Website Blog',
+ },
+ },
+ {
+ opposite: true,
+ title: {
+ text: 'Social Media',
+ },
+ },
+ ],
+ legend: {
+ offsetY: 7,
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ }
+
+ multipleMixedChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ stacked: false,
+ toolbar: {
+ show: false,
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ stroke: {
+ width: [0, 0, 3],
+ },
+ series: [
+ {
+ name: 'Income',
+ type: 'column',
+ data: [1.4, 2, 2.5, 1.5, 2.5, 2.8, 3.8, 4.6],
+ },
+ {
+ name: 'Cashflow',
+ type: 'column',
+ data: [1.1, 3, 3.1, 4, 4.1, 4.9, 6.5, 8.5],
+ },
+ {
+ name: 'Revenue',
+ type: 'line',
+ data: [20, 29, 37, 36, 44, 45, 50, 58],
+ },
+ ],
+ colors: ['#1c84ee', '#4ecac2', '#f9b931'],
+ xaxis: {
+ categories: [2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016],
+ },
+ yaxis: [
+ {
+ axisTicks: {
+ show: true,
+ },
+ axisBorder: {
+ show: true,
+ color: '#727cf5',
+ },
+ labels: {
+ // style: {
+ // color: '#727cf5',
+ // },
+ },
+ title: {
+ text: 'Income (thousand crores)',
+ },
+ },
+
+ {
+ axisTicks: {
+ show: true,
+ },
+ axisBorder: {
+ show: true,
+ color: '#4ecac2',
+ },
+ labels: {
+ style: {
+ colors: '#39afd1',
+ },
+ offsetX: 10,
+ },
+ title: {
+ text: 'Operating Cashflow (thousand crores)',
+ },
+ },
+ {
+ opposite: true,
+ axisTicks: {
+ show: true,
+ },
+ axisBorder: {
+ show: true,
+ color: '#fa5c7c',
+ },
+ labels: {
+ style: {
+ colors: '#fa5c7c',
+ },
+ },
+ title: {
+ text: 'Revenue (thousand crores)',
+ },
+ },
+ ],
+ tooltip: {
+ followCursor: true,
+ y: {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return y + ' thousand crores'
+ }
+ return y
+ },
+ },
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ legend: {
+ offsetY: 7,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ yaxis: {
+ show: false,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ lineareaChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ curve: 'smooth',
+ width: 2,
+ },
+ series: [
+ {
+ name: 'Team A',
+ type: 'area',
+ data: [44, 55, 31, 47, 31, 43, 26, 41, 31, 47, 33],
+ },
+ {
+ name: 'Team B',
+ type: 'line',
+ data: [55, 69, 45, 61, 43, 54, 37, 52, 44, 61, 43],
+ },
+ ],
+ fill: {
+ type: 'solid',
+ opacity: [0.35, 1],
+ },
+ labels: [
+ 'Dec 01',
+ 'Dec 02',
+ 'Dec 03',
+ 'Dec 04',
+ 'Dec 05',
+ 'Dec 06',
+ 'Dec 07',
+ 'Dec 08',
+ 'Dec 09 ',
+ 'Dec 10',
+ 'Dec 11',
+ ],
+ markers: {
+ size: 0,
+ },
+ legend: {
+ offsetY: 7,
+ },
+ colors: ['#4ecac2', '#1c84ee'],
+
+ yaxis: [
+ {
+ title: {
+ text: 'Series A',
+ },
+ },
+ {
+ opposite: true,
+ title: {
+ text: 'Series B',
+ },
+ },
+ ],
+ tooltip: {
+ shared: true,
+ intersect: false,
+ y: {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return y.toFixed(0) + ' points'
+ }
+ return y
+ },
+ },
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ yaxis: {
+ show: false,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ linecolumnareaChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'line',
+ stacked: false,
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ width: [0, 2, 4],
+ curve: 'smooth',
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '50%',
+ },
+ },
+ colors: ['#4ecac2', '#f9b931', '#ff6c2f'],
+ series: [
+ {
+ name: 'Team A',
+ type: 'column',
+ data: [23, 11, 22, 27, 13, 22, 37, 21, 44, 22, 30],
+ },
+ {
+ name: 'Team B',
+ type: 'area',
+ data: [44, 55, 41, 67, 22, 43, 21, 41, 56, 27, 43],
+ },
+ {
+ name: 'Team C',
+ type: 'line',
+ data: [30, 25, 36, 30, 45, 35, 64, 52, 59, 36, 39],
+ },
+ ],
+ fill: {
+ opacity: [0.85, 0.25, 1],
+ gradient: {
+ inverseColors: false,
+ shade: 'light',
+ type: 'vertical',
+ opacityFrom: 0.85,
+ opacityTo: 0.55,
+ stops: [0, 100, 100, 100],
+ },
+ },
+ labels: [
+ '01/01/2003',
+ '02/01/2003',
+ '03/01/2003',
+ '04/01/2003',
+ '05/01/2003',
+ '06/01/2003',
+ '07/01/2003',
+ '08/01/2003',
+ '09/01/2003',
+ '10/01/2003',
+ '11/01/2003',
+ ],
+ markers: {
+ size: 0,
+ },
+ legend: {
+ offsetY: 7,
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ yaxis: {
+ title: {
+ text: 'Points',
+ },
+ },
+ tooltip: {
+ shared: true,
+ intersect: false,
+ y: {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return y.toFixed(0) + ' points'
+ }
+ return y
+ },
+ },
+ },
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/pie/pie.component.html b/apiferia/src/app/views/charts/pie/pie.component.html
new file mode 100644
index 00000000..323d126e
--- /dev/null
+++ b/apiferia/src/app/views/charts/pie/pie.component.html
@@ -0,0 +1,201 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/pie.component.ts
+
+
+
+
+
+
+
+
+
+ Simple Donut Chart
+
+
+
+
+
+
+
+
+
+ Monochrome Pie Chart
+
+
+
+
+
+
+
+
+
+ Gradient Donut Chart
+
+
+
+
+
+
+
+
+
+ Patterned Donut Chart
+
+
+
+
+
+
+
+
+
+ Pie Chart with Image fill
+
+
+
+
+
+
+
+
+
Donut Update
+
+
+
+
+ RANDOMIZE
+
+ ADD
+
+ REMOVE
+
+ RESET
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/pie/pie.component.spec.ts b/apiferia/src/app/views/charts/pie/pie.component.spec.ts
new file mode 100644
index 00000000..e2fadda0
--- /dev/null
+++ b/apiferia/src/app/views/charts/pie/pie.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { PieComponent } from './pie.component'
+
+describe('PieComponent', () => {
+ let component: PieComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [PieComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(PieComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/pie/pie.component.ts b/apiferia/src/app/views/charts/pie/pie.component.ts
new file mode 100644
index 00000000..c7ff884e
--- /dev/null
+++ b/apiferia/src/app/views/charts/pie/pie.component.ts
@@ -0,0 +1,315 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-pie',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './pie.component.html',
+ styles: ``,
+})
+export class PieComponent {
+ pieChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'pie',
+ },
+ series: [44, 55, 41, 17, 15],
+ labels: ['Series 1', 'Series 2', 'Series 3', 'Series 4', 'Series 5'],
+ colors: ['#1c84ee', '#7f56da', '#ff6c2f', '#f9b931', '#4ecac2'],
+ legend: {
+ show: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ floating: false,
+ fontSize: '14px',
+ offsetX: 0,
+ offsetY: 7,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ height: 240,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ donutChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'donut',
+ },
+ series: [44, 55, 41, 17, 15],
+ legend: {
+ show: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ floating: false,
+ fontSize: '14px',
+ offsetX: 0,
+ offsetY: 7,
+ },
+ labels: ['Series 1', 'Series 2', 'Series 3', 'Series 4', 'Series 5'],
+ colors: ['#7f56da', '#1c84ee', '#ff6c2f', '#4ecac2', '#f9b931'],
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ height: 240,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ monochromeChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'pie',
+ },
+ series: [25, 15, 44, 55, 41, 17],
+ labels: [
+ 'Monday',
+ 'Tuesday',
+ 'Wednesday',
+ 'Thursday',
+ 'Friday',
+ 'Saturday',
+ ],
+ legend: {
+ show: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ floating: false,
+ fontSize: '14px',
+ offsetX: 0,
+ offsetY: 7,
+ },
+ theme: {
+ monochrome: {
+ enabled: true,
+ },
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ height: 240,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ gradientChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'donut',
+ },
+ series: [44, 55, 41, 17, 15],
+ legend: {
+ show: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ floating: false,
+ fontSize: '14px',
+ offsetX: 0,
+ offsetY: 7,
+ },
+ labels: ['Series 1', 'Series 2', 'Series 3', 'Series 4', 'Series 5'],
+ colors: ['#7f56da', '#1c84ee', '#ff6c2f', '#4ecac2', '#f9b931'],
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ height: 240,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ fill: {
+ type: 'gradient',
+ },
+ }
+
+ patternedChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'donut',
+ dropShadow: {
+ enabled: true,
+ color: '#111',
+ top: -1,
+ left: 3,
+ blur: 3,
+ opacity: 0.2,
+ },
+ },
+ stroke: {
+ show: true,
+ width: 2,
+ },
+ series: [44, 55, 41, 17, 15],
+ colors: ['#7f56da', '#1c84ee', '#ff6c2f', '#4ecac2', '#f9b931'],
+ labels: ['Comedy', 'Action', 'SciFi', 'Drama', 'Horror'],
+ dataLabels: {
+ dropShadow: {
+ blur: 3,
+ opacity: 0.8,
+ },
+ },
+ fill: {
+ type: 'pattern',
+ opacity: 1,
+ pattern: {
+ style: [
+ 'verticalLines',
+ 'squares',
+ 'horizontalLines',
+ 'circles',
+ 'slantedLines',
+ ],
+ },
+ },
+ legend: {
+ show: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ floating: false,
+ fontSize: '14px',
+ offsetX: 0,
+ offsetY: 7,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ height: 240,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ imagePieChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'pie',
+ },
+ labels: ['Series 1', 'Series 2', 'Series 3', 'Series 4'],
+ colors: ['#7f56da', '#1c84ee', '#ff6c2f', '#4ecac2', '#f9b931'],
+ series: [44, 33, 54, 45],
+ fill: {
+ type: 'image',
+ opacity: 0.85,
+ image: {
+ src: [
+ 'assets/images/small/img-1.jpg',
+ 'assets/images/small/img-2.jpg',
+ 'assets/images/small/img-3.jpg',
+ 'assets/images/small/img-4.jpg',
+ ],
+ width: 25,
+ },
+ },
+ stroke: {
+ width: 4,
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ legend: {
+ show: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ floating: false,
+ fontSize: '14px',
+ offsetX: 0,
+ offsetY: 7,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ height: 240,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ updatedonutChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'donut',
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ series: [44, 55, 13, 33],
+ colors: [
+ '#1c84ee',
+ '#53389f',
+ '#7f56da',
+ '#ff86c8',
+ '#ef5f5f',
+ '#ff6c2f',
+ '#f9b931',
+ '#22c55e',
+ '#040505',
+ '#4ecac2',
+ ],
+ legend: {
+ show: true,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ floating: false,
+ fontSize: '14px',
+ offsetX: 0,
+ offsetY: 7,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ height: 240,
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+}
diff --git a/apiferia/src/app/views/charts/polar/polar.component.html b/apiferia/src/app/views/charts/polar/polar.component.html
new file mode 100644
index 00000000..6173daa9
--- /dev/null
+++ b/apiferia/src/app/views/charts/polar/polar.component.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/polar.component.ts
+
+
+
+
+
+
+
+ Basic Polar Area Chart
+
+
+
+
+
+
+
+
+
+ Monochrome Polar Area
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/polar/polar.component.spec.ts b/apiferia/src/app/views/charts/polar/polar.component.spec.ts
new file mode 100644
index 00000000..466d8c02
--- /dev/null
+++ b/apiferia/src/app/views/charts/polar/polar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { PolarComponent } from './polar.component'
+
+describe('PolarComponent', () => {
+ let component: PolarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [PolarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(PolarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/polar/polar.component.ts b/apiferia/src/app/views/charts/polar/polar.component.ts
new file mode 100644
index 00000000..6839144c
--- /dev/null
+++ b/apiferia/src/app/views/charts/polar/polar.component.ts
@@ -0,0 +1,88 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-polar',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './polar.component.html',
+ styles: ``,
+})
+export class PolarComponent {
+ basicPolarChart: Partial = {
+ series: [14, 23, 21, 17, 15, 10],
+ chart: {
+ height: 380,
+ type: 'polarArea',
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ colors: ['#fff'],
+ },
+ fill: {
+ opacity: 0.8,
+ },
+ labels: ['Vote A', 'Vote B', 'Vote C', 'Vote D', 'Vote E', 'Vote F'],
+ legend: {
+ position: 'bottom',
+ },
+ colors: ['#1c84ee', '#f9b931', '#4ecac2'],
+ responsive: [
+ {
+ breakpoint: 480,
+ options: {
+ chart: {
+ width: 200,
+ },
+ legend: {
+ position: 'bottom',
+ },
+ },
+ },
+ ],
+ }
+
+ monochromePolarChart: Partial = {
+ series: [42, 47, 52, 58, 65],
+ chart: {
+ height: 380,
+ type: 'polarArea',
+ },
+ labels: ['Rose A', 'Rose B', 'Rose C', 'Rose D', 'Rose E'],
+ fill: {
+ opacity: 1,
+ },
+ stroke: {
+ width: 1,
+ },
+ yaxis: {
+ show: false,
+ },
+ legend: {
+ position: 'bottom',
+ },
+ plotOptions: {
+ polarArea: {
+ rings: {
+ strokeWidth: 0,
+ },
+ spokes: {
+ strokeWidth: 0,
+ },
+ },
+ },
+ theme: {
+ monochrome: {
+ enabled: true,
+ shadeTo: 'light',
+ color: '#727cf5',
+ shadeIntensity: 0.6,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/radar/radar.component.html b/apiferia/src/app/views/charts/radar/radar.component.html
new file mode 100644
index 00000000..443f5316
--- /dev/null
+++ b/apiferia/src/app/views/charts/radar/radar.component.html
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/radar.component.ts
+
+
+
+
+
+
+
+
+
+ Radar with Polygon-fill
+
+
+
+
+
+
+
+
+
+ Radar – Multiple Series
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/radar/radar.component.spec.ts b/apiferia/src/app/views/charts/radar/radar.component.spec.ts
new file mode 100644
index 00000000..45554e1b
--- /dev/null
+++ b/apiferia/src/app/views/charts/radar/radar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { RadarComponent } from './radar.component'
+
+describe('RadarComponent', () => {
+ let component: RadarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [RadarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(RadarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/radar/radar.component.ts b/apiferia/src/app/views/charts/radar/radar.component.ts
new file mode 100644
index 00000000..ff985824
--- /dev/null
+++ b/apiferia/src/app/views/charts/radar/radar.component.ts
@@ -0,0 +1,138 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { shuffleArray } from '@/app/components/commonFunction'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-radar',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './radar.component.html',
+ styles: ``,
+})
+export class RadarComponent {
+ radarChart: Partial = {
+ chart: {
+ height: 350,
+ type: 'radar',
+ toolbar: {
+ show: false,
+ },
+ },
+ series: [
+ {
+ name: 'Series 1',
+ data: [80, 50, 30, 40, 100, 20],
+ },
+ ],
+ colors: ['#7f56da'],
+ labels: ['January', 'February', 'March', 'April', 'May', 'June'],
+ }
+
+ polygonradarChart: Partial = {
+ chart: {
+ height: 350,
+ type: 'radar',
+ toolbar: {
+ show: false,
+ },
+ },
+ series: [
+ {
+ name: 'Series 1',
+ data: [20, 100, 40, 30, 50, 80, 33],
+ },
+ ],
+ labels: [
+ 'Sunday',
+ 'Monday',
+ 'Tuesday',
+ 'Wednesday',
+ 'Thursday',
+ 'Friday',
+ 'Saturday',
+ ],
+ plotOptions: {
+ radar: {
+ size: 140,
+ },
+ },
+ colors: ['#ff6c2f'],
+ markers: {
+ size: 4,
+ colors: ['#fff'],
+ strokeWidth: 2,
+ },
+ yaxis: {
+ tickAmount: 7,
+ },
+ }
+
+ multipleradarChart: Partial = {
+ chart: {
+ height: 350,
+ type: 'radar',
+ toolbar: {
+ show: false,
+ },
+ },
+ series: [
+ {
+ name: 'Series 1',
+ data: [80, 50, 30, 40, 100, 20],
+ },
+ {
+ name: 'Series 2',
+ data: [20, 30, 40, 80, 20, 80],
+ },
+ {
+ name: 'Series 3',
+ data: [44, 76, 78, 13, 43, 10],
+ },
+ ],
+ stroke: {
+ width: 0,
+ },
+ fill: {
+ opacity: 0.4,
+ },
+ markers: {
+ size: 0,
+ },
+ legend: {
+ offsetY: -10,
+ },
+ colors: ['#1c84ee', '#ef5f5f', '#4ecac2'],
+ labels: ['2011', '2012', '2013', '2014', '2015', '2016'],
+ }
+
+ changeTraffic() {
+ setTimeout(() => {
+ this.multipleradarChart.series = [
+ {
+ name: 'Series 1',
+ data: randomSeries(),
+ },
+ {
+ name: 'Series 2',
+ data: randomSeries(),
+ },
+ {
+ name: 'Series 3',
+ data: randomSeries(),
+ },
+ ]
+ }, 500)
+ }
+}
+
+function randomSeries() {
+ var arr = []
+ for (var i = 0; i < 6; i++) {
+ arr.push(Math.floor(Math.random() * 100))
+ }
+
+ return arr
+}
diff --git a/apiferia/src/app/views/charts/radial-bar/radial-bar.component.html b/apiferia/src/app/views/charts/radial-bar/radial-bar.component.html
new file mode 100644
index 00000000..6deb456c
--- /dev/null
+++ b/apiferia/src/app/views/charts/radial-bar/radial-bar.component.html
@@ -0,0 +1,190 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/radial-bar.component.ts
+
+
+
+
+
+
+
Basic RadialBar Chart
+
+
+
+
+
+
+
+
+ Multiple RadialBars
+
+
+
+
+
+
+
+
+
+ Circle Chart - Custom Angle
+
+
+
+
+
+
+
+
+
+ Circle Chart with Image
+
+
+
+
+
+
+
+
+
+ Stroked Circular Gauge
+
+
+
+
+
+
+
+
+
+ Gradient Circular Chart
+
+
+
+
+
+
+
+
+
+ Semi Circle Gauge
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/radial-bar/radial-bar.component.spec.ts b/apiferia/src/app/views/charts/radial-bar/radial-bar.component.spec.ts
new file mode 100644
index 00000000..22fc1687
--- /dev/null
+++ b/apiferia/src/app/views/charts/radial-bar/radial-bar.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { RadialBarComponent } from './radial-bar.component'
+
+describe('RadialBarComponent', () => {
+ let component: RadialBarComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [RadialBarComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(RadialBarComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/radial-bar/radial-bar.component.ts b/apiferia/src/app/views/charts/radial-bar/radial-bar.component.ts
new file mode 100644
index 00000000..71ea284b
--- /dev/null
+++ b/apiferia/src/app/views/charts/radial-bar/radial-bar.component.ts
@@ -0,0 +1,339 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-radial-bar',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './radial-bar.component.html',
+ styles: ``,
+})
+export class RadialBarComponent {
+ radialbarChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'radialBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ radialBar: {
+ hollow: {
+ size: '70%',
+ },
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ },
+ },
+ },
+ colors: ['#7f56da'],
+ series: [70],
+ labels: ['CRICKET'],
+ }
+
+ multipleradialbarChart: Partial = {
+ chart: {
+ height: 320,
+ type: 'radialBar',
+ },
+ plotOptions: {
+ radialBar: {
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ },
+ },
+ },
+ colors: ['#1c84ee', '#7f56da', '#ff6c2f', '#4ecac2'],
+ series: [44, 55, 67, 83],
+ labels: ['Apples', 'Oranges', 'Bananas', 'Berries'],
+ responsive: [
+ {
+ breakpoint: 380,
+ options: {
+ chart: {
+ height: 260,
+ },
+ },
+ },
+ ],
+ }
+
+ circleradialbarChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'radialBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ radialBar: {
+ offsetY: -30,
+ startAngle: 0,
+ endAngle: 270,
+ hollow: {
+ margin: 5,
+ size: '30%',
+ background: 'transparent',
+ image: undefined,
+ },
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ },
+ dataLabels: {
+ name: {
+ show: false,
+ },
+ value: {
+ show: false,
+ },
+ },
+ },
+ },
+ colors: ['#1c84ee', '#7f56da', '#ff6c2f', '#4ecac2'],
+ series: [76, 67, 61, 90],
+ labels: ['Vimeo', 'Messenger', 'Facebook', 'LinkedIn'],
+ legend: {
+ show: true,
+ floating: true,
+ fontSize: '13px',
+ position: 'left',
+ offsetX: 10,
+ offsetY: 10,
+ labels: {
+ useSeriesColors: true,
+ },
+ formatter: function (seriesName, opts) {
+ return seriesName + ': ' + opts.w.globals.series[opts.seriesIndex]
+ },
+ itemMargin: {
+ horizontal: 1,
+ },
+ },
+ responsive: [
+ {
+ breakpoint: 480,
+ options: {
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ imageradialbarChart: Partial = {
+ chart: {
+ height: 360,
+ type: 'radialBar',
+ },
+ fill: {
+ type: 'image',
+ image: {
+ src: ['assets/images/small/img-2.jpg'],
+ },
+ },
+ plotOptions: {
+ radialBar: {
+ hollow: {
+ size: '70%',
+ },
+ },
+ },
+ series: [70],
+ stroke: {
+ lineCap: 'round',
+ },
+ labels: ['Volatility'],
+ responsive: [
+ {
+ breakpoint: 380,
+ options: {
+ chart: {
+ height: 280,
+ },
+ },
+ },
+ ],
+ }
+
+ guageradialbarChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'radialBar',
+ },
+ plotOptions: {
+ radialBar: {
+ startAngle: -135,
+ endAngle: 135,
+ dataLabels: {
+ name: {
+ fontSize: '16px',
+ color: undefined,
+ offsetY: 120,
+ },
+ value: {
+ offsetY: 76,
+ fontSize: '22px',
+ color: undefined,
+ formatter: function (val) {
+ return val + '%'
+ },
+ },
+ },
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ margin: 0,
+ },
+ },
+ },
+ fill: {
+ gradient: {
+ shade: 'dark',
+ shadeIntensity: 0.2,
+ inverseColors: false,
+ opacityFrom: 1,
+ opacityTo: 1,
+ stops: [0, 50, 65, 91],
+ },
+ },
+ stroke: {
+ dashArray: 4,
+ },
+ colors: ['#ff6c2f'],
+ series: [67],
+ labels: ['Median Ratio'],
+ responsive: [
+ {
+ breakpoint: 380,
+ options: {
+ chart: {
+ height: 280,
+ },
+ },
+ },
+ ],
+ }
+
+ gradientradialbarChart: Partial = {
+ chart: {
+ height: 330,
+ type: 'radialBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ radialBar: {
+ startAngle: -135,
+ endAngle: 225,
+ hollow: {
+ margin: 0,
+ size: '70%',
+ background: 'transparent',
+ image: undefined,
+ imageOffsetX: 0,
+ imageOffsetY: 0,
+ position: 'front',
+ dropShadow: {
+ enabled: true,
+ top: 3,
+ left: 0,
+ blur: 4,
+ opacity: 0.24,
+ },
+ },
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ strokeWidth: '67%',
+ margin: 0,
+ },
+
+ dataLabels: {
+ name: {
+ offsetY: -10,
+ show: true,
+ color: '#888',
+ fontSize: '17px',
+ },
+ value: {
+ color: '#111',
+ fontSize: '36px',
+ show: true,
+ },
+ },
+ },
+ },
+ fill: {
+ type: 'gradient',
+ gradient: {
+ shade: 'dark',
+ type: 'horizontal',
+ shadeIntensity: 0.5,
+ gradientToColors: ['#8f75da', '#727cf5'],
+ inverseColors: true,
+ opacityFrom: 1,
+ opacityTo: 1,
+ stops: [0, 100],
+ },
+ },
+ series: [75],
+ stroke: {
+ lineCap: 'round',
+ },
+ labels: ['Percent'],
+ }
+
+ semicircleQuageChart: Partial = {
+ series: [76],
+ chart: {
+ type: 'radialBar',
+ offsetY: -20,
+ height: 400,
+ toolbar: {
+ show: false,
+ },
+ sparkline: {
+ enabled: true,
+ },
+ },
+ plotOptions: {
+ radialBar: {
+ startAngle: -90,
+ endAngle: 90,
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ strokeWidth: '97%',
+ margin: 5, // margin is in pixels
+ dropShadow: {
+ top: 2,
+ left: 0,
+ color: '#727cf5',
+ opacity: 1,
+ blur: 2,
+ },
+ },
+ dataLabels: {
+ name: {
+ show: false,
+ },
+ value: {
+ offsetY: -2,
+ fontSize: '22px',
+ },
+ },
+ },
+ },
+ grid: {
+ padding: {
+ top: -10,
+ },
+ },
+ colors: ['#1c84ee'],
+ labels: ['Average Results'],
+ }
+}
diff --git a/apiferia/src/app/views/charts/scatter/scatter.component.html b/apiferia/src/app/views/charts/scatter/scatter.component.html
new file mode 100644
index 00000000..24cf7a15
--- /dev/null
+++ b/apiferia/src/app/views/charts/scatter/scatter.component.html
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
Overview
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/scatter.component.ts
+
+
+
+
+
+
+
+
+
+ Scatter Chart - Datetime
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/scatter/scatter.component.spec.ts b/apiferia/src/app/views/charts/scatter/scatter.component.spec.ts
new file mode 100644
index 00000000..155e214a
--- /dev/null
+++ b/apiferia/src/app/views/charts/scatter/scatter.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ScatterComponent } from './scatter.component'
+
+describe('ScatterComponent', () => {
+ let component: ScatterComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ScatterComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ScatterComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/scatter/scatter.component.ts b/apiferia/src/app/views/charts/scatter/scatter.component.ts
new file mode 100644
index 00000000..95b310f7
--- /dev/null
+++ b/apiferia/src/app/views/charts/scatter/scatter.component.ts
@@ -0,0 +1,380 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-scatter',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './scatter.component.html',
+ styles: ``,
+})
+export class ScatterComponent {
+ basicscatterChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'scatter',
+ zoom: {
+ enabled: false,
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+
+ series: [
+ {
+ name: 'Sample A',
+ data: [
+ [16.4, 5.4],
+ [21.7, 2],
+ [25.4, 3],
+ [19, 2],
+ [10.9, 1],
+ [13.6, 3.2],
+ [10.9, 7.4],
+ [10.9, 0],
+ [10.9, 8.2],
+ [16.4, 0],
+ [16.4, 1.8],
+ [13.6, 0.3],
+ [13.6, 0],
+ [29.9, 0],
+ [27.1, 2.3],
+ [16.4, 0],
+ [13.6, 3.7],
+ [10.9, 5.2],
+ [16.4, 6.5],
+ [10.9, 0],
+ [24.5, 7.1],
+ [10.9, 0],
+ [8.1, 4.7],
+ [19, 0],
+ [21.7, 1.8],
+ [27.1, 0],
+ [24.5, 0],
+ [27.1, 0],
+ [29.9, 1.5],
+ [27.1, 0.8],
+ [22.1, 2],
+ ],
+ },
+ {
+ name: 'Sample B',
+ data: [
+ [6.4, 13.4],
+ [1.7, 11],
+ [5.4, 8],
+ [9, 17],
+ [1.9, 4],
+ [3.6, 12.2],
+ [1.9, 14.4],
+ [1.9, 9],
+ [1.9, 13.2],
+ [1.4, 7],
+ [6.4, 8.8],
+ [3.6, 4.3],
+ [1.6, 10],
+ [9.9, 2],
+ [7.1, 15],
+ [1.4, 0],
+ [3.6, 13.7],
+ [1.9, 15.2],
+ [6.4, 16.5],
+ [0.9, 10],
+ [4.5, 17.1],
+ [10.9, 10],
+ [0.1, 14.7],
+ [9, 10],
+ [12.7, 11.8],
+ [2.1, 10],
+ [2.5, 10],
+ [27.1, 10],
+ [2.9, 11.5],
+ [7.1, 10.8],
+ [2.1, 12],
+ ],
+ },
+ {
+ name: 'Sample C',
+ data: [
+ [21.7, 3],
+ [23.6, 3.5],
+ [24.6, 3],
+ [29.9, 3],
+ [21.7, 20],
+ [23, 2],
+ [10.9, 3],
+ [28, 4],
+ [27.1, 0.3],
+ [16.4, 4],
+ [13.6, 0],
+ [19, 5],
+ [22.4, 3],
+ [24.5, 3],
+ [32.6, 3],
+ [27.1, 4],
+ [29.6, 6],
+ [31.6, 8],
+ [21.6, 5],
+ [20.9, 4],
+ [22.4, 0],
+ [32.6, 10.3],
+ [29.7, 20.8],
+ [24.5, 0.8],
+ [21.4, 0],
+ [21.7, 6.9],
+ [28.6, 7.7],
+ [15.4, 0],
+ [18.1, 0],
+ [33.4, 0],
+ [16.4, 0],
+ ],
+ },
+ ],
+ xaxis: {
+ tickAmount: 10,
+ },
+ yaxis: {
+ tickAmount: 7,
+ },
+ colors: ['#1c84ee', '#f9b931', '#4ecac2'],
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ legend: {
+ offsetY: 7,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ datetimescatterChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'scatter',
+ zoom: {
+ type: 'xy',
+ },
+ },
+ series: [
+ {
+ name: 'Team 1',
+ data: this.generateDayWiseTimeSeries(
+ new Date('11 Feb 2017 GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ {
+ name: 'Team 2',
+ data: this.generateDayWiseTimeSeries(
+ new Date('11 Feb 2017 GMT').getTime(),
+ 20,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ {
+ name: 'Team 3',
+ data: this.generateDayWiseTimeSeries(
+ new Date('11 Feb 2017 GMT').getTime(),
+ 30,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ {
+ name: 'Team 4',
+ data: this.generateDayWiseTimeSeries(
+ new Date('11 Feb 2017 GMT').getTime(),
+ 10,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ {
+ name: 'Team 5',
+ data: this.generateDayWiseTimeSeries(
+ new Date('11 Feb 2017 GMT').getTime(),
+ 30,
+ {
+ min: 10,
+ max: 60,
+ }
+ ),
+ },
+ ],
+ dataLabels: {
+ enabled: false,
+ },
+ colors: ['#1c84ee', '#7f56da', '#ef5f5f', '#f9b931', '#22c55e'],
+ grid: {
+ borderColor: '#f1f3fa',
+ padding: {
+ bottom: 5,
+ },
+ },
+ legend: {
+ offsetY: 10,
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ yaxis: {
+ max: 70,
+ },
+ responsive: [
+ {
+ breakpoint: 600,
+ options: {
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ },
+ },
+ ],
+ }
+
+ generateDayWiseTimeSeries(
+ baseval: number,
+ count: number,
+ yrange: { min: number; max: number }
+ ) {
+ var i = 0
+ var series = []
+ while (i < count) {
+ var y =
+ Math.floor(Math.random() * (yrange.max - yrange.min + 1)) + yrange.min
+
+ series.push([baseval, y])
+ baseval += 86400000
+ i++
+ }
+ return series
+ }
+
+ imagescatterChart: Partial = {
+ chart: {
+ height: 380,
+ type: 'scatter',
+ animations: {
+ enabled: false,
+ },
+ zoom: {
+ enabled: false,
+ },
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#3b5998', '#e1306c'],
+ series: [
+ {
+ name: 'Dribbble',
+ data: [
+ [16.4, 5.4],
+ [21.7, 4],
+ [25.4, 3],
+ [19, 2],
+ [10.9, 1],
+ [13.6, 3.2],
+ [10.9, 7],
+ [10.9, 8.2],
+ [16.4, 4],
+ [13.6, 4.3],
+ [13.6, 12],
+ [29.9, 3],
+ [10.9, 5.2],
+ [16.4, 6.5],
+ [10.9, 8],
+ [24.5, 7.1],
+ [10.9, 7],
+ [8.1, 4.7],
+ [19, 10],
+ [27.1, 10],
+ [24.5, 8],
+ [27.1, 3],
+ [29.9, 11.5],
+ [27.1, 0.8],
+ [22.1, 2],
+ ],
+ },
+ {
+ name: 'Github',
+ data: [
+ [6.4, 5.4],
+ [11.7, 4],
+ [15.4, 3],
+ [9, 2],
+ [10.9, 11],
+ [20.9, 7],
+ [12.9, 8.2],
+ [6.4, 14],
+ [11.6, 12],
+ ],
+ },
+ ],
+ xaxis: {
+ tickAmount: 10,
+ min: 0,
+ max: 40,
+ },
+ yaxis: {
+ tickAmount: 7,
+ },
+ markers: {
+ size: 20,
+ },
+ fill: {
+ type: 'image',
+ opacity: 1,
+ image: {
+ src: [
+ 'assets/images/brands/dribbble.svg',
+ 'assets/images/brands/github.svg',
+ ],
+ width: 40,
+ height: 40,
+ },
+ },
+ legend: {
+ labels: {
+ useSeriesColors: true,
+ },
+ offsetY: 7,
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/timeline/timeline.component.html b/apiferia/src/app/views/charts/timeline/timeline.component.html
new file mode 100644
index 00000000..216bde72
--- /dev/null
+++ b/apiferia/src/app/views/charts/timeline/timeline.component.html
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/timeline.component.ts
+
+
+
+
+
+
+
+
+
+ Distributed Timeline
+
+
+
+
+
+
+
+
+
+ Multi Series Timeline
+
+
+
+
+
+
+
+
+
+
+
+
+ Multiple Series - Group Rows
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/timeline/timeline.component.spec.ts b/apiferia/src/app/views/charts/timeline/timeline.component.spec.ts
new file mode 100644
index 00000000..525f8794
--- /dev/null
+++ b/apiferia/src/app/views/charts/timeline/timeline.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { TimelineComponent } from './timeline.component'
+
+describe('TimelineComponent', () => {
+ let component: TimelineComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [TimelineComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(TimelineComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/timeline/timeline.component.ts b/apiferia/src/app/views/charts/timeline/timeline.component.ts
new file mode 100644
index 00000000..6e63b876
--- /dev/null
+++ b/apiferia/src/app/views/charts/timeline/timeline.component.ts
@@ -0,0 +1,619 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import moment from 'moment'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-timeline',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './timeline.component.html',
+ styles: ``,
+})
+export class TimelineComponent {
+ timelineChart: Partial = {
+ series: [
+ {
+ data: [
+ {
+ x: 'Code',
+ y: [
+ new Date('2019-03-02').getTime(),
+ new Date('2019-03-04').getTime(),
+ ],
+ },
+ {
+ x: 'Test',
+ y: [
+ new Date('2019-03-04').getTime(),
+ new Date('2019-03-08').getTime(),
+ ],
+ },
+ {
+ x: 'Validation',
+ y: [
+ new Date('2019-03-08').getTime(),
+ new Date('2019-03-12').getTime(),
+ ],
+ },
+ {
+ x: 'Deployment',
+ y: [
+ new Date('2019-03-12').getTime(),
+ new Date('2019-03-18').getTime(),
+ ],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 350,
+ type: 'rangeBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#4ecac2'],
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ axisBorder: {
+ show: false,
+ },
+ },
+ }
+
+ distributedChart: Partial = {
+ series: [
+ {
+ data: [
+ {
+ x: 'Analysis',
+ y: [
+ new Date('2019-02-27').getTime(),
+ new Date('2019-03-04').getTime(),
+ ],
+ fillColor: '#1c84ee',
+ },
+ {
+ x: 'Design',
+ y: [
+ new Date('2019-03-04').getTime(),
+ new Date('2019-03-08').getTime(),
+ ],
+ fillColor: '#7f56da',
+ },
+ {
+ x: 'Coding',
+ y: [
+ new Date('2019-03-07').getTime(),
+ new Date('2019-03-10').getTime(),
+ ],
+ fillColor: '#ff86c8',
+ },
+ {
+ x: 'Testing',
+ y: [
+ new Date('2019-03-08').getTime(),
+ new Date('2019-03-12').getTime(),
+ ],
+ fillColor: '#f9b931',
+ },
+ {
+ x: 'Deployment',
+ y: [
+ new Date('2019-03-12').getTime(),
+ new Date('2019-03-17').getTime(),
+ ],
+ fillColor: '#4ecac2',
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 350,
+ type: 'rangeBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ distributed: true,
+ dataLabels: {
+ hideOverflowingLabels: false,
+ },
+ },
+ },
+ dataLabels: {
+ enabled: true,
+ formatter: function (val: any, opts: any) {
+ var label = opts.w.globals.labels[opts.dataPointIndex]
+ var a = moment(val[0])
+ var b = moment(val[1])
+ var diff = b.diff(a, 'days')
+ return label + ': ' + diff + (diff > 1 ? ' days' : ' day')
+ },
+
+ style: {
+ colors: ['#f3f4f5', '#fff'],
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ yaxis: {
+ show: false,
+ },
+ grid: {
+ row: {
+ colors: ['#f3f4f5', '#fff'],
+ opacity: 1,
+ },
+ padding: {
+ top: -15,
+ right: 10,
+ bottom: -15,
+ left: -10,
+ },
+ },
+ }
+
+ multitimelineChart: Partial = {
+ series: [
+ {
+ name: 'Bob',
+ data: [
+ {
+ x: 'Design',
+ y: [
+ new Date('2019-03-05').getTime(),
+ new Date('2019-03-08').getTime(),
+ ],
+ },
+ {
+ x: 'Code',
+ y: [
+ new Date('2019-03-08').getTime(),
+ new Date('2019-03-11').getTime(),
+ ],
+ },
+ {
+ x: 'Test',
+ y: [
+ new Date('2019-03-11').getTime(),
+ new Date('2019-03-16').getTime(),
+ ],
+ },
+ ],
+ },
+ {
+ name: 'Joe',
+ data: [
+ {
+ x: 'Design',
+ y: [
+ new Date('2019-03-02').getTime(),
+ new Date('2019-03-05').getTime(),
+ ],
+ },
+ {
+ x: 'Code',
+ y: [
+ new Date('2019-03-06').getTime(),
+ new Date('2019-03-09').getTime(),
+ ],
+ },
+ {
+ x: 'Test',
+ y: [
+ new Date('2019-03-10').getTime(),
+ new Date('2019-03-19').getTime(),
+ ],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 350,
+ type: 'rangeBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ },
+ },
+ dataLabels: {
+ enabled: true,
+ formatter: function (val: any, opts: any) {
+ var label = opts.w.globals.labels[opts.dataPointIndex]
+ var a = moment(val[0])
+ var b = moment(val[1])
+ var diff = b.diff(a, 'days')
+ return label + ': ' + diff + (diff > 1 ? ' days' : ' day')
+ },
+ },
+
+ fill: {
+ type: 'gradient',
+ gradient: {
+ shade: 'light',
+ type: 'vertical',
+ shadeIntensity: 0.25,
+ gradientToColors: undefined,
+ inverseColors: true,
+ opacityFrom: 1,
+ opacityTo: 1,
+ stops: [50, 0, 100, 100],
+ },
+ },
+ colors: ['#ff6c2f', '#f9b931'],
+ xaxis: {
+ type: 'datetime',
+ },
+ legend: {
+ position: 'top',
+ },
+ }
+
+ advancedtimelineChart: Partial = {
+ series: [
+ {
+ name: 'Bob',
+ data: [
+ {
+ x: 'Design',
+ y: [
+ new Date('2019-03-05').getTime(),
+ new Date('2019-03-08').getTime(),
+ ],
+ },
+ {
+ x: 'Code',
+ y: [
+ new Date('2019-03-02').getTime(),
+ new Date('2019-03-05').getTime(),
+ ],
+ },
+ {
+ x: 'Code',
+ y: [
+ new Date('2019-03-05').getTime(),
+ new Date('2019-03-07').getTime(),
+ ],
+ },
+ {
+ x: 'Test',
+ y: [
+ new Date('2019-03-03').getTime(),
+ new Date('2019-03-09').getTime(),
+ ],
+ },
+ {
+ x: 'Test',
+ y: [
+ new Date('2019-03-08').getTime(),
+ new Date('2019-03-11').getTime(),
+ ],
+ },
+ {
+ x: 'Validation',
+ y: [
+ new Date('2019-03-11').getTime(),
+ new Date('2019-03-16').getTime(),
+ ],
+ },
+ {
+ x: 'Design',
+ y: [
+ new Date('2019-03-01').getTime(),
+ new Date('2019-03-03').getTime(),
+ ],
+ },
+ ],
+ },
+ {
+ name: 'Joe',
+ data: [
+ {
+ x: 'Design',
+ y: [
+ new Date('2019-03-02').getTime(),
+ new Date('2019-03-05').getTime(),
+ ],
+ },
+ {
+ x: 'Test',
+ y: [
+ new Date('2019-03-06').getTime(),
+ new Date('2019-03-16').getTime(),
+ ],
+ goals: [
+ {
+ name: 'Break',
+ value: new Date('2019-03-10').getTime(),
+ strokeColor: '#CD2F2A',
+ },
+ ],
+ },
+ {
+ x: 'Code',
+ y: [
+ new Date('2019-03-03').getTime(),
+ new Date('2019-03-07').getTime(),
+ ],
+ },
+ {
+ x: 'Deployment',
+ y: [
+ new Date('2019-03-20').getTime(),
+ new Date('2019-03-22').getTime(),
+ ],
+ },
+ {
+ x: 'Design',
+ y: [
+ new Date('2019-03-10').getTime(),
+ new Date('2019-03-16').getTime(),
+ ],
+ },
+ ],
+ },
+ {
+ name: 'Dan',
+ data: [
+ {
+ x: 'Code',
+ y: [
+ new Date('2019-03-10').getTime(),
+ new Date('2019-03-17').getTime(),
+ ],
+ },
+ {
+ x: 'Validation',
+ y: [
+ new Date('2019-03-05').getTime(),
+ new Date('2019-03-09').getTime(),
+ ],
+ goals: [
+ {
+ name: 'Break',
+ value: new Date('2019-03-07').getTime(),
+ strokeColor: '#CD2F2A',
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 350,
+ type: 'rangeBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ barHeight: '80%',
+ },
+ },
+ xaxis: {
+ type: 'datetime',
+ },
+ stroke: {
+ width: 1,
+ },
+ colors: ['#ef5f5f', '#f9b931', '#4ecac2'],
+ fill: {
+ type: 'solid',
+ opacity: 0.6,
+ },
+ legend: {
+ position: 'top',
+ horizontalAlign: 'left',
+ },
+ }
+
+ grouptimelineChart: Partial = {
+ series: [
+ // George Washington
+ {
+ name: 'George Washington',
+ data: [
+ {
+ x: 'President',
+ y: [
+ new Date(1789, 3, 30).getTime(),
+ new Date(1797, 2, 4).getTime(),
+ ],
+ },
+ ],
+ },
+ // John Adams
+ {
+ name: 'John Adams',
+ data: [
+ {
+ x: 'President',
+ y: [new Date(1797, 2, 4).getTime(), new Date(1801, 2, 4).getTime()],
+ },
+ {
+ x: 'Vice President',
+ y: [
+ new Date(1789, 3, 21).getTime(),
+ new Date(1797, 2, 4).getTime(),
+ ],
+ },
+ ],
+ },
+ // Thomas Jefferson
+ {
+ name: 'Thomas Jefferson',
+ data: [
+ {
+ x: 'President',
+ y: [new Date(1801, 2, 4).getTime(), new Date(1809, 2, 4).getTime()],
+ },
+ {
+ x: 'Vice President',
+ y: [new Date(1797, 2, 4).getTime(), new Date(1801, 2, 4).getTime()],
+ },
+ {
+ x: 'Secretary of State',
+ y: [
+ new Date(1790, 2, 22).getTime(),
+ new Date(1793, 11, 31).getTime(),
+ ],
+ },
+ ],
+ },
+ // Aaron Burr
+ {
+ name: 'Aaron Burr',
+ data: [
+ {
+ x: 'Vice President',
+ y: [new Date(1801, 2, 4).getTime(), new Date(1805, 2, 4).getTime()],
+ },
+ ],
+ },
+ // George Clinton
+ {
+ name: 'George Clinton',
+ data: [
+ {
+ x: 'Vice President',
+ y: [
+ new Date(1805, 2, 4).getTime(),
+ new Date(1812, 3, 20).getTime(),
+ ],
+ },
+ ],
+ },
+ // John Jay
+ {
+ name: 'John Jay',
+ data: [
+ {
+ x: 'Secretary of State',
+ y: [
+ new Date(1789, 8, 25).getTime(),
+ new Date(1790, 2, 22).getTime(),
+ ],
+ },
+ ],
+ },
+ // Edmund Randolph
+ {
+ name: 'Edmund Randolph',
+ data: [
+ {
+ x: 'Secretary of State',
+ y: [
+ new Date(1794, 0, 2).getTime(),
+ new Date(1795, 7, 20).getTime(),
+ ],
+ },
+ ],
+ },
+ // Timothy Pickering
+ {
+ name: 'Timothy Pickering',
+ data: [
+ {
+ x: 'Secretary of State',
+ y: [
+ new Date(1795, 7, 20).getTime(),
+ new Date(1800, 4, 12).getTime(),
+ ],
+ },
+ ],
+ },
+ // Charles Lee
+ {
+ name: 'Charles Lee',
+ data: [
+ {
+ x: 'Secretary of State',
+ y: [
+ new Date(1800, 4, 13).getTime(),
+ new Date(1800, 5, 5).getTime(),
+ ],
+ },
+ ],
+ },
+ // John Marshall
+ {
+ name: 'John Marshall',
+ data: [
+ {
+ x: 'Secretary of State',
+ y: [
+ new Date(1800, 5, 13).getTime(),
+ new Date(1801, 2, 4).getTime(),
+ ],
+ },
+ ],
+ },
+ // Levi Lincoln
+ {
+ name: 'Levi Lincoln',
+ data: [
+ {
+ x: 'Secretary of State',
+ y: [new Date(1801, 2, 5).getTime(), new Date(1801, 4, 1).getTime()],
+ },
+ ],
+ },
+ // James Madison
+ {
+ name: 'James Madison',
+ data: [
+ {
+ x: 'Secretary of State',
+ y: [new Date(1801, 4, 2).getTime(), new Date(1809, 2, 3).getTime()],
+ },
+ ],
+ },
+ ],
+ chart: {
+ height: 350,
+ type: 'rangeBar',
+ toolbar: {
+ show: false,
+ },
+ },
+ plotOptions: {
+ bar: {
+ horizontal: true,
+ barHeight: '50%',
+ rangeBarGroupRows: true,
+ },
+ },
+ colors: ['#1c84ee', '#7f56da', '#ff86c8', '#f9b931', '#4ecac2'],
+ fill: {
+ type: 'solid',
+ },
+ xaxis: {
+ type: 'datetime',
+ axisBorder: {
+ show: false,
+ },
+ },
+ legend: {
+ position: 'right',
+ },
+ }
+}
diff --git a/apiferia/src/app/views/charts/treemap/treemap.component.html b/apiferia/src/app/views/charts/treemap/treemap.component.html
new file mode 100644
index 00000000..5a5a8f3d
--- /dev/null
+++ b/apiferia/src/app/views/charts/treemap/treemap.component.html
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
Overview
+
+
+ Find the JS file for the following chart at:
+ src/app/views/charts/treemap.component.ts
+
+
+
+
+
+
+
+
+
Treemap Multiple Series
+
+
+
+
+
+
+
+
Distributed Treemap
+
+
+
+
+
+
+
+
Color Range Treemap
+
+
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/charts/treemap/treemap.component.spec.ts b/apiferia/src/app/views/charts/treemap/treemap.component.spec.ts
new file mode 100644
index 00000000..562ed373
--- /dev/null
+++ b/apiferia/src/app/views/charts/treemap/treemap.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { TreemapComponent } from './treemap.component'
+
+describe('TreemapComponent', () => {
+ let component: TreemapComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [TreemapComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(TreemapComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/charts/treemap/treemap.component.ts b/apiferia/src/app/views/charts/treemap/treemap.component.ts
new file mode 100644
index 00000000..4276b842
--- /dev/null
+++ b/apiferia/src/app/views/charts/treemap/treemap.component.ts
@@ -0,0 +1,341 @@
+import { ChartOptions } from '@/app/common/apexchart.model'
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { UIExamplesListComponent } from '@/app/components/ui-examples-list/ui-examples-list.component'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'app-treemap',
+ standalone: true,
+ imports: [PageTitleComponent, NgApexchartsModule, UIExamplesListComponent],
+ templateUrl: './treemap.component.html',
+ styles: ``,
+})
+export class TreemapComponent {
+ treemapChart: Partial = {
+ series: [
+ {
+ data: [
+ {
+ x: 'New Delhi',
+ y: 218,
+ },
+ {
+ x: 'Kolkata',
+ y: 149,
+ },
+ {
+ x: 'Mumbai',
+ y: 184,
+ },
+ {
+ x: 'Ahmedabad',
+ y: 55,
+ },
+ {
+ x: 'Bangaluru',
+ y: 84,
+ },
+ {
+ x: 'Pune',
+ y: 31,
+ },
+ {
+ x: 'Chennai',
+ y: 70,
+ },
+ {
+ x: 'Jaipur',
+ y: 30,
+ },
+ {
+ x: 'Surat',
+ y: 44,
+ },
+ {
+ x: 'Hyderabad',
+ y: 68,
+ },
+ {
+ x: 'Lucknow',
+ y: 28,
+ },
+ {
+ x: 'Indore',
+ y: 19,
+ },
+ {
+ x: 'Kanpur',
+ y: 29,
+ },
+ ],
+ },
+ ],
+ colors: ['#1c84ee'],
+ legend: {
+ show: false,
+ },
+ chart: {
+ height: 350,
+ type: 'treemap',
+ toolbar: {
+ show: false,
+ },
+ },
+ title: {
+ text: 'Basic Treemap',
+ align: 'center',
+ },
+ }
+
+ multipletreemapChart: Partial = {
+ series: [
+ {
+ name: 'Desktops',
+ data: [
+ {
+ x: 'ABC',
+ y: 10,
+ },
+ {
+ x: 'DEF',
+ y: 60,
+ },
+ {
+ x: 'XYZ',
+ y: 41,
+ },
+ ],
+ },
+ {
+ name: 'Mobile',
+ data: [
+ {
+ x: 'ABCD',
+ y: 10,
+ },
+ {
+ x: 'DEFG',
+ y: 20,
+ },
+ {
+ x: 'WXYZ',
+ y: 51,
+ },
+ {
+ x: 'PQR',
+ y: 30,
+ },
+ {
+ x: 'MNO',
+ y: 20,
+ },
+ {
+ x: 'CDE',
+ y: 30,
+ },
+ ],
+ },
+ ],
+ legend: {
+ show: false,
+ },
+ chart: {
+ height: 350,
+ type: 'treemap',
+ toolbar: {
+ show: false,
+ },
+ },
+ colors: ['#f9b931', '#22c55e'],
+ title: {
+ text: 'Multi-dimensional Treemap',
+ align: 'center',
+ },
+ }
+
+ distributedtreemapChart: Partial = {
+ series: [
+ {
+ data: [
+ {
+ x: 'New Delhi',
+ y: 218,
+ },
+ {
+ x: 'Kolkata',
+ y: 149,
+ },
+ {
+ x: 'Mumbai',
+ y: 184,
+ },
+ {
+ x: 'Ahmedabad',
+ y: 55,
+ },
+ {
+ x: 'Bangaluru',
+ y: 84,
+ },
+ {
+ x: 'Pune',
+ y: 31,
+ },
+ {
+ x: 'Chennai',
+ y: 70,
+ },
+ {
+ x: 'Jaipur',
+ y: 30,
+ },
+ {
+ x: 'Surat',
+ y: 44,
+ },
+ {
+ x: 'Hyderabad',
+ y: 68,
+ },
+ {
+ x: 'Lucknow',
+ y: 28,
+ },
+ {
+ x: 'Indore',
+ y: 19,
+ },
+ {
+ x: 'Kanpur',
+ y: 29,
+ },
+ ],
+ },
+ ],
+ legend: {
+ show: false,
+ },
+ chart: {
+ height: 350,
+ type: 'treemap',
+ toolbar: {
+ show: false,
+ },
+ },
+ title: {
+ text: 'Distibuted Treemap (different color for each cell)',
+ align: 'center',
+ },
+ colors: ['#1c84ee', '#ff6c2f', '#f9b931'],
+ plotOptions: {
+ treemap: {
+ distributed: true,
+ enableShades: false,
+ },
+ },
+ }
+
+ rangetreemapChart: Partial = {
+ series: [
+ {
+ data: [
+ {
+ x: 'INTC',
+ y: 1.2,
+ },
+ {
+ x: 'GS',
+ y: 0.4,
+ },
+ {
+ x: 'CVX',
+ y: -1.4,
+ },
+ {
+ x: 'GE',
+ y: 2.7,
+ },
+ {
+ x: 'CAT',
+ y: -0.3,
+ },
+ {
+ x: 'RTX',
+ y: 5.1,
+ },
+ {
+ x: 'CSCO',
+ y: -2.3,
+ },
+ {
+ x: 'JNJ',
+ y: 2.1,
+ },
+ {
+ x: 'PG',
+ y: 0.3,
+ },
+ {
+ x: 'TRV',
+ y: 0.12,
+ },
+ {
+ x: 'MMM',
+ y: -2.31,
+ },
+ {
+ x: 'NKE',
+ y: 3.98,
+ },
+ {
+ x: 'IYT',
+ y: 1.67,
+ },
+ ],
+ },
+ ],
+ legend: {
+ show: false,
+ },
+ chart: {
+ height: 350,
+ type: 'treemap',
+ toolbar: {
+ show: false,
+ },
+ },
+ title: {
+ text: 'Treemap with Color scale',
+ align: 'center',
+ },
+ dataLabels: {
+ enabled: true,
+ style: {
+ fontSize: '12px',
+ },
+ offsetY: -4,
+ },
+ plotOptions: {
+ treemap: {
+ enableShades: true,
+ shadeIntensity: 0.5,
+ reverseNegativeShade: true,
+ colorScale: {
+ ranges: [
+ {
+ from: -6,
+ to: 0,
+ color: '#1c84ee',
+ },
+ {
+ from: 0.001,
+ to: 6,
+ color: '#4ecac2',
+ },
+ ],
+ },
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/dashboards/analytics/analytics.component.html b/apiferia/src/app/views/dashboards/analytics/analytics.component.html
new file mode 100644
index 00000000..01d44221
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/analytics.component.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/dashboards/analytics/analytics.component.spec.ts b/apiferia/src/app/views/dashboards/analytics/analytics.component.spec.ts
new file mode 100644
index 00000000..24639712
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/analytics.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { AnalyticsComponent } from './analytics.component'
+
+describe('AnalyticsComponent', () => {
+ let component: AnalyticsComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [AnalyticsComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(AnalyticsComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/analytics/analytics.component.ts b/apiferia/src/app/views/dashboards/analytics/analytics.component.ts
new file mode 100644
index 00000000..c994d26f
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/analytics.component.ts
@@ -0,0 +1,27 @@
+import { PageTitleComponent } from '@/app/components/page-title.component'
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
+import { StateComponent } from './components/state/state.component'
+import { ConversationComponent } from './components/conversation/conversation.component'
+import { PerformanceComponent } from './components/performance/performance.component'
+import { SessionbycountyComponent } from './components/sessionbycounty/sessionbycounty.component'
+import { BrowserComponent } from './components/browser/browser.component'
+import { TopPageComponent } from './components/top-page/top-page.component'
+
+@Component({
+ selector: 'app-analytics',
+ standalone: true,
+ imports: [
+ PageTitleComponent,
+ StateComponent,
+ ConversationComponent,
+ PerformanceComponent,
+ SessionbycountyComponent,
+ BrowserComponent,
+ TopPageComponent,
+ BrowserComponent,
+ ],
+ templateUrl: './analytics.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class AnalyticsComponent {}
diff --git a/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.html b/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.html
new file mode 100644
index 00000000..edd683d1
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.html
@@ -0,0 +1,39 @@
+
+
+
+
+ @for (data of browserData; track $index) {
+
+ {{ data.name }}
+ {{ data.percentage }}%
+ {{ data.amount }}k
+
+ }
+
+
+
diff --git a/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.spec.ts b/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.spec.ts
new file mode 100644
index 00000000..02daa459
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { BrowserComponent } from './browser.component'
+
+describe('BrowserComponent', () => {
+ let component: BrowserComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [BrowserComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(BrowserComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.ts b/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.ts
new file mode 100644
index 00000000..267259f3
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/browser/browser.component.ts
@@ -0,0 +1,16 @@
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
+import { browserList } from '../../data'
+import { SimplebarAngularModule } from 'simplebar-angular'
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'analytics-browser',
+ standalone: true,
+ imports: [SimplebarAngularModule, NgbDropdownModule],
+ templateUrl: './browser.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class BrowserComponent {
+ browserData = browserList
+}
diff --git a/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.html b/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.html
new file mode 100644
index 00000000..fdd90a2f
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.html
@@ -0,0 +1,33 @@
+
+
Conversions
+
+
+
+
+
+ View Details
+
+
+
diff --git a/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.spec.ts b/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.spec.ts
new file mode 100644
index 00000000..ef305a7b
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ConversationComponent } from './conversation.component'
+
+describe('ConversationComponent', () => {
+ let component: ConversationComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ConversationComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ConversationComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.ts b/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.ts
new file mode 100644
index 00000000..45415c09
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/conversation/conversation.component.ts
@@ -0,0 +1,78 @@
+import type { ChartOptions } from '@/app/common/apexchart.model'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'analytics-conversation',
+ standalone: true,
+ imports: [NgApexchartsModule],
+ templateUrl: './conversation.component.html',
+ styles: ``,
+})
+export class ConversationComponent {
+ conversationChart: Partial = {
+ chart: {
+ height: 292,
+ type: 'radialBar',
+ },
+ plotOptions: {
+ radialBar: {
+ startAngle: -135,
+ endAngle: 135,
+ dataLabels: {
+ name: {
+ fontSize: '14px',
+ color: 'undefined',
+ offsetY: 100,
+ },
+ value: {
+ offsetY: 55,
+ fontSize: '20px',
+ color: undefined,
+ formatter: function (val: number) {
+ return val + '%'
+ },
+ },
+ },
+ track: {
+ background: 'rgba(170,184,197, 0.2)',
+ margin: 0,
+ },
+ },
+ },
+ fill: {
+ gradient: {
+ shade: 'dark',
+ shadeIntensity: 0.2,
+ inverseColors: false,
+ opacityFrom: 1,
+ opacityTo: 1,
+ stops: [0, 50, 65, 91],
+ },
+ },
+ stroke: {
+ dashArray: 4,
+ },
+ colors: ['#7f56da', '#22c55e'],
+ series: [65.2],
+ labels: ['Returning Customer'],
+ responsive: [
+ {
+ breakpoint: 380,
+ options: {
+ chart: {
+ height: 180,
+ },
+ },
+ },
+ ],
+ grid: {
+ padding: {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.html b/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.html
new file mode 100644
index 00000000..dd668173
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.html
@@ -0,0 +1,44 @@
+
+
+
Performance
+
+
+ ALL
+
+
+ 1M
+
+
+ 6M
+
+
+ 1Y
+
+
+
+
+
+
+ We regret to inform you that our server is currently experiencing technical
+ difficulties.
+
+
+
+
diff --git a/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.spec.ts b/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.spec.ts
new file mode 100644
index 00000000..a0f897b6
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { PerformanceComponent } from './performance.component'
+
+describe('PerformanceComponent', () => {
+ let component: PerformanceComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [PerformanceComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(PerformanceComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.ts b/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.ts
new file mode 100644
index 00000000..e17a6a44
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/performance/performance.component.ts
@@ -0,0 +1,144 @@
+import type { ChartOptions } from '@/app/common/apexchart.model'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'analytics-performance',
+ standalone: true,
+ imports: [NgApexchartsModule],
+ templateUrl: './performance.component.html',
+ styles: ``,
+})
+export class PerformanceComponent {
+ performanceChart: Partial = {
+ series: [
+ {
+ name: 'Page Views',
+ type: 'bar',
+ data: [34, 65, 46, 68, 49, 61, 42, 44, 78, 52, 63, 67],
+ },
+ {
+ name: 'Clicks',
+ type: 'area',
+ data: [8, 12, 7, 17, 21, 11, 5, 9, 7, 29, 12, 35],
+ },
+ ],
+ chart: {
+ height: 313,
+ type: 'line',
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ dashArray: [0, 0],
+ width: [0, 2],
+ curve: 'smooth',
+ },
+ fill: {
+ opacity: [1, 1],
+ type: ['solid', 'gradient'],
+ gradient: {
+ type: 'vertical',
+ inverseColors: false,
+ opacityFrom: 0.5,
+ opacityTo: 0,
+ stops: [0, 90],
+ },
+ },
+ markers: {
+ size: [0, 0],
+ strokeWidth: 2,
+ hover: {
+ size: 4,
+ },
+ },
+ xaxis: {
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ],
+ axisTicks: {
+ show: false,
+ },
+ axisBorder: {
+ show: false,
+ },
+ },
+ yaxis: {
+ min: 0,
+ axisBorder: {
+ show: false,
+ },
+ },
+ grid: {
+ show: true,
+ strokeDashArray: 3,
+ xaxis: {
+ lines: {
+ show: false,
+ },
+ },
+ yaxis: {
+ lines: {
+ show: true,
+ },
+ },
+ padding: {
+ top: 0,
+ right: -2,
+ bottom: 0,
+ left: 10,
+ },
+ },
+ legend: {
+ show: true,
+ horizontalAlign: 'center',
+ offsetX: 0,
+ offsetY: 5,
+ itemMargin: {
+ horizontal: 10,
+ vertical: 0,
+ },
+ },
+ plotOptions: {
+ bar: {
+ columnWidth: '30%',
+ barHeight: '70%',
+ borderRadius: 3,
+ },
+ },
+ colors: ['#7f56da', '#22c55e'],
+ tooltip: {
+ shared: true,
+ y: [
+ {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return y.toFixed(1) + 'k'
+ }
+ return y
+ },
+ },
+ {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return y.toFixed(1) + 'k'
+ }
+ return y
+ },
+ },
+ ],
+ },
+ }
+}
diff --git a/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.html b/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.html
new file mode 100644
index 00000000..e6abc86d
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+ @for (item of countryList; track $index) {
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
{{ item.progressAmount }}k
+
+
+ }
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.spec.ts b/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.spec.ts
new file mode 100644
index 00000000..3c6a5594
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { SessionbycountyComponent } from './sessionbycounty.component'
+
+describe('SessionbycountyComponent', () => {
+ let component: SessionbycountyComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [SessionbycountyComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(SessionbycountyComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.ts b/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.ts
new file mode 100644
index 00000000..ecd7f1e1
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/sessionbycounty/sessionbycounty.component.ts
@@ -0,0 +1,51 @@
+import { WorldVectorMapComponent } from '@/app/components/vector-maps/world-vector-map.component'
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
+import 'jsvectormap'
+import 'jsvectormap/dist/maps/world.js'
+import { countryList } from '../../data'
+import {
+ NgbDropdownModule,
+ NgbProgressbarModule,
+} from '@ng-bootstrap/ng-bootstrap'
+
+@Component({
+ selector: 'analytics-sessionbycounty',
+ standalone: true,
+ imports: [WorldVectorMapComponent, NgbProgressbarModule, NgbDropdownModule],
+ templateUrl: './sessionbycounty.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class SessionbycountyComponent {
+ countryList = countryList
+
+ worldMapConfig = {
+ map: 'world',
+ selector: '#world-map-markers',
+ zoomOnScroll: true,
+ zoomButtons: false,
+ markersSelectable: true,
+ markers: [
+ { name: 'Canada', coords: [56.1304, -106.3468] },
+ { name: 'Brazil', coords: [-14.235, -51.9253] },
+ { name: 'Russia', coords: [61, 105] },
+ { name: 'China', coords: [35.8617, 104.1954] },
+ { name: 'United States', coords: [37.0902, -95.7129] },
+ ],
+ markerStyle: {
+ initial: { fill: '#7f56da' },
+ selected: { fill: '#22c55e' },
+ },
+ labels: {
+ markers: {
+ render: (marker: any) => marker.name,
+ },
+ },
+ regionStyle: {
+ initial: {
+ fill: 'rgba(169,183,197, 0.3)',
+ fillOpacity: 1,
+ },
+ },
+ }
+}
diff --git a/apiferia/src/app/views/dashboards/analytics/components/state/state.component.html b/apiferia/src/app/views/dashboards/analytics/components/state/state.component.html
new file mode 100644
index 00000000..e5f8a232
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/state/state.component.html
@@ -0,0 +1,32 @@
+
+ @for (data of stateList; track $index) {
+
+
+
+
+
+
+
+
+ {{ data.name }}
+
+
+ {{ data.amount }}
+
+
+
+
+
+
+
+ }
+
diff --git a/apiferia/src/app/views/dashboards/analytics/components/state/state.component.spec.ts b/apiferia/src/app/views/dashboards/analytics/components/state/state.component.spec.ts
new file mode 100644
index 00000000..60e9e50f
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/state/state.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { StateComponent } from './state.component'
+
+describe('StateComponent', () => {
+ let component: StateComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [StateComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(StateComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/analytics/components/state/state.component.ts b/apiferia/src/app/views/dashboards/analytics/components/state/state.component.ts
new file mode 100644
index 00000000..3ea3ede9
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/state/state.component.ts
@@ -0,0 +1,14 @@
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
+import { stateData } from '../../data'
+
+@Component({
+ selector: 'analytics-state',
+ standalone: true,
+ imports: [],
+ templateUrl: './state.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class StateComponent {
+ stateList = stateData
+}
diff --git a/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.html b/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.html
new file mode 100644
index 00000000..c4f5cd9b
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ Page Path
+ Page Views
+ Avg Time on Page
+ Exit Rate
+
+
+
+ @for (item of pageList; track $index) {
+
+
+ {{
+ item.path
+ }}
+
+ {{ item.views }}
+ {{ item.time }}
+
+ {{ item.rate }}%
+
+
+ }
+
+
+
+
diff --git a/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.spec.ts b/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.spec.ts
new file mode 100644
index 00000000..84255247
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { TopPageComponent } from './top-page.component'
+
+describe('TopPageComponent', () => {
+ let component: TopPageComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [TopPageComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(TopPageComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.ts b/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.ts
new file mode 100644
index 00000000..e5c3e0f1
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/components/top-page/top-page.component.ts
@@ -0,0 +1,13 @@
+import { Component } from '@angular/core'
+import { pageList } from '../../data'
+
+@Component({
+ selector: 'analytics-top-page',
+ standalone: true,
+ imports: [],
+ templateUrl: './top-page.component.html',
+ styles: ``,
+})
+export class TopPageComponent {
+ pageList = pageList
+}
diff --git a/apiferia/src/app/views/dashboards/analytics/data.ts b/apiferia/src/app/views/dashboards/analytics/data.ts
new file mode 100644
index 00000000..e2b2faf2
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/analytics/data.ts
@@ -0,0 +1,161 @@
+type StateType = {
+ icon: string
+ name: string
+ amount: string
+ iconColor: string
+}
+
+type CountryType = {
+ icon: string
+ name: string
+ progressValue: number
+ progressAmount: number
+ progressType: string
+}
+
+type BrowserType = {
+ name: string
+ percentage: number
+ amount: number
+}
+
+export const stateData: StateType[] = [
+ {
+ icon: 'iconamoon:eye-duotone',
+ name: 'Page View',
+ amount: '13,647',
+ iconColor: 'primary',
+ },
+ {
+ icon: 'iconamoon:link-external-duotone',
+ name: 'Clicks',
+ amount: '9,526',
+ iconColor: 'success',
+ },
+ {
+ icon: 'iconamoon:trend-up-bold',
+ name: 'Conversions',
+ amount: '65.2%',
+ iconColor: 'danger',
+ },
+ {
+ icon: 'iconamoon:profile-circle-duotone',
+ name: 'New Users',
+ amount: '9.5k',
+ iconColor: 'warning',
+ },
+]
+
+export const countryList: CountryType[] = [
+ {
+ icon: 'circle-flags:us',
+ name: 'United States',
+ progressValue: 82.5,
+ progressAmount: 659,
+ progressType: 'secondary',
+ },
+ {
+ icon: 'circle-flags:ru',
+ name: 'Russia',
+ progressValue: 70.5,
+ progressAmount: 485,
+ progressType: 'info',
+ },
+ {
+ icon: 'circle-flags:cn',
+ name: 'China',
+ progressValue: 65.8,
+ progressAmount: 355,
+ progressType: 'warning',
+ },
+ {
+ icon: 'circle-flags:ca',
+ name: 'Canada',
+ progressValue: 55.8,
+ progressAmount: 204,
+ progressType: 'success',
+ },
+ {
+ icon: 'circle-flags:br',
+ name: 'Brazil',
+ progressValue: 35.9,
+ progressAmount: 109,
+ progressType: 'primary',
+ },
+]
+
+export const browserList: BrowserType[] = [
+ {
+ name: 'Chrome',
+ percentage: 62.5,
+ amount: 5.06,
+ },
+ {
+ name: 'Firefox',
+ percentage: 12.3,
+ amount: 1.5,
+ },
+ {
+ name: 'Safari',
+ percentage: 9.86,
+ amount: 1.03,
+ },
+ {
+ name: 'Brave',
+ percentage: 3.15,
+ amount: 0.3,
+ },
+ {
+ name: 'Opera',
+ percentage: 3.01,
+ amount: 1.58,
+ },
+ {
+ name: 'Falkon',
+ percentage: 2.8,
+ amount: 0.01,
+ },
+ {
+ name: 'Other',
+ percentage: 6.38,
+ amount: 3.6,
+ },
+]
+
+export const pageList = [
+ {
+ path: 'reback/dashboard.html',
+ views: 4265,
+ time: '09m:45s',
+ rate: '20.4',
+ rateColor: 'danger',
+ },
+ {
+ path: 'reback/chat.html',
+ views: 2584,
+ time: '05m:02s',
+ rate: '12.25',
+ rateColor: 'warning',
+ },
+ {
+ path: 'reback/auth-login.html',
+ views: 3369,
+ time: '04m:25s',
+ rate: '5.2',
+ rateColor: 'success',
+ },
+ {
+ path: 'reback/email.html',
+ views: 985,
+ time: '02m:03s',
+ rate: '64.2',
+ rateColor: 'danger',
+ },
+ {
+ path: 'reback/social.html',
+ views: 653,
+ time: '15m:56s',
+ rate: '2.4',
+ rateColor: 'success',
+ },
+]
diff --git a/apiferia/src/app/views/dashboards/dashboards.route.ts b/apiferia/src/app/views/dashboards/dashboards.route.ts
new file mode 100644
index 00000000..41a34c0f
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/dashboards.route.ts
@@ -0,0 +1,22 @@
+import { Route } from '@angular/router'
+import { AnalyticsComponent } from './analytics/analytics.component'
+import { FinanceComponent } from './finance/finance.component'
+import { SalesComponent } from './sales/sales.component'
+
+export const DASHBOARD_ROUTES: Route[] = [
+ {
+ path: 'analytics',
+ component: AnalyticsComponent,
+ data: { title: 'Analytics' },
+ },
+ {
+ path: 'finance',
+ component: FinanceComponent,
+ data: { title: 'Finance' },
+ },
+ {
+ path: 'sales',
+ component: SalesComponent,
+ data: { title: 'Sales' },
+ },
+]
diff --git a/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.html b/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.html
new file mode 100644
index 00000000..57971c41
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.html
@@ -0,0 +1,37 @@
+
diff --git a/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.spec.ts b/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.spec.ts
new file mode 100644
index 00000000..c78966f9
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { ExpensesComponent } from './expenses.component'
+
+describe('ExpensesComponent', () => {
+ let component: ExpensesComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [ExpensesComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(ExpensesComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.ts b/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.ts
new file mode 100644
index 00000000..7b96f2d7
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/expenses/expenses.component.ts
@@ -0,0 +1,105 @@
+import type { ChartOptions } from '@/app/common/apexchart.model'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'finance-expenses',
+ standalone: true,
+ imports: [NgApexchartsModule],
+ templateUrl: './expenses.component.html',
+ styles: ``,
+})
+export class ExpensesComponent {
+ expenseChart: Partial = {
+ series: [
+ {
+ name: '2024',
+ data: [2.7, 2.2, 1.3, 2.5, 1, 2.5, 1.2, 1.2, 2.7, 1, 3.6, 2.1],
+ },
+ {
+ name: '2023',
+ data: [
+ -2.3, -1.9, -1, -2.1, -1.3, -2.2, -1.1, -2.3, -2.8, -1.1, -2.5, -1.5,
+ ],
+ },
+ ],
+ chart: {
+ toolbar: {
+ show: false,
+ },
+ type: 'bar',
+ fontFamily: 'inherit',
+ foreColor: '#ADB0BB',
+ height: 280,
+ stacked: true,
+ offsetX: -15,
+ },
+ colors: ['var(--bs-primary)', 'var(--bs-info)'],
+ plotOptions: {
+ bar: {
+ horizontal: false,
+ barHeight: '80%',
+ columnWidth: '25%',
+ borderRadiusApplication: 'end',
+ borderRadiusWhenStacked: 'all',
+ },
+ },
+ dataLabels: {
+ enabled: false,
+ },
+ legend: {
+ show: false,
+ },
+ grid: {
+ show: true,
+ strokeDashArray: 3,
+ padding: {
+ top: -10,
+ right: 0,
+ bottom: -10,
+ left: 0,
+ },
+ borderColor: 'rgba(0,0,0,0.05)',
+ xaxis: {
+ lines: {
+ show: true,
+ },
+ },
+ yaxis: {
+ lines: {
+ show: false,
+ },
+ },
+ },
+ yaxis: {
+ tickAmount: 4,
+ labels: {
+ formatter: function (val) {
+ return val + 'k'
+ },
+ },
+ },
+ xaxis: {
+ axisBorder: {
+ show: false,
+ },
+ axisTicks: {
+ show: false,
+ },
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'July',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ],
+ },
+ }
+}
diff --git a/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.html b/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.html
new file mode 100644
index 00000000..2e627f0f
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.html
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+ Sources
+ Revenue
+ Perc.
+
+
+
+
+ Online
+ {{ currency }}187,232
+
+ 48.63%
+ 2.5% Up
+
+
+
+ Offline
+ {{ currency }}126,874
+
+ 36.08%
+ 8.5% Up
+
+
+
+ Direct
+ {{ currency }}90,127
+
+ 23.41%
+ 10.98% Down
+
+
+
+
+
+
+
+
diff --git a/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.spec.ts b/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.spec.ts
new file mode 100644
index 00000000..5d868e34
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { RevenueSourcesComponent } from './revenue-sources.component'
+
+describe('RevenueSourcesComponent', () => {
+ let component: RevenueSourcesComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [RevenueSourcesComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(RevenueSourcesComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.ts b/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.ts
new file mode 100644
index 00000000..632ddf35
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/revenue-sources/revenue-sources.component.ts
@@ -0,0 +1,58 @@
+import type { ChartOptions } from '@/app/common/apexchart.model'
+import { currency } from '@/app/common/constants'
+import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'
+import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'finance-revenue-sources',
+ standalone: true,
+ imports: [NgApexchartsModule, NgbDropdownModule],
+ templateUrl: './revenue-sources.component.html',
+ styles: ``,
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
+})
+export class RevenueSourcesComponent {
+ currency = currency
+
+ revenueSourceChart: Partial = {
+ chart: {
+ height: 205,
+ type: 'donut',
+ },
+ legend: {
+ show: false,
+ position: 'bottom',
+ horizontalAlign: 'center',
+ offsetX: 0,
+ offsetY: -5,
+ itemMargin: {
+ horizontal: 10,
+ vertical: 0,
+ },
+ },
+ stroke: {
+ width: 0,
+ },
+ plotOptions: {
+ pie: {
+ donut: {
+ size: '70%',
+ labels: {
+ show: true,
+ total: {
+ showAlways: true,
+ show: true,
+ },
+ },
+ },
+ },
+ },
+ series: [140, 125, 85],
+ labels: ['Online', 'Offline', 'Direct'],
+ colors: ['var(--bs-primary)', 'var(--bs-info)', 'var(--bs-light)'],
+ dataLabels: {
+ enabled: false,
+ },
+ }
+}
diff --git a/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.html b/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.html
new file mode 100644
index 00000000..e20e883b
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.html
@@ -0,0 +1,40 @@
+
diff --git a/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.spec.ts b/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.spec.ts
new file mode 100644
index 00000000..d30667d2
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.spec.ts
@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing'
+
+import { RevenueComponent } from './revenue.component'
+
+describe('RevenueComponent', () => {
+ let component: RevenueComponent
+ let fixture: ComponentFixture
+
+ beforeEach(async () => {
+ await TestBed.configureTestingModule({
+ imports: [RevenueComponent],
+ }).compileComponents()
+
+ fixture = TestBed.createComponent(RevenueComponent)
+ component = fixture.componentInstance
+ fixture.detectChanges()
+ })
+
+ it('should create', () => {
+ expect(component).toBeTruthy()
+ })
+})
diff --git a/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.ts b/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.ts
new file mode 100644
index 00000000..0f6c3b26
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/revenue/revenue.component.ts
@@ -0,0 +1,138 @@
+import type { ChartOptions } from '@/app/common/apexchart.model'
+import { Component } from '@angular/core'
+import { NgApexchartsModule } from 'ng-apexcharts'
+
+@Component({
+ selector: 'finance-revenue',
+ standalone: true,
+ imports: [NgApexchartsModule],
+ templateUrl: './revenue.component.html',
+ styles: ``,
+})
+export class RevenueComponent {
+ revenueChart: Partial = {
+ series: [
+ {
+ name: 'Revenue',
+ type: 'area',
+ data: [34, 65, 46, 68, 49, 61, 42, 44, 78, 52, 63, 67],
+ },
+ {
+ name: 'Expenses',
+ type: 'line',
+ data: [8, 12, 7, 17, 21, 11, 5, 9, 7, 29, 12, 35],
+ },
+ ],
+ chart: {
+ height: 280,
+ type: 'line',
+ toolbar: {
+ show: false,
+ },
+ },
+ stroke: {
+ dashArray: [0, 8],
+ width: [2, 2],
+ curve: 'smooth',
+ },
+ fill: {
+ opacity: [1, 1],
+ type: ['gradient', 'solid'],
+ gradient: {
+ type: 'vertical',
+ // shadeIntensity: 1,
+ inverseColors: false,
+ opacityFrom: 0.5,
+ opacityTo: 0,
+ stops: [0, 70],
+ },
+ },
+ markers: {
+ size: [0, 0, 0],
+ strokeWidth: 2,
+ hover: {
+ size: 4,
+ },
+ },
+ xaxis: {
+ categories: [
+ 'Jan',
+ 'Feb',
+ 'Mar',
+ 'Apr',
+ 'May',
+ 'Jun',
+ 'Jul',
+ 'Aug',
+ 'Sep',
+ 'Oct',
+ 'Nov',
+ 'Dec',
+ ],
+ axisTicks: {
+ show: false,
+ },
+ axisBorder: {
+ show: false,
+ },
+ },
+ yaxis: {
+ min: 0,
+ tickAmount: 4,
+ labels: {
+ formatter: function (val) {
+ return val + 'k'
+ },
+ offsetX: -15,
+ },
+ axisBorder: {
+ show: false,
+ },
+ },
+ grid: {
+ show: true,
+ strokeDashArray: 3,
+ xaxis: {
+ lines: {
+ show: false,
+ },
+ },
+ yaxis: {
+ lines: {
+ show: true,
+ },
+ },
+ padding: {
+ top: -10,
+ right: -2,
+ bottom: -10,
+ left: -5,
+ },
+ },
+ legend: {
+ show: false,
+ },
+ colors: ['#7f56da', '#22c55e'],
+ tooltip: {
+ shared: true,
+ y: [
+ {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return '$' + y.toFixed(2) + 'k'
+ }
+ return y
+ },
+ },
+ {
+ formatter: function (y) {
+ if (typeof y !== 'undefined') {
+ return '$' + y.toFixed(2) + 'k'
+ }
+ return y
+ },
+ },
+ ],
+ },
+ }
+}
diff --git a/apiferia/src/app/views/dashboards/finance/components/state/state.component.html b/apiferia/src/app/views/dashboards/finance/components/state/state.component.html
new file mode 100644
index 00000000..7b5b1295
--- /dev/null
+++ b/apiferia/src/app/views/dashboards/finance/components/state/state.component.html
@@ -0,0 +1,33 @@
+
+ @for (data of stateData; track $index) {
+
+
+
+
+ {{ data.date }} +
++ {{ + data.title + }} +
++ {{ data.location }} +
+