commit adce44722f6c5e67830a4974f90c59fe463804d5 Author: phil Date: Sat Feb 17 12:35:03 2024 +0530 Initial commit for gisaf/fastapi diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..8084853 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6e87a00 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..382cdcf --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.angular/cache +/.sass-cache +/connect.lock +/coverage/* +/libpeerconnection.log +npm-debug.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +#System Files +.DS_Store +Thumbs.db diff --git a/README.md b/README.md new file mode 100644 index 0000000..e75a7ca --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# GisafApp + +This project was generated with [angular-cli](https://github.com/angular/angular-cli) version 1.0.0-beta.24. + +## Development server +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app 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/module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. + +## 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 [Protractor](http://www.protractortest.org/). +Before running the tests make sure you are serving the app via `ng serve`. + +## Deploying to Github Pages + +Run `ng github-pages:deploy` to deploy to Github Pages. + +## Further help + +To get more help on the `angular-cli` use `ng help` or go check out the [Angular-CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/angular.json b/angular.json new file mode 100644 index 0000000..bc66872 --- /dev/null +++ b/angular.json @@ -0,0 +1,184 @@ +{ + "version": 1, + "newProjectRoot": "projects", + "projects": { + "gisaf-app": { + "root": "", + "projectType": "application", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "assets": [ + { + "glob": "**/*", + "input": "src/assets", + "output": "/assets" + }, + { + "glob": "favicon.ico", + "input": "src", + "output": "/" + }, + { + "glob": "**/*", + "input": "src/undefined", + "output": "/" + } + ], + "styles": [ + { + "input": "node_modules/maplibre-gl/dist/maplibre-gl.css", + "inject": true + }, + { + "input": "src/styles.css", + "inject": true + }, + { + "input": "src/icons.css", + "inject": true + }, + { + "input": "src/gisaf-icons.css", + "inject": true + } + ], + "scripts": [ + "node_modules/plotly.js-basic-dist-min/plotly-basic.min.js" + ], + "allowedCommonJsDependencies": [ + "@turf/bbox", + "@turf/meta", + "graphql-tag", + "suggestions", + "subscriptions-transport-ws", + "zen-observable", + "maplibre-gl", + "@mapbox/point-geometry" + ], + "vendorChunk": true, + "extractLicenses": false, + "buildOptimizer": false, + "sourceMap": true, + "optimization": false, + "namedChunks": true + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "6kb" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "fileReplacements": [ + { + "src": "src/environments/environment.ts", + "replaceWith": "src/environments/environment.prod.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "gisaf-app:build" + }, + "configurations": { + "production": { + "browserTarget": "gisaf-app:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "gisaf-app:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "karmaConfig": "./karma.conf.js", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "scripts": [], + "styles": [ + { + "input": "node_modules/maplibre-gl/dist/maplibre-gl.css", + "inject": true + }, + { + "input": "src/styles.css", + "inject": true + }, + { + "input": "src/icons.css", + "inject": true + } + ], + "assets": [ + { + "glob": "**/*", + "input": "src/assets", + "output": "/assets" + }, + { + "glob": "favicon.ico", + "input": "src", + "output": "/" + }, + { + "glob": "**/*", + "input": "src/undefined", + "output": "/" + } + ] + } + } + } + }, + "gisaf-app-e2e": { + "root": "", + "projectType": "application", + "cli": {}, + "schematics": {}, + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "./protractor.conf.js", + "devServerTarget": "gisaf-app:serve" + } + } + } + } + }, + "schematics": { + "@schematics/angular:component": { + "prefix": "app", + "style": "css" + }, + "@schematics/angular:directive": { + "prefix": "app" + } + }, + "cli": { + "analytics": false + } +} diff --git a/karma.conf.js b/karma.conf.js new file mode 100644 index 0000000..84af9d1 --- /dev/null +++ b/karma.conf.js @@ -0,0 +1,33 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client:{ + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, 'coverage'), reports: [ 'html', 'lcovonly' ], + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..dd83bf7 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14554 @@ +{ + "name": "gisaf-app", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gisaf-app", + "version": "0.1.0", + "license": "GPL-3.0", + "dependencies": { + "@angular/animations": "^15.2.1", + "@angular/cdk": "^15.2.1", + "@angular/common": "^15.2.1", + "@angular/compiler": "^15.2.1", + "@angular/core": "^15.2.1", + "@angular/forms": "^15.2.1", + "@angular/material": "^15.2.1", + "@angular/platform-browser": "^15.2.1", + "@angular/platform-browser-dynamic": "^15.2.1", + "@angular/platform-server": "^15.2.1", + "@angular/router": "^15.2.1", + "@apollo/client": "^3.4.16", + "@mapbox/point-geometry": "^0.1.0", + "@maplibre/ngx-maplibre-gl": "^13.0.0", + "@turf/bbox": "^6.5.0", + "@turf/distance": "^6.5.0", + "angular-plotly.js": "^4.0.4", + "apollo-angular": "^4.2.1", + "core-js": "^2.6.3", + "graphql": "^15.6.1", + "maplibre-gl": "^2.4.0", + "ngx-flexible-layout": "15.0.1", + "plotly.js-basic-dist-min": "^2.8.1", + "rxjs": "^7.4.0", + "subscriptions-transport-ws": "^0.9.17", + "ts-helpers": "^1.1.2", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^15.2.1", + "@angular/cli": "^15.2.1", + "@angular/compiler-cli": "^15.2.1", + "@angular/language-service": "^15.2.1", + "@types/core-js": "^2.5.0", + "@types/geojson": "^7946.0.7", + "@types/jasmine": "~3.6.0", + "@types/jasminewd2": "^2.0.2", + "@types/node": "^12.11.1", + "@types/plotly.js-dist-min": "^2.3.0", + "clean-css": "^4.2.1", + "codelyzer": "^6.0.0", + "fontnik": "^0.7.1", + "jasmine-core": "~3.6.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~6.3.2", + "karma-chrome-launcher": "~3.1.0", + "karma-cli": "^2.0.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "openapi-typescript-codegen": "^0.27.0", + "protractor": "~7.0.0", + "source-map-explorer": "^2.2.2", + "ts-node": "^8.0.2", + "tslib": "^2.0.0", + "tslint": "~6.1.0", + "typescript": "~4.8.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1502.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.1.tgz", + "integrity": "sha512-/rtR0U4TJCplpnIfenoTOIn4omPUDDL8iAl6le0qelL2CXdEl6UjMBYF1ILS8OVMLfpEGUXfMLeZgRn0yb7DjA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.2.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.1.tgz", + "integrity": "sha512-EgJqlrig9iuMvqySb4h8h2AAd8OwhBqY2JMMvs+hIASZvJi3n+Qd12BdlqLuAzykRyIAdy3OeLSAaXZrmeSk0A==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1502.1", + "@angular-devkit/build-webpack": "0.1502.1", + "@angular-devkit/core": "15.2.1", + "@babel/core": "7.20.12", + "@babel/generator": "7.20.14", + "@babel/helper-annotate-as-pure": "7.18.6", + "@babel/helper-split-export-declaration": "7.18.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.20.7", + "@babel/plugin-transform-runtime": "7.19.6", + "@babel/preset-env": "7.20.2", + "@babel/runtime": "7.20.13", + "@babel/template": "7.20.7", + "@discoveryjs/json-ext": "0.5.7", + "@ngtools/webpack": "15.2.1", + "ansi-colors": "4.1.3", + "autoprefixer": "10.4.13", + "babel-loader": "9.1.2", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "4.21.5", + "cacache": "17.0.4", + "chokidar": "3.5.3", + "copy-webpack-plugin": "11.0.0", + "critters": "0.0.16", + "css-loader": "6.7.3", + "esbuild-wasm": "0.17.8", + "glob": "8.1.0", + "https-proxy-agent": "5.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.3", + "less-loader": "11.1.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.1", + "magic-string": "0.29.0", + "mini-css-extract-plugin": "2.7.2", + "open": "8.4.1", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "7.0.0", + "piscina": "3.2.0", + "postcss": "8.4.21", + "postcss-loader": "7.0.2", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.58.1", + "sass-loader": "13.2.0", + "semver": "7.3.8", + "source-map-loader": "4.0.1", + "source-map-support": "0.5.21", + "terser": "5.16.3", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.5.0", + "webpack": "5.75.0", + "webpack-dev-middleware": "6.0.1", + "webpack-dev-server": "4.11.1", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.17.8" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "@angular/localize": "^15.0.0", + "@angular/platform-server": "^15.0.0", + "@angular/service-worker": "^15.0.0", + "karma": "^6.3.0", + "ng-packagr": "^15.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.8.2 <5.0" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1502.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.1.tgz", + "integrity": "sha512-mQ9dbuoy0U2+caQCRMhUx88fA/WmBt+JkYt8nvtTUyhVTXm5XIVckTlIfqdVk0BCA1lT8AM4yFKmy97bFXuZeQ==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1502.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/core": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.1.tgz", + "integrity": "sha512-m6lj5vvA/L21rUVm4PokK2SXZQE1Hjsw8AMNEaj+RlyVW36ISLm2TeeCdb441siBpLJkW+yA47bC2FUJ8HgsQQ==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "rxjs": "6.6.7", + "source-map": "0.7.4" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.1.tgz", + "integrity": "sha512-XfUAGUC/tjQDzXaEJxkTvC7glJa4vmqGJ8RSCrRQYQOUZUASZtjEr6dIZEkWDN7zllcLuK/ULE4ITdcQ438LMQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.2.1", + "jsonc-parser": "3.2.0", + "magic-string": "0.29.0", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/magic-string": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", + "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular/animations": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.1.tgz", + "integrity": "sha512-oQjTdXLVHzSnsHHPF3CM4bnT4uVQQW1vP4weFTXWhvybQ6vICcq57N9Ri8ZsvB0Sisqug6CPwZoUATCb5a2HXw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.1" + } + }, + "node_modules/@angular/cdk": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.2.1.tgz", + "integrity": "sha512-kRwG0ujimOPhqDwQYcQ+pk7hpTr0yvaPkxAx5r1ytA6aQIvHJ1XaPzhtthsr5/PhpwzlH8k723xpejrLKcuR+w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^7.1.2" + }, + "peerDependencies": { + "@angular/common": "^15.0.0 || ^16.0.0", + "@angular/core": "^15.0.0 || ^16.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cli": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.1.tgz", + "integrity": "sha512-mLMn+65oojWvu7Ew4na8QgCQb382kZ55xCGjyUDeNNdH/WbqeYC783Vcs7JpMMP1JnndIaeIzvpfjLja1/2UCw==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1502.1", + "@angular-devkit/core": "15.2.1", + "@angular-devkit/schematics": "15.2.1", + "@schematics/angular": "15.2.1", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.3", + "ini": "3.0.1", + "inquirer": "8.2.4", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.1", + "ora": "5.4.1", + "pacote": "15.1.0", + "resolve": "1.22.1", + "semver": "7.3.8", + "symbol-observable": "4.0.0", + "yargs": "17.6.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.1.tgz", + "integrity": "sha512-nGFrZXrxLMkFyK4VYHHH6+/Hq92BjVls6UWuG1UblkYzGqPpr7dRQZGOXzJc48sEG2WOeVhlhyK+0tHFFaG08g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.1.tgz", + "integrity": "sha512-eOA09iQWPEOJXig6W+out8MyZL2wdVu62Z79PWGQG8RWDSPV8XUFMAPfTOC8B43PT4hn/Avy/aauXl6O9l3vXw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/core": "15.2.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.1.tgz", + "integrity": "sha512-IoS3IovbnY4hLWzeym5Kul/dJuncggMHuPnyrMbAnR6+eCZCLyRqQ5MykXDCsgfnRuVm8+PEZc0voA/5st2Vhw==", + "dev": true, + "dependencies": { + "@babel/core": "7.19.3", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.27.0", + "reflect-metadata": "^0.1.2", + "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/main-ngcc.js" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/compiler": "15.2.1", + "typescript": ">=4.8.2 <5.0" + } + }, + "node_modules/@angular/core": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.1.tgz", + "integrity": "sha512-CtN/cYDTGlELRcKBHxqnxmUhI9Euz2R+25dvjNtxB2tLzCehI6Fbmsb3NsC++jcAjL3QAmodpzzgULPtNJqs6A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" + } + }, + "node_modules/@angular/forms": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.1.tgz", + "integrity": "sha512-C3gWbjwcult/RPFJ4RtzwOoIrO2ZYPXF86gQuA1MFpASRsroWl/9HTdvkmLa+UeW8ZoSZt4QNl00dymO+ROUGg==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.1", + "@angular/core": "15.2.1", + "@angular/platform-browser": "15.2.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/language-service": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.1.tgz", + "integrity": "sha512-G86FZ0kZTXpHoyR1XJVB17whJ+4pvdJwCVnuZGzJ18lRwBJQcNA0r9neXqH+6StjStgLz0Wre+mI+sQMklFOmw==", + "dev": true, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + } + }, + "node_modules/@angular/material": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.2.1.tgz", + "integrity": "sha512-2CdOltJz35yZbcSw9xy5HCQXo2/3hoQDG7YQm0zbd6gq6NnVZdhrb1RT+KonIOO1a3cpH3zKilAsZLh7gfvDUg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/auto-init": "15.0.0-canary.684e33d25.0", + "@material/banner": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/card": "15.0.0-canary.684e33d25.0", + "@material/checkbox": "15.0.0-canary.684e33d25.0", + "@material/chips": "15.0.0-canary.684e33d25.0", + "@material/circular-progress": "15.0.0-canary.684e33d25.0", + "@material/data-table": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dialog": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/drawer": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/fab": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/form-field": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/image-list": "15.0.0-canary.684e33d25.0", + "@material/layout-grid": "15.0.0-canary.684e33d25.0", + "@material/line-ripple": "15.0.0-canary.684e33d25.0", + "@material/linear-progress": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu": "15.0.0-canary.684e33d25.0", + "@material/menu-surface": "15.0.0-canary.684e33d25.0", + "@material/notched-outline": "15.0.0-canary.684e33d25.0", + "@material/radio": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/segmented-button": "15.0.0-canary.684e33d25.0", + "@material/select": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/slider": "15.0.0-canary.684e33d25.0", + "@material/snackbar": "15.0.0-canary.684e33d25.0", + "@material/switch": "15.0.0-canary.684e33d25.0", + "@material/tab": "15.0.0-canary.684e33d25.0", + "@material/tab-bar": "15.0.0-canary.684e33d25.0", + "@material/tab-indicator": "15.0.0-canary.684e33d25.0", + "@material/tab-scroller": "15.0.0-canary.684e33d25.0", + "@material/textfield": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tooltip": "15.0.0-canary.684e33d25.0", + "@material/top-app-bar": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/animations": "^15.0.0 || ^16.0.0", + "@angular/cdk": "15.2.1", + "@angular/common": "^15.0.0 || ^16.0.0", + "@angular/core": "^15.0.0 || ^16.0.0", + "@angular/forms": "^15.0.0 || ^16.0.0", + "@angular/platform-browser": "^15.0.0 || ^16.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.1.tgz", + "integrity": "sha512-aUV4XfdeqHTXwMRAjgrmx43F22YwgaCZnU08Ufg4Dx3nfqL9ak3e5NfgUpMlKbj7qX2rGGt6GKhQwoDFR4Dg1g==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "15.2.1", + "@angular/common": "15.2.1", + "@angular/core": "15.2.1" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.1.tgz", + "integrity": "sha512-KeDq7yYmVlYVS3DiNUgI1318eYXxIiZ281Rg9TrLCHSNmzFag821XiDmXs/eug3RsgoYCKZ/j9w+ey8Qqfw6/Q==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.1", + "@angular/compiler": "15.2.1", + "@angular/core": "15.2.1", + "@angular/platform-browser": "15.2.1" + } + }, + "node_modules/@angular/platform-server": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-15.2.1.tgz", + "integrity": "sha512-8/x/O8p8yQPgPFqAiVThklcBKkZ9HyqYB1//5p3FO2sbg+ixp4irak/OlNxVZ+DS+EgKSahFoO1GsN/lKWpvFA==", + "dependencies": { + "domino": "^2.1.2", + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/animations": "15.2.1", + "@angular/common": "15.2.1", + "@angular/compiler": "15.2.1", + "@angular/core": "15.2.1", + "@angular/platform-browser": "15.2.1", + "@angular/platform-browser-dynamic": "15.2.1" + } + }, + "node_modules/@angular/router": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.1.tgz", + "integrity": "sha512-KyCBpj7HXnGSLz1XRP/b3K2WKVgfdY84uJ1CSVsTjADiduIfvAd3LGDVERzkTo+JxAsL1CD/yg1nTiIbFbcuCA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + }, + "peerDependencies": { + "@angular/common": "15.2.1", + "@angular/core": "15.2.1", + "@angular/platform-browser": "15.2.1", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-10.1.0.tgz", + "integrity": "sha512-3e+viyMuXdrcK8v5pvP+SDoAQ77FH6OyRmuK48SZKmdHJRFm87RsSs8qm6kP39a/pOPURByJw+OXzQIqcfmKtA==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.11", + "@types/lodash.clonedeep": "^4.5.7", + "js-yaml": "^4.1.0", + "lodash.clonedeep": "^4.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser/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/@apidevtools/json-schema-ref-parser/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/@apollo/client": { + "version": "3.7.8", + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/context": "^0.7.0", + "@wry/equality": "^0.5.0", + "@wry/trie": "^0.3.0", + "graphql-tag": "^2.12.6", + "hoist-non-react-statics": "^3.3.2", + "optimism": "^0.16.1", + "prop-types": "^15.7.2", + "response-iterator": "^0.2.6", + "symbol-observable": "^4.0.0", + "ts-invariant": "^0.10.3", + "tslib": "^2.3.0", + "zen-observable-ts": "^1.2.5" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-ws": "^5.5.5", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "subscriptions-transport-ws": "^0.9.0 || ^0.11.0" + }, + "peerDependenciesMeta": { + "graphql-ws": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "subscriptions-transport-ws": { + "optional": true + } + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.19.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", + "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.3", + "@babel/helper-compilation-targets": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.0", + "@babel/helpers": "^7.19.0", + "@babel/parser": "^7.19.3", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.19.3", + "@babel/types": "^7.19.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", + "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", + "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "regexpu-core": "^5.2.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", + "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.20.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-wrap-function": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.19.0", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.15", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.18.6", + "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.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", + "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", + "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", + "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", + "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.15.tgz", + "integrity": "sha512-Vv4DMZ6MiNOhu/LdaZsT/bsLRxgL94d269Mv4R/9sp6+Mp++X/JqypZYypJXLlM4mlL352/Egzbzr98iABH1CA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", + "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-split-export-declaration": "^7.18.6", + "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.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", + "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", + "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "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-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", + "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", + "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-identifier": "^7.19.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.20.5", + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-replace-supers": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", + "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", + "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", + "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-plugin-utils": "^7.19.0", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", + "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "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-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", + "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.1", + "@babel/helper-compilation-targets": "^7.20.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-async-generator-functions": "^7.20.1", + "@babel/plugin-proposal-class-properties": "^7.18.6", + "@babel/plugin-proposal-class-static-block": "^7.18.6", + "@babel/plugin-proposal-dynamic-import": "^7.18.6", + "@babel/plugin-proposal-export-namespace-from": "^7.18.9", + "@babel/plugin-proposal-json-strings": "^7.18.6", + "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", + "@babel/plugin-proposal-numeric-separator": "^7.18.6", + "@babel/plugin-proposal-object-rest-spread": "^7.20.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", + "@babel/plugin-proposal-optional-chaining": "^7.18.9", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.18.6", + "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.18.6", + "@babel/plugin-transform-async-to-generator": "^7.18.6", + "@babel/plugin-transform-block-scoped-functions": "^7.18.6", + "@babel/plugin-transform-block-scoping": "^7.20.2", + "@babel/plugin-transform-classes": "^7.20.2", + "@babel/plugin-transform-computed-properties": "^7.18.9", + "@babel/plugin-transform-destructuring": "^7.20.2", + "@babel/plugin-transform-dotall-regex": "^7.18.6", + "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-for-of": "^7.18.8", + "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-member-expression-literals": "^7.18.6", + "@babel/plugin-transform-modules-amd": "^7.19.6", + "@babel/plugin-transform-modules-commonjs": "^7.19.6", + "@babel/plugin-transform-modules-systemjs": "^7.19.6", + "@babel/plugin-transform-modules-umd": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", + "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-object-super": "^7.18.6", + "@babel/plugin-transform-parameters": "^7.20.1", + "@babel/plugin-transform-property-literals": "^7.18.6", + "@babel/plugin-transform-regenerator": "^7.18.6", + "@babel/plugin-transform-reserved-words": "^7.18.6", + "@babel/plugin-transform-shorthand-properties": "^7.18.6", + "@babel/plugin-transform-spread": "^7.19.0", + "@babel/plugin-transform-sticky-regex": "^7.18.6", + "@babel/plugin-transform-template-literals": "^7.18.9", + "@babel/plugin-transform-typeof-symbol": "^7.18.9", + "@babel/plugin-transform-unicode-escapes": "^7.18.10", + "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.20.2", + "babel-plugin-polyfill-corejs2": "^0.3.3", + "babel-plugin-polyfill-corejs3": "^0.6.0", + "babel-plugin-polyfill-regenerator": "^0.4.1", + "core-js-compat": "^3.25.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", + "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", + "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", + "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", + "integrity": "sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", + "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", + "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", + "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", + "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", + "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", + "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", + "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", + "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", + "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", + "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", + "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", + "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", + "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", + "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", + "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", + "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz", + "integrity": "sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz", + "integrity": "sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.1.1", + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "license": "ISC", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-supported": { + "version": "2.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "license": "ISC" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.0.6", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/@mapbox/vector-tile": { + "version": "1.3.1", + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/point-geometry": "~0.1.0" + } + }, + "node_modules/@mapbox/whoots-js": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@maplibre/ngx-maplibre-gl": { + "version": "13.0.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">= 13.0.0", + "@angular/core": ">= 13.0.0", + "maplibre-gl": ">= 2.0.0", + "rxjs": ">= 7.0.0" + } + }, + "node_modules/@material/animation": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-5osi1z4JQIXcklPALbH/zTfOm2pDzHt9Fxm7ZyURy250xIZj6QjULRzPTnzOhC2ropfix9ra2Cfggbf0dcRbEQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/auto-init": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-OigQTmrVzkcGvxNjOaIe5oItTFPgrO9xLewvharDI6m6yvO1z7OBnkcW+sFN6ggLNYNxd0O1u9v64vMsmeDABQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/banner": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-PqtGp3KWzdu58rWv/DIvSfe38m5YKOBbAAbBinSvgadBb/da+IE1t5F7YPNKE1T5lJsQBGVUYx6QBIeXm+aI/A==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/base": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-oOaqb/SfjWwTKsdJUZmeh/Qrs41nIJI0N+zELsxnvbGjSIN1ZMAKYZFPMahqvC68OJ6+5CvJM8PoTNs5l+B8IQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/button": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-Nkekk4edeX+ObVOa7UlwavaHdmckPV5wU4SAJf3iA3R61cmz+KsgAgpzfcwv5WfNhIlc2nLu8QYEecpHdo9d/w==", + "dependencies": { + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/card": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-xhyB7XX5KkEiCEqwSPkl58ZGYL6xFdnY62zimyBXJRG/Eaa0Swj3kW20hVCpt4f7c9Zmp8Se27rg8vnKmhvO3g==", + "dependencies": { + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/checkbox": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-NFpM3TS924PmVsk2KQLNU95OYCf8ZwYgzeqfnAexU0bEfjUJXINBun2Go0AaeOUMjuvWUe+byjrXgv8SFYbMUA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/chips": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-z4ajQ4NnsAQ/Si9tZ4xmxzjj2Qb+vW++4QjCjjjwAGIZbCe0xglAnMh2t66XLJUxt7RoKZuZVEO7ZqcFZpvJFQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/checkbox": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/circular-progress": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-G6qD0nGNtEUwWnAMJuA9INYFpZoKtx7KFjBaPF4Ol2YLHtmShALNAYyn54TMAK8AZ2IpW08PXjGS7Ye88vrdEQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/progress-indicator": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/data-table": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-+wDw1DDDFfAsKAMzs84f/5GCjux39zjNfW8tL4wFbkWNwewmQrG9zaQMJhBpVOtLCrM8Gj6SOgOANqgqoCjvGg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/checkbox": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/linear-progress": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/select": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/density": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-661yEVRMGrlq6S6WuSbPRO+ZwpdUOg2glCc7y96doM6itSLOa3UEAldjOLfsYZVB74GnKCiuDp//QmfoRyYTfA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dialog": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-szn0dHnfeQTSOC6SSRSGAzX6Tnx+4NnSMUwNkXm+3bwjds8ZVK26+DXwLrP5f3ID5F1K5sFsRf2INo5/TNTHyQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dom": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-7pEJLYov+tGgfuD8mZxoVU6rWtPI8ppjTAhz+F27Hz9FG0JETMWTKpDPBXLnKvX7vhIxL83GvZ9geNHCe8Hfog==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/drawer": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-/KMckLf1PYU/H3PXnS4e0aFl03qG3JlSv4LGgX6juJufcONqGTl/m63EMO/L/eUy6H1CRrXmVDjik/jzHLyDhg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/elevation": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-WDF8SsRtq3rXUbVVbd9K4DUijIPH0bUFSOreVYxudpuxAfTlDS5+aeS1EK9UIBFYLuba4u5wVT2tDv6e1RTfrQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/fab": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-KCu87rWOKEAe9vZcAm6K8XazYSWPNjMG+OhrbPjHW6bCO7as1YCgtmkBkhff7csY/rFmcVpIy884xtUfLmSudQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/feature-targeting": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-HyH1erNTSjS63sigNSUMaCd0nJhTNdDFeC+myrxwtDaQm+uYJ8troCNtQM3g6mx0XATNtX5aTOoPmrM6yVVi1A==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/floating-label": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-f7TPp6bKpGvV3sYYiZHSGlrixXKkXXITW3Esp7KB9jRq42c0H82novmdwvY0eTef4ootmA2JEysr78KQfHBUPg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/focus-ring": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-ikw2RVUfgzXChpWIzPH1VzRvTjYb5ZKj4H+CZf7jqPUXMstFOZg90Bp7ARLZHqYiyNMuUq3zUTHozS6iHorSqg==", + "dependencies": { + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0" + } + }, + "node_modules/@material/form-field": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-vpF9N/uq5no/7+8GAbEH0868FhOuBgxAWRr1Sfb+jthKfBr8OS/wPU/AHzZHdHdAm7PQynbeOXfDsX2dI//PDA==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/icon-button": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-wMI+XGzmIN/o2ePBKg2hLyx7H4pXCRAyyIKMQS1FMp1UKa2tYmiHVX/V8skhKwCqxg3i6Ls/LxMjfPxTR18WvQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/image-list": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-Ol+uaHYBe5R/cgzlfh5ONnMVX0wO6fV74JMUcQCQlxP6lXau/edARo4tkRc7A7UJUkU3VRv0EpEjLoCRNUPGaA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/layout-grid": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-ALXE1mqFNb/RB2lVRQ3/r1Aufw2mFZnOjRE+boYDVepmAG/xWyPCyaGoavELJF5l4GAb0tXi8wA/8HeGbLOpuA==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/line-ripple": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-7hRx8C/e9i0P6pgQpNOMfTwSS2r1fwEvBL72QDVGLtLuoKKwsjjgP6Z0Jat/GeHJe87u9LQvGBoD4upt+of/HA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/linear-progress": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-iJclt7mKmcMk6pqD7ocXKfCWZhqBoODp7N593jYlxVpTJuEz2wiVAjZUDn/YGj/Uz3CRH+2YFfOiLr9pwWjhDg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/progress-indicator": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/list": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-rQ+FCSdzmwTcT00IYE0uRV3CS4oGSccKFl9hkcF+aHFW61L7ORh/SCGUDPrEfQFrFkMn5f8qroVJjpUAMXBz4g==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-r7wzDLSGSI9629/mfpvsMzkVxpmV75kcD3IrW0Pcu6/Bv/1xi0EvjcUXzNJJoQlwN4Zj35Ymz/PCjZkIDIz68Q==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu-surface": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu-surface": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-RVO5GAYcfWPaKwxsF/NhUAmrYXQCQBKvRQW0TIlbmAJz6lcFeTs6YZqF3u1C7qrL3ZQGz+sur/7ywj6QU0oMow==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/notched-outline": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-9YHcBkvJLPVYzkHcWoTpBZAFrEd+j1hjhGxLhh0LuNrZe8VroUkZD1TTnUAPHRG3os6EqEWWaKb0RN+aPIF2yQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/progress-indicator": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-c0icji4faeNWUoqGENGC7Hav0Puxh0RwXIDVizffaUxKIGbajpIp5+4Zop73fK/xFLGMB/npg7TbP+aCGjQ3fw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/radio": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-U3Eh8sNUA8trDla1Bq8Bo02foxYvtoewaKeF8A8tAju81XZ4jRiftfOsOWZDZEHCVbbCB2QwvutvFlnay5n+Aw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/ripple": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-RyePu7SjIm/OuyyEieZ/gxiPYkNZOZHeid72WRcN9ofdlljj2pifcdPvcfZA+v/DMS33xo5GjG2L/Qj6ClWrKw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/rtl": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-NqdJl8Ayupp1Th+vCNCpVQHbUFOuF7TCte9LD1norTIBUF/QizIxWby2W5uUEiPbnh5j9PmE1CJtfLwKun3pcw==", + "dependencies": { + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/segmented-button": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-bEGgg8vgXNLyukyV8HRjFMuQ6t6nm5LQ4Pgm22um61Yc8qyi0BOqV41OR4SVdUrUqZxh1aVD+p+4NN03+LfQXw==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/touch-target": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/select": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-kf178/2TeEinTv0mgmSBcmmExQ2h7a7dtR1E3WuqQgisJ/R6+zVLMkC2CnfIyzxYX2vkuUTG0ue3Reh/6XiqSg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/line-ripple": "15.0.0-canary.684e33d25.0", + "@material/list": "15.0.0-canary.684e33d25.0", + "@material/menu": "15.0.0-canary.684e33d25.0", + "@material/menu-surface": "15.0.0-canary.684e33d25.0", + "@material/notched-outline": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/shape": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-aEelpaTFmpnCji3TUGP9bVCS/bRVjUmLTHBPZtuu1gOrUVVtJ6kYOg73dZNJF+XOoNL2yOX/LRcKwsop29tptA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/slider": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-WVyK+2pSNSZmj07M2K/a3TADoQ9FBCndfNC/vE7/wGIg4dddJJK5KvQ+yruf9R2cSzTL/S1sZ5WpyyeM8E9HTw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/snackbar": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-itO+DCkOannZzR1/cCHcqAm7ifhuFvXmDItNoA8qLEcAyJDJJRkhpwj3XQ01yuo9gBFcSctp7Txt7e+Hncm/Jg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/icon-button": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/switch": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-Jxi0gl92yvvZZsAPxvVHzXx2ga+T/djMow98jvEczmpUorWnAhgiCr9CsSSRoosahWyRB8NLZOxUQrACxvffjw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-WQL3wj9syHNcfe8KbgGGUcA34M8C/xZ+n0Fkkh8Kk6puVwaU+xqUNihsxPY6YzKpmh4PZ4oJaBdiN8zvFT1zqQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/focus-ring": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/tab-indicator": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-bar": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-SW/cMaDsIGGkM1ag3A7GJRlmr8eXmObWsvitQJzh6Azr5zzZtSI+GQygkMesAEE1gbpqOVN8d40rh3H7VVIAcA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/tab": "15.0.0-canary.684e33d25.0", + "@material/tab-indicator": "15.0.0-canary.684e33d25.0", + "@material/tab-scroller": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-indicator": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-kKICqSPqOlaf0lzaFFCmuOqPXJC+cK48Qmsc+m5o6fJhkmuZRCYpIwB2JeP+uZSOq/bTH+SrPtCtnVlgWg6ksA==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-scroller": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-H6EU/TSiK/M2DyyORX5GEtXD9rKYxTMHC2VxsNWARPMFJGzgeW2ugYkFv+rKI1/c0bs0CJ4e+qFnOlBsQXZvyQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/tab": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/textfield": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-OvgpDXjvpyJTtAWskO69IDybFvDNzr9w2PN/Fk7yFm+uNVupaWz1Ew8lZ4gGslaTNSVmh2XcsvmzxcLINSiiNg==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/density": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/floating-label": "15.0.0-canary.684e33d25.0", + "@material/line-ripple": "15.0.0-canary.684e33d25.0", + "@material/notched-outline": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/theme": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-AZxaXXAvRKzAi20RlMxzt2U5UmkCWyv7DMWEBXsxtG5Tk54mi1HsbVUp3fxDPTlmL7Pq8p1/DESg/o7TgRCVlw==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tokens": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-wVwbQOTCXDPKYPdHQHLr026y36MMFelID1CmbfRk6mSol4O8yE9U0fXcShfRDW8Qo5E3X31w9c2A6T3neJY7wQ==", + "dependencies": { + "@material/elevation": "15.0.0-canary.684e33d25.0" + } + }, + "node_modules/@material/tooltip": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-dtm26QjxyQdinc8btgz6yys07b7bUW4FZgNF2EBPeGrICrPg7jf+JEvDziz5g8VMaTBQLOQRSCGy0MKuRlOjLw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/button": "15.0.0-canary.684e33d25.0", + "@material/dom": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/tokens": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/top-app-bar": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-1M+oupUxflfW7u81P1XlxoLZB8bLzwtpKofIfDNRbEsiKhlLTERJR3Yak3BGE9xakNMysAaBHlkb5MrN5bNPFw==", + "dependencies": { + "@material/animation": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/elevation": "15.0.0-canary.684e33d25.0", + "@material/ripple": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/shape": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/typography": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/touch-target": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-zdE69Slg8+T7sTn1OwqZ6H7WBYac9mxJ/JlJqfTqthzIjZRcCxBSYymQJcDHjsrPnUojOtr9U4Tpm5YZ96TEkQ==", + "dependencies": { + "@material/base": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/typography": { + "version": "15.0.0-canary.684e33d25.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.684e33d25.0.tgz", + "integrity": "sha512-aVnvgMwcfNa/K4wujzpKDIxjGl2hbkEL+m+OKDSQqWYjKcP9QrbzCXJruJBqxrBoPRHLbqo47k5f9uT8raSgjw==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.684e33d25.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.1.tgz", + "integrity": "sha512-YtA8rWAglPuf4CSStrFAxaprTSYE+DREGrJFc3WvZLcF5XrwVK+H4CC4Pmz07iYsG1TXShR4bWp1fbGw1cmBKw==", + "dev": true, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^15.0.0", + "typescript": ">=4.8.2 <5.0", + "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/fs": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", + "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.3.tgz", + "integrity": "sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", + "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "dev": true, + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "lib/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "dev": true, + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.0.tgz", + "integrity": "sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", + "node-gyp": "^9.0.0", + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@schematics/angular": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.1.tgz", + "integrity": "sha512-D0LtMGXxhMwGoK89TG606kY6CfQWrdOQ/bjOg/33xXJQWvGqUK8ZQtD7/lhcu5RWi3jduPh7V8jYWuAoA69Eig==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "15.2.1", + "@angular-devkit/schematics": "15.2.1", + "jsonc-parser": "3.2.0" + }, + "engines": { + "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.0.tgz", + "integrity": "sha512-RRMu4uMxWnZlxaIBxahSb2IssFZiu188sndesZflWOe1cA/qUqtemSIoBWbuVKPvvdktapImWNnKpBcc+VrCQw==", + "dev": true, + "dependencies": { + "minimatch": "^6.1.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@turf/bbox": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/distance": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/helpers": { + "version": "6.5.0", + "license": "MIT", + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/invariant": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@turf/meta": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^6.5.0" + }, + "funding": { + "url": "https://opencollective.com/turf" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/core-js": { + "version": "2.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.21.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "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": "4.17.33", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", + "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.10", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.10.tgz", + "integrity": "sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "3.6.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jasminewd2": { + "version": "2.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jasmine": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", + "dev": true + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.9.tgz", + "integrity": "sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mapbox__point-geometry": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/@types/mapbox__vector-tile": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "@types/geojson": "*", + "@types/mapbox__point-geometry": "*", + "@types/pbf": "*" + } + }, + "node_modules/@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "12.20.55", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/pbf": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/@types/plotly.js": { + "version": "2.12.16", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/plotly.js-dist-min": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/plotly.js": "*" + } + }, + "node_modules/@types/q": { + "version": "0.0.32", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/selenium-webdriver": { + "version": "3.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", + "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "dev": true, + "dependencies": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@wry/context": { + "version": "0.7.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/equality": { + "version": "0.5.3", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wry/trie": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/agentkeepalive/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/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "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/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/angular-plotly.js": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@angular/common": ">10.0.9", + "@angular/core": ">10.0.9" + } + }, + "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": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apollo-angular": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/apollo-angular/-/apollo-angular-4.2.1.tgz", + "integrity": "sha512-lMFVZmw7hIa4+VGutoiUMwHWggXFiDhbsrnZddQYzfdV6lkJRjm0hANG0KxXoaoLqEqkGTHdq5DaMCdsp6E4rw==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@angular/core": "^14.0.0 || ^15.0.0", + "@apollo/client": "^3.0.0", + "graphql": "^15.0.0 || ^16.0.0", + "rxjs": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/aria-query": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/async": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.13", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", + "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001426", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/axobject-query": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ast-types-flow": "0.0.7" + } + }, + "node_modules/babel-loader": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", + "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.2", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-define-polyfill-provider": "^0.3.3", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3", + "core-js-compat": "^3.25.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "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" + } + ], + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "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/bcrypt-pbkdf": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blocking-proxy": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "blocking-proxy": "built/lib/bin.js" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "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.11.0", + "raw-body": "2.5.1", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", + "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/browserstack": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "https-proxy-agent": "^2.2.1" + } + }, + "node_modules/browserstack/node_modules/agent-base": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/browserstack/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/browserstack/node_modules/https-proxy-agent": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", + "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^8.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.16.0.tgz", + "integrity": "sha512-VJBdeMa9Bz27NNlx+DI/YXGQtXdjUU+9gdfN1rYfra7vtTjhodl5tVNmR42bo+ORHuDqDT+lGAUAb+lzvY42Bw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "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/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001456", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/caseless": { + "version": "0.12.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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/chokidar": { + "version": "3.5.3", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "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" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/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/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/codelyzer": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular/compiler": "9.0.0", + "@angular/core": "9.0.0", + "app-root-path": "^3.0.0", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "rxjs": "^6.5.3", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2", + "tslib": "^1.10.0", + "zone.js": "~0.10.3" + }, + "peerDependencies": { + "@angular/compiler": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", + "@angular/core": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", + "tslint": "^5.0.0 || ^6.0.0" + } + }, + "node_modules/codelyzer/node_modules/@angular/compiler": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", + "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", + "dev": true, + "peerDependencies": { + "tslib": "^1.10.0" + } + }, + "node_modules/codelyzer/node_modules/@angular/core": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", + "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", + "dev": true, + "peerDependencies": { + "rxjs": "^6.5.3", + "tslib": "^1.10.0", + "zone.js": "~0.10.2" + } + }, + "node_modules/codelyzer/node_modules/rxjs": { + "version": "6.6.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/codelyzer/node_modules/source-map": { + "version": "0.5.7", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/codelyzer/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/codelyzer/node_modules/zone.js": { + "version": "0.10.3", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "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.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "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-disposition/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/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.4.2", + "dev": true, + "license": "MIT", + "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": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/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/core-js": { + "version": "2.6.12", + "hasInstallScript": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.28.0.tgz", + "integrity": "sha512-myzPgE7QodMg4nnd3K1TDoES/nADRStM8Gpz0D6nhkwbmwEnE0ZGJgoWsvQ722FR8D7xS0n0LV556RcEicjTyg==", + "dev": true, + "dependencies": { + "browserslist": "^4.21.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/critters": { + "version": "0.0.16", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/critters/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/critters/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", + "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.19", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssauron": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "X.X.X" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/d3-queue": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz", + "integrity": "sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==", + "dev": true + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-format": { + "version": "4.0.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/del": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": 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", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "4.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "node_modules/domutils": { + "version": "2.8.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/earcut": { + "version": "2.2.4", + "license": "ISC" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.301", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "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==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "2.2.0", + "dev": true, + "license": "BSD-2-Clause", + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true + }, + "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-module-lexer": { + "version": "0.9.3", + "dev": true, + "license": "MIT" + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "dev": true, + "license": "MIT" + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/esbuild": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz", + "integrity": "sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.8", + "@esbuild/android-arm64": "0.17.8", + "@esbuild/android-x64": "0.17.8", + "@esbuild/darwin-arm64": "0.17.8", + "@esbuild/darwin-x64": "0.17.8", + "@esbuild/freebsd-arm64": "0.17.8", + "@esbuild/freebsd-x64": "0.17.8", + "@esbuild/linux-arm": "0.17.8", + "@esbuild/linux-arm64": "0.17.8", + "@esbuild/linux-ia32": "0.17.8", + "@esbuild/linux-loong64": "0.17.8", + "@esbuild/linux-mips64el": "0.17.8", + "@esbuild/linux-ppc64": "0.17.8", + "@esbuild/linux-riscv64": "0.17.8", + "@esbuild/linux-s390x": "0.17.8", + "@esbuild/linux-x64": "0.17.8", + "@esbuild/netbsd-x64": "0.17.8", + "@esbuild/openbsd-x64": "0.17.8", + "@esbuild/sunos-x64": "0.17.8", + "@esbuild/win32-arm64": "0.17.8", + "@esbuild/win32-ia32": "0.17.8", + "@esbuild/win32-x64": "0.17.8" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz", + "integrity": "sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "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/eventemitter-asyncresource": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "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" + } + }, + "node_modules/express/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/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "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/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "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/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/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/extend": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "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/extsprintf": { + "version": "1.3.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "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.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fastparse": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fontnik": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/fontnik/-/fontnik-0.7.1.tgz", + "integrity": "sha512-T4fXSTpoF9GyMWqYefZhCSolLfmmLgJZ9K3Tv7dXSb8xFLw87jN6DcERTE3rTzzkSJH5Jtk+OTNEnx9ngnvVbg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "d3-queue": "^3.0.7", + "glob": "^7.1.6", + "minimist": "^1.2.5", + "node-addon-api": "^2.0.1" + }, + "bin": { + "build-glyphs": "bin/build-glyphs", + "font-inspect": "bin/font-inspect" + } + }, + "node_modules/fontnik/node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "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", + "dev": true, + "license": "MIT", + "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.1", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.1.tgz", + "integrity": "sha512-MhaJDcFRTuLidHrIttu0RDGyyXs/IYHVmlcxfLAEFIWjc1vdLAkdwT7Ace2u7DbitWC0toKMl5eJZRYNVreIMw==", + "dev": true, + "dependencies": { + "minipass": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/geojson-vt": { + "version": "3.2.1", + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gl-matrix": { + "version": "3.4.3", + "license": "MIT" + }, + "node_modules/glob": { + "version": "7.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "dev": true, + "license": "ISC" + }, + "node_modules/graphql": { + "version": "15.8.0", + "license": "MIT", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/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/har-schema": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/has": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "dev": true, + "license": "BSD", + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hosted-git-info": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true + }, + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "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": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "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/http-signature": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "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", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.1.tgz", + "integrity": "sha512-/c8MxUAqpRccq+LyDOecwF+9KqajueJHh8fz7g3YqjMZt+NSfJzx05zrKiXwa2sKwFCzaiZ5qUVfRj0pmxixEA==", + "dev": true, + "dependencies": { + "minimatch": "^6.1.6" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", + "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "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/immediate": { + "version": "3.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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/import-fresh/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/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/inquirer": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", + "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.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": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "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": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "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/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterall": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/jake": { + "version": "10.8.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/jake/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-core": { + "version": "3.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jasmine-spec-reporter": { + "version": "5.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "colors": "1.4.0" + } + }, + "node_modules/jasmine/node_modules/jasmine-core": { + "version": "2.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jasminewd2": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.9.x" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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/json-schema": { + "version": "0.4.0", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "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/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/jsprim": { + "version": "1.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/karma": { + "version": "6.3.20", + "dev": true, + "license": "MIT", + "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.4.1", + "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.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-cli": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.3.3" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/karma-coverage-istanbul-reporter": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^3.0.2", + "minimatch": "^3.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/mattlewis92" + } + }, + "node_modules/karma-jasmine": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jasmine-core": "^3.6.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "karma": "*" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/kdbush": { + "version": "3.0.0", + "license": "ISC" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "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": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/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/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/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lie": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "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/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true + }, + "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/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.7.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.3" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "dev": true, + "license": "ISC" + }, + "node_modules/make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/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==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/maplibre-gl": { + "version": "2.4.0", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@mapbox/geojson-rewind": "^0.5.2", + "@mapbox/jsonlint-lines-primitives": "^2.0.2", + "@mapbox/mapbox-gl-supported": "^2.0.1", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/tiny-sdf": "^2.0.5", + "@mapbox/unitbezier": "^0.0.1", + "@mapbox/vector-tile": "^1.3.1", + "@mapbox/whoots-js": "^3.1.0", + "@types/geojson": "^7946.0.10", + "@types/mapbox__point-geometry": "^0.1.2", + "@types/mapbox__vector-tile": "^1.3.0", + "@types/pbf": "^3.0.2", + "csscolorparser": "~1.0.3", + "earcut": "^2.2.4", + "geojson-vt": "^3.2.1", + "gl-matrix": "^3.4.3", + "global-prefix": "^3.0.0", + "murmurhash-js": "^1.0.0", + "pbf": "^3.2.1", + "potpack": "^1.0.2", + "quickselect": "^2.0.0", + "supercluster": "^7.1.5", + "tinyqueue": "^2.0.3", + "vt-pbf": "^3.1.3" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", + "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "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.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", + "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "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.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", + "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-json-stream/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "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/murmurhash-js": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.4", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "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": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ngx-flexible-layout": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/ngx-flexible-layout/-/ngx-flexible-layout-15.0.1.tgz", + "integrity": "sha512-go+1AF7CXQVCULKPX+QR886wclsCxvlW96EuNaI6npuooUnfzG1a9GhB8nKIzt7phg0N4bNqOhl98SYDlqrpmQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/cdk": "^15.0.0", + "@angular/common": "^15.0.0", + "@angular/core": "^15.0.0", + "@angular/platform-browser": "^15.0.0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/nice-napi": { + "version": "1.0.2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "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": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^12.13 || ^14.13 || >=16" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "dependencies": { + "abbrev": "^1.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "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/npm-bundled": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", + "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.0.0.tgz", + "integrity": "sha512-SBU9oFglRVZnfElwAtF14NivyulDqF1VKqqwNsFW9HDcbHMAPHpRSsVFgKuwFGq/hVvWZExz62Th0kvxn/XE7Q==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz", + "integrity": "sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "dev": true, + "dependencies": { + "ignore-walk": "^6.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz", + "integrity": "sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.0", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", + "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", + "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", + "dev": true, + "dependencies": { + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", + "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-typescript-codegen": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.27.0.tgz", + "integrity": "sha512-QyQEod/vuel3zfnTRC3GgmYsqLPSBzB2OL4ojMYjO9hJmfYW02T+7tbQWEnuqWdhh2KSOBf3L8h59vLStr6vwA==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^10.1.0", + "camelcase": "^6.3.0", + "commander": "^11.1.0", + "fs-extra": "^11.2.0", + "handlebars": "^4.7.8" + }, + "bin": { + "openapi": "bin/index.js" + } + }, + "node_modules/openapi-typescript-codegen/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-typescript-codegen/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/openapi-typescript-codegen/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/openapi-typescript-codegen/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/openapi-typescript-codegen/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/optimism": { + "version": "0.16.2", + "license": "MIT", + "dependencies": { + "@wry/context": "^0.7.0", + "@wry/trie": "^0.3.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "dev": true, + "license": "MIT", + "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-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/ora/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", + "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^4.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "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-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.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "devOptional": true, + "dependencies": { + "entities": "^4.4.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-html-rewriting-stream/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "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/parse5/node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbf": { + "version": "3.2.1", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/piscina": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/plotly.js-basic-dist-min": { + "version": "2.18.2", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-loader": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", + "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "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": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "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/potpack": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "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==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.0", + "license": "MIT" + }, + "node_modules/protractor": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.1.7", + "yargs": "^15.3.1" + }, + "bin": { + "protractor": "bin/protractor", + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=10.13.x" + } + }, + "node_modules/protractor/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/ansi-styles": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/chalk": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/cliui": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/protractor/node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/protractor/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/protractor/node_modules/source-map": { + "version": "0.5.7", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/source-map-support": { + "version": "0.4.18", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.5.6" + } + }, + "node_modules/protractor/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/supports-color": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/protractor/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/protractor/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/protractor/node_modules/yargs": { + "version": "15.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/protractor/node_modules/yargs-parser": { + "version": "18.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/quickselect": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "dev": true, + "license": "MIT", + "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/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/read-package-json": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.0.tgz", + "integrity": "sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w==", + "dev": true, + "dependencies": { + "glob": "^8.0.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "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/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.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.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "dev": true, + "license": "MIT" + }, + "node_modules/regexpu-core": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.1.tgz", + "integrity": "sha512-nCOzW2V/X15XpLsK2rlgdwrysrBq+AauCn+omItIz4R1pIcmeot5zvjdmOBRLzEH/CkC6IxMJVmxDe3QcMuNVQ==", + "dev": true, + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/request": { + "version": "2.88.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "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/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/response-iterator": { + "version": "0.2.6", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "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.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/safevalues": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", + "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" + }, + "node_modules/sass": { + "version": "1.58.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", + "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", + "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/saucelabs": { + "version": "1.5.0", + "dev": true, + "dependencies": { + "https-proxy-agent": "^2.2.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/saucelabs/node_modules/agent-base": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/saucelabs/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/saucelabs/node_modules/https-proxy-agent": { + "version": "2.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "dev": true, + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "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/selenium-webdriver": { + "version": "3.6.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "engines": { + "node": ">= 6.9.0" + } + }, + "node_modules/selenium-webdriver/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/selenium-webdriver/node_modules/tmp": { + "version": "0.0.30", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-dsl": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.3.0" + } + }, + "node_modules/semver-dsl/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "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.1", + "dev": true, + "license": "BSD-3-Clause", + "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.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sigstore": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.0.0.tgz", + "integrity": "sha512-e+qfbn/zf1+rCza/BhIA//Awmf0v1pa5HQS8Xk8iXrn9bgytytVLqYD0P7NSqZ6IELTgq+tcDvLPkQjNHyWLNg==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^11.0.1", + "tuf-js": "^1.0.0" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", + "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", + "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", + "dev": true, + "dependencies": { + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "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.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "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-explorer": { + "version": "2.5.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "btoa": "^1.2.1", + "chalk": "^4.1.0", + "convert-source-map": "^1.7.0", + "ejs": "^3.1.5", + "escape-html": "^1.0.3", + "glob": "^7.1.6", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "open": "^7.3.1", + "source-map": "^0.7.4", + "temp": "^0.9.4", + "yargs": "^16.2.0" + }, + "bin": { + "sme": "bin/cli.js", + "source-map-explorer": "bin/cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/source-map-explorer/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map-explorer/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/source-map-explorer/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/source-map-explorer/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-explorer/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-explorer/node_modules/open": { + "version": "7.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map-explorer/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-explorer/node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "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/source-map-explorer/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", + "dev": true, + "dependencies": { + "abab": "^2.0.6", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 14.15.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", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz", + "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.17.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", + "integrity": "sha512-WVy6di9DlPOeBWEjMScpNipeSX2jIZBGEn5Uuo8Q7aIuFEuDX0pw8RxcOjlD1TWP4obi24ki7m/13+nFpcbXrw==", + "dev": true, + "dependencies": { + "minipass": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "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.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "dev": 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/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/subscriptions-transport-ws": { + "version": "0.9.19", + "license": "MIT", + "dependencies": { + "backo2": "^1.0.2", + "eventemitter3": "^3.1.0", + "iterall": "^1.2.1", + "symbol-observable": "^1.0.4", + "ws": "^5.2.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependencies": { + "graphql": ">=0.10.0" + } + }, + "node_modules/subscriptions-transport-ws/node_modules/eventemitter3": { + "version": "3.1.2", + "license": "MIT" + }, + "node_modules/subscriptions-transport-ws/node_modules/symbol-observable": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/subscriptions-transport-ws/node_modules/ws": { + "version": "7.5.9", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/supercluster": { + "version": "7.1.5", + "license": "ISC", + "dependencies": { + "kdbush": "^3.0.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true + }, + "node_modules/temp": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/terser": { + "version": "5.16.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", + "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "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.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.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/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "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/tinyqueue": { + "version": "2.0.3", + "license": "ISC" + }, + "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-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-helpers": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "typescript": ">=1.8.0 <2.1.0 || >=1.9.0-dev || >=2.0.0-dev || || >=2.1.0-dev" + } + }, + "node_modules/ts-invariant": { + "version": "0.10.3", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "8.10.2", + "dev": true, + "license": "MIT", + "dependencies": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.17", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "typescript": ">=2.7" + } + }, + "node_modules/tslib": { + "version": "2.5.0", + "license": "0BSD" + }, + "node_modules/tslint": { + "version": "6.1.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.3", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.13.0", + "tsutils": "^2.29.0" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + }, + "peerDependencies": { + "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" + } + }, + "node_modules/tslint/node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/tslint/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tslint/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "2.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "peerDependencies": { + "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.1.tgz", + "integrity": "sha512-WTp382/PR96k0dI4GD5RdiRhgOU0rAC7+lnoih/5pZg3cyb3aNMqDozleEEWwyfT3+FOg7Qz9JU3n6A44tLSHw==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.1.tgz", + "integrity": "sha512-8/HcIENyQnfUTCDizRu9rrDyG6XG/21M4X7/YEGZeD76ZJilFPAUVb/2zysFf7VVO1LEjCDFyHp8pMMvozIrvg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz", + "integrity": "sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^4.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.1.tgz", + "integrity": "sha512-t9/wowtf7DYkwz8cfMSt0rMwiyNIBXf5CKZ3S5ZMqRqMYT0oLTp0x1WorMI9WTwvaPg21r1JbFxJMum8JrLGfw==", + "dev": true, + "dependencies": { + "minipass": "^4.0.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "dev": true, + "license": "Unlicense" + }, + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.33", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "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.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "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/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/void-elements": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vt-pbf": { + "version": "3.1.3", + "license": "MIT", + "dependencies": { + "@mapbox/point-geometry": "0.1.0", + "@mapbox/vector-tile": "^1.3.1", + "pbf": "^3.2.1" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webdriver-js-extender": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/webdriver-manager": { + "version": "12.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "adm-zip": "^0.5.2", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + }, + "bin": { + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/webdriver-manager/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/ansi-styles": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/chalk": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/webdriver-manager/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webdriver-manager/node_modules/semver": { + "version": "5.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webdriver-manager/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-manager/node_modules/supports-color": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/webpack": { + "version": "5.75.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.75.0.tgz", + "integrity": "sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "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": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", + "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", + "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.4.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "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/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/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/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": 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/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.11.0", + "dev": true, + "license": "MIT", + "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/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "dev": true, + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "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/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/yn": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/zen-observable": { + "version": "0.8.15", + "license": "MIT" + }, + "node_modules/zen-observable-ts": { + "version": "1.2.5", + "license": "MIT", + "dependencies": { + "zen-observable": "0.8.15" + } + }, + "node_modules/zone.js": { + "version": "0.11.8", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6f2da76 --- /dev/null +++ b/package.json @@ -0,0 +1,87 @@ +{ + "name": "gisaf-app", + "displayName": "Gisaf", + "version": "0.1.0", + "license": "GPL-3.0", + "description": "Gisaf Geomatics", + "repository": { + "type": "git", + "url": "https://git.bluelightav.org:2222/gisaf.git" + }, + "author": "Philippe May", + "angular-cli": {}, + "scripts": { + "ng": "ng", + "start": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng serve --proxy-config proxy.conf.json --watch", + "build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e", + "generate-client": "openapi --input http://127.0.0.1:5000/openapi.json --output ./src/app/openapi --client angular --useOptions --useUnionTypes" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://github.com/angular/angular.io/blob/master/LICENSE" + } + ], + "private": true, + "dependencies": { + "@angular/animations": "^15.2.1", + "@angular/cdk": "^15.2.1", + "@angular/common": "^15.2.1", + "@angular/compiler": "^15.2.1", + "@angular/core": "^15.2.1", + "@angular/forms": "^15.2.1", + "@angular/material": "^15.2.1", + "@angular/platform-browser": "^15.2.1", + "@angular/platform-browser-dynamic": "^15.2.1", + "@angular/platform-server": "^15.2.1", + "@angular/router": "^15.2.1", + "@apollo/client": "^3.4.16", + "@mapbox/point-geometry": "^0.1.0", + "@maplibre/ngx-maplibre-gl": "^13.0.0", + "@turf/bbox": "^6.5.0", + "@turf/distance": "^6.5.0", + "angular-plotly.js": "^4.0.4", + "apollo-angular": "^4.2.1", + "core-js": "^2.6.3", + "graphql": "^15.6.1", + "maplibre-gl": "^2.4.0", + "ngx-flexible-layout": "15.0.1", + "plotly.js-basic-dist-min": "^2.8.1", + "rxjs": "^7.4.0", + "subscriptions-transport-ws": "^0.9.17", + "ts-helpers": "^1.1.2", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^15.2.1", + "@angular/cli": "^15.2.1", + "@angular/compiler-cli": "^15.2.1", + "@angular/language-service": "^15.2.1", + "@types/core-js": "^2.5.0", + "@types/geojson": "^7946.0.7", + "@types/jasmine": "~3.6.0", + "@types/jasminewd2": "^2.0.2", + "@types/node": "^12.11.1", + "@types/plotly.js-dist-min": "^2.3.0", + "clean-css": "^4.2.1", + "codelyzer": "^6.0.0", + "fontnik": "^0.7.1", + "jasmine-core": "~3.6.0", + "jasmine-spec-reporter": "~5.0.0", + "karma": "~6.3.2", + "karma-chrome-launcher": "~3.1.0", + "karma-cli": "^2.0.0", + "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-jasmine": "~4.0.0", + "openapi-typescript-codegen": "^0.27.0", + "protractor": "~7.0.0", + "source-map-explorer": "^2.2.2", + "ts-node": "^8.0.2", + "tslib": "^2.0.0", + "tslint": "~6.1.0", + "typescript": "~4.8.4" + } +} diff --git a/protractor.conf.js b/protractor.conf.js new file mode 100644 index 0000000..7ee3b5e --- /dev/null +++ b/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './e2e/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/proxy.conf.json b/proxy.conf.json new file mode 100644 index 0000000..037f601 --- /dev/null +++ b/proxy.conf.json @@ -0,0 +1,37 @@ +{ + "/static": { + "target": "http://127.0.0.1:5000", + "secure": false + }, + "/gj": { + "target": "http://127.0.0.1:5000", + "secure": false, + "ws": true + }, + "/sched": { + "target": "http://127.0.0.1:8000", + "secure": false + }, + "/_sched": { + "target": "http://127.0.0.1:8000", + "secure": false, + "ws": true + }, + "/api": { + "target": "http://127.0.0.1:5000", + "secure": false, + "ws": true + }, + "/static/tiles": { + "target": "/home/phil/gisaf_misc/map/tiles", + "secure": false, + "changeOrigin": true, + "pathRewrite": { + "^/static/tiles" : "" + } + }, + "/terrain": { + "target": "http://127.0.0.1:8899", + "secure": false + } +} diff --git a/src/app/_models/user.ts b/src/app/_models/user.ts new file mode 100644 index 0000000..4083056 --- /dev/null +++ b/src/app/_models/user.ts @@ -0,0 +1,7 @@ +export class User { + constructor( + public userName: string, + public token: string, + public password?: string, + ) {} +} diff --git a/src/app/_services/actions.service.ts b/src/app/_services/actions.service.ts new file mode 100644 index 0000000..2ff5fa2 --- /dev/null +++ b/src/app/_services/actions.service.ts @@ -0,0 +1,232 @@ +import { Injectable } from '@angular/core' + +import { Observable, pipe, BehaviorSubject } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +import { Tag } from '../info/info-tags/tags.service' +import { TaggedLayer, TaggedFeature, FormFieldInput } from '../info/info-data.service' + +export class ActionParam { + constructor( + public name: string, + public type: string, + public dflt: string, + ) {} +} + +export class Action { + constructor( + public name: string, + public roles: string[], + public params: ActionParam[], + ) {} +} + +export class ActionsStore { + constructor( + public store: string, + public actions: Action[], + ) {} +} + +export class ActionResult { + constructor( + public name: string, + public message: string, + public taggedLayers: TaggedLayer[], + ) {} +} + +export class ActionResults { + constructor( + public name: string, + public message: string, + public actionResults: ActionResult[], + ) {} +} + +export class ActionsResults { + constructor( + public message: string, + public actionResults: ActionResults[], + ) {} +} + +export class ActionAction { + constructor( + public plugin: string, + public name: string, + ) {} +} + + +export class Store { + constructor( + public store: string, + public actions: ActionAction[], + ) {} +} + + +const getTagsActionsQuery = gql` +query actionsPlugins { + actionsPlugins { + store + actions { + name + roles + params { + name + type + dflt + } + } + } +} +` + +const executeTagsActionsQuery = gql` +mutation executeAction( + $stores: [String]!, + $ids: [[String]]!, + $names: [String]!, + $params: [ActionParamInput], + $formFields: [FormFieldInput] +) { + executeAction( + stores: $stores, + ids: $ids, + names: $names, + params: $params, + formFields: $formFields, + ) { + result { + message + actionResults { + name + message + actionResults { + message + taggedLayers { + store + taggedFeatures { + id + lon + lat + tags { + key + value + } + } + } + } + } + } + } +} +` + + +@Injectable() +export class ActionsService { + actionsStores: ActionsStore[] = [] + + public actionsProviderService = new BehaviorSubject([]) + public actionsProviderService$ = this.actionsProviderService.asObservable() + + constructor( + private apollo: Apollo, + ) { + this.getTagsActionsStores().subscribe( + actionsStores => { + this.actionsStores = actionsStores + } + ) + } + + public getTagsActionsStores(): Observable { + return this.apollo.query({ + query: getTagsActionsQuery, + }).pipe(map( + res => { + let actionStores = res['data']['actionsPlugins'].map(pipe( + store => new Store( + store['store'], + store['actions'].map( + action => new Action( + action['name'], + action['roles'], + action['params'].map( + param => new ActionParam( + param['name'], + param['type'], + param['dflt'] + ) + ) + ) + ) + ) + )) + this.actionsProviderService.next(actionStores) + return actionStores + } + )) + } + + public execute( + stores: string[], + ids: string[][], + actionNames: string[], + params: ActionParam[], + formFields?: FormFieldInput[] + ): Observable { + return this.apollo.mutate({ + mutation: executeTagsActionsQuery, + variables: { + stores: stores, + ids: ids, + names: actionNames, + params: params, + formFields: formFields + } + }).pipe(map( + result => result['data']['executeAction']['result'].map( + res => new ActionsResults( + res['message'], + res['actionResults'].map( + r => new ActionResults( + r['name'], + r['message'], + r['actionResults'] && r['actionResults'].map( + actionResults => new ActionResult( + actionResults['name'], + actionResults['message'], + (actionResults['taggedLayers'] || []).map( + taggedLayer => new TaggedLayer( + taggedLayer['store'], + taggedLayer['taggedFeatures'].map( + taggedFeature => new TaggedFeature( + taggedFeature['id'], + taggedFeature['lon'], + taggedFeature['lat'], + taggedFeature['tags'].map( + tag => new Tag( + tag['key'], + tag['value'] + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + )) + } +} diff --git a/src/app/_services/apollo.service.ts b/src/app/_services/apollo.service.ts new file mode 100644 index 0000000..7b3cd95 --- /dev/null +++ b/src/app/_services/apollo.service.ts @@ -0,0 +1,404 @@ +import { Injectable } from '@angular/core' +import { Validators, UntypedFormGroup, UntypedFormControl } from '@angular/forms' + +import { MatTableDataSource } from '@angular/material/table' + +import { Observable, forkJoin } from 'rxjs' +import { map, mergeMap } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +const fieldTypeMap = { + Int: 'number', + Float: 'number', + Boolean: 'checkbox', +} + +const introspectionQuery = gql` + query introspect ($modelName: String!) { + __type(name: $modelName) { + name + fields { + name + type { + name + kind + ofType { + name + } + } + } + } + } +` + +const inspectionQuery = gql` + query inspect ($modelName: String!) { + inspect(modelName: $modelName) { + pkFields + relation_fields + joins { + name + target + rel_field + } + } + } +` + +const dashboardPageQuery = gql` +query dashboard_page ($group: String!, $name: String!) { + dashboard_page(group: $group, name: $name) { + name + group + description + html + notebook + time + dfData + plotData + attachment + expandedPanes + sections { + name + plot + } + } +}` + +export class FieldIntrospection { + constructor( + public name: string, + public type: string, + public primary: boolean = false, + ) {} + + get inputType() { + return fieldTypeMap[this.type] || 'text' + } + + get isTextArea() { + return this.type == 'JSONString' + } + + get isText() { + return this.type == 'String' || this.type == 'Int' || this.type == 'Float' + } + + get isCheckbox() { + return this.type == 'Boolean' + } + + get validator() { + if (this.type == 'ID') { + return Validators.required + } + } +} + +export class ModelIntrospection { + constructor( + public name: string, + public fields: FieldIntrospection[], + public relations: object[], + ) {} + + pkFields(): FieldIntrospection[] { + return this.fields.filter(f => f.primary) + } + + columns(): string[] { + return this.fields.map(f => f.name) + } + + columnsForGql(): string { + return this.columns().join(' ') + } + + get mutationFields(): string { + return this.fields.map(t => '$' + t.name + ':' + t.type).join(',') + } + + get mutationVars(): string { + return this.fields.map(t => t.name + ':$' + t.name).join(',') + } + + get mutationData(): string { + return this.columns().join(',') + } + + getMutationQuery() { + return gql` + mutation mutation(${this.mutationFields}) { + mutation(${this.mutationVars}) { + ${this.mutationData} + } + } + ` + } +} + +export class JoinField { + constructor( + public name: string, + public target: string, + public rel_field: string, + ) {} +} + +export class ModelInspection { + constructor( + public pkFields: string[], + public relations: string[], + public joins: JoinField[], + ) {} + + get joinedFieldNames() { + return this.joins.map(join => join.rel_field) + } +} + +export class DashboardPageSection { + constructor( + public name: string, + public plot: string, + ) {} +} + +export class DashboardPage { + constructor( + public name: string, + public group: string, + public errors: string = undefined, + public description: string = undefined, + public html: string = undefined, + public notebook: string = undefined, + public dfData: MatTableDataSource = undefined, + public plotData: Object = undefined, + public time: Date = undefined, + public attachment: string = undefined, + public expandedPanes: string[] = [], + public sections: DashboardPageSection[] = [] + ) {} +} + +export class Model { + constructor( + public inspection: ModelInspection, + public introspection: ModelIntrospection, + ) {} + + getFormFields(formGroup: UntypedFormGroup, item): FieldIntrospection[] { + // Return the form fields and build the FormGroup controls accordingly + // XXX: move to another class, aka admin.models.Model? + let formFields = [] + this.introspection.fields.forEach( + field => { + // Don't add fields which are in inspection.relations + if (this.inspection.joinedFieldNames.indexOf(field.name) >= 0) { + return + } + let control = new UntypedFormControl(field.name, field.validator) + control.setValue(item[field.name]) + formGroup.addControl(field.name, control) + formFields.push(field) + } + ) + + this.inspection.joins.forEach( + join => { + let control = new UntypedFormControl() + control.setValue(item[join.rel_field]) + formGroup.addControl(join.name, control) + } + ) + + return formFields + } +} + +@Injectable() +export class ModelDataService { + constructor( + private apollo: Apollo + ) {} + + fullInspect(modelName): Observable { + return forkJoin([ + this.inspect(modelName), + this.introspect(modelName), + ]).pipe(map( + res => new Model(res[0], res[1]) + )) + } + + inspect(modelName): Observable { + // Inspection (Gisaf) + return this.get(inspectionQuery, {'modelName': modelName}).pipe(map( + res => { + let joins = res['inspect']['joins'].map( + join => new JoinField(join['name'], join['target'], join['rel_field']) + ) + return new ModelInspection( + res['inspect']['pkFields'], + res['inspect']['relation_fields'], + joins + ) + } + )) + } + + introspect(modelName): Observable { + // Introspection (Graphql) + return this.get(introspectionQuery, {'modelName': modelName}).pipe(map( + res => { + var relations = [] + let _fields = res['__type']['fields'] + // Find the primary keys + var fields = _fields.filter(f => !f.type.name && f.type.kind=='NON_NULL').map( + f => new FieldIntrospection(f.name, f['type']['ofType']['name'], true) + ) + var pkFieldNames = fields.map(f => f.name) + _fields.forEach( + resField => { + let name = resField['name'] + let type = resField['type'] + // Skip primary keys + if (pkFieldNames.indexOf(name) != -1) { + return + } + if (name == 'geom') { + // Remove geom column + // XXX: Should be marked as geojson type + // and might be a link to the map or something like that + return + } + if (type['kind'] == 'OBJECT') { + // Relation + return + } + fields.push(new FieldIntrospection(name, type['name'])) + } + ) + return new ModelIntrospection(modelName, fields, relations) + } + )) + } + + mutate(model: ModelIntrospection, values: object): Observable { + let mutationQuery = model.getMutationQuery() + return this.apollo.mutate({ + mutation: mutationQuery, + variables: values, + }) + } + + resolveItemData(modelName: string, pk: string): Observable { + return this.fullInspect(modelName).pipe( + mergeMap( + model => { + // XXX: get pk type and name from model introspection + let pkField = model.introspection.pkFields()[0] + let query = gql` + query item ($pk: ID) { + ${modelName} (pk:$pk) { + ${model.introspection.columnsForGql()} + } + }` + return this.get(query, {pk: pk}).pipe(map( + item => { + if (item) { + return { + 'item': item, + 'model': model, + } + } + } + )) + } + ) + ) + } + + all(model: ModelIntrospection, fields?: string[]): Observable { + if (!fields) { + fields = model.columns() + } + const fieldList = fields.join(' ') + const query = gql`query model {${model.name}{${fieldList}}}` + return this.get(query) + } + + get(query, vars: object = {}): Observable { + return this.apollo.query({ + query: query, + variables: vars, + errorPolicy: 'all', + }).pipe(map( + result => { + if (result.errors) { + throw result.errors.map(err => err.message).join(', ') + } + else { + return result.data + } + } + )) + } +} + +@Injectable() +export class DashboardDataService { + constructor( + private apollo: Apollo + ) {} + + getDashboardPage(group: string, name: string): Observable { + return this.get(dashboardPageQuery, {'name': name, 'group': group}).pipe(map( + res => { + if (res['errors'] && res['errors'].length > 0) { + return new DashboardPage( + name, + group, + res['errors'].map(e => e.message).join(', '), + ) + } + + let page = res['dashboard_page'] + return new DashboardPage( + page['name'], + page['group'], + '', + page['description'], + page['html'], + page['notebook'], + JSON.parse(page['dfData']), + JSON.parse(page['plotData']), + page['time'], + page['attachment'], + page['expandedPanes'], + page['sections'] ? page['sections'].map( + section => new DashboardPageSection( + section['name'], + section['plot'] + ) + ) : [] + ) + } + )) + } + + get(query, vars: object = {}): Observable { + return this.apollo.query({ + query: query, + variables: vars + }).pipe(map( + result => { + if (result.errors && result.errors.length > 0) { + return result + } + return result.data + } + )) + } +} diff --git a/src/app/_services/authentication.service.spec.ts b/src/app/_services/authentication.service.spec.ts new file mode 100644 index 0000000..3129336 --- /dev/null +++ b/src/app/_services/authentication.service.spec.ts @@ -0,0 +1,16 @@ +/* tslint:disable:no-unused-variable */ + +import { TestBed, inject, waitForAsync } from '@angular/core/testing'; +import { AuthenticationService } from './authentication.service'; + +describe('AuthenticationService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [AuthenticationService] + }); + }); + + it('should ...', inject([AuthenticationService], (service: AuthenticationService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/_services/authentication.service.ts b/src/app/_services/authentication.service.ts new file mode 100644 index 0000000..80bf45d --- /dev/null +++ b/src/app/_services/authentication.service.ts @@ -0,0 +1,125 @@ +import { Injectable } from '@angular/core' + +import { HttpClient, HttpHeaders } from '@angular/common/http' +import { Observable, BehaviorSubject, from, throwError } from 'rxjs' +import { map, catchError } from 'rxjs/operators' + +import { User } from '../_models/user' +import { RoleReadNoUsers } from '../openapi' + +interface AuthResponse { + access_token: string, + roles: string[] +} + +@Injectable() +export class AuthenticationService { + user = new BehaviorSubject(undefined) + user$ = this.user.asObservable() + roles: RoleReadNoUsers[] = [] + + constructor( + private _http: HttpClient, + ) { + // set token if saved in local storage + this.user.next(JSON.parse(localStorage.getItem('user'))) + } + + isLoggedIn() : Observable { + if (!this.user.value) { + return from([false]) + } + let body = JSON.stringify({ + token: this.user.value.token, + }) + return this._http.post( + '/auth/isLoggedIn', + body, + { + headers: new HttpHeaders({ 'Content-Type': 'application/json' }) + } + ).pipe( + map(resp => true), + catchError( + err => { + const userName = this.user.value['userName'] + this.user.next(undefined) + this.roles = [] + localStorage.removeItem('user') + return throwError( + () => new Error('Session of user "' + userName + '" expired.') + ) + } + ) + ) + } + + login(userName: string, password: string): Observable { + let body = JSON.stringify({ + userName: userName, + password: password + }) + return this._http.post( + '/auth/login', + body, + { + headers: new HttpHeaders({ 'Content-Type': 'application/json' }) + } + ).pipe(map( + (response: AuthResponse) => { + // login successful if there's a jwt token in the response + let token = response.access_token + if (token) { + //const decodedToken = this.helper.decodeToken(token) + // store userName and jwt token in local storage to keep user logged in between page refreshes + localStorage.setItem('user', + JSON.stringify({ + userName: userName, + token: token, + roles: response.roles, + }) + ) + + console.log('TODO: AuthenticationService roles to be set by refreshing bootstrap') + // this.roles = response.roles + + // Notify + this.user.next(new User(userName, token)) + + // return true to indicate successful login + return true + } else { + this.user.next(undefined) + this.roles = [] + // return false to indicate failed login + return false + } + } + )) + } + + logout(): boolean { + // XXX: not completly safe: the server might be down: + // We should actually *check* that the logout response is OK and display message + // clear token remove user from local storage to log user out + let has_token: boolean = this.user.value && !!this.user.value.token + localStorage.removeItem('user') + this.user.next(undefined) + this.roles = [] + + // Tell server that the user has logged out + if (has_token) { + this._http.get('/auth/logout').subscribe(response => {}) + } + return has_token + } + + logoutAdmin(): void { + } + + isAuthorized(roles: string[]) { + // Return true if at least one role in given list matches one role of the authenticated user + if (roles.length == 0) return true + return this.roles.filter(value => -1 !== roles.indexOf(value.name)).length > 0 + } +} diff --git a/src/app/_services/bootstrap.service.spec.ts b/src/app/_services/bootstrap.service.spec.ts new file mode 100644 index 0000000..7f27ed8 --- /dev/null +++ b/src/app/_services/bootstrap.service.spec.ts @@ -0,0 +1,16 @@ +/* tslint:disable:no-unused-variable */ + +import { TestBed, inject, waitForAsync } from '@angular/core/testing'; +import { BootstrapService } from './bootstrap.service'; + +describe('BootstrapService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [BootstrapService] + }); + }); + + it('should ...', inject([BootstrapService], (service: BootstrapService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/_services/bootstrap.service.ts b/src/app/_services/bootstrap.service.ts new file mode 100644 index 0000000..47ab738 --- /dev/null +++ b/src/app/_services/bootstrap.service.ts @@ -0,0 +1,15 @@ +import { Injectable } from '@angular/core' +import { Observable } from 'rxjs' + +import { ApiService, BootstrapData } from '../openapi' + +@Injectable() +export class BootstrapService { + constructor( + private api: ApiService, + ){ } + + get(): Observable { + return this.api.bootstrapApiBootstrapGet() + } +} diff --git a/src/app/_services/data.service.ts b/src/app/_services/data.service.ts new file mode 100644 index 0000000..6f75da0 --- /dev/null +++ b/src/app/_services/data.service.ts @@ -0,0 +1,72 @@ +import { Injectable } from '@angular/core' +import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http' +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' + +export class MeasuresItem { + constructor( + public $uri: string, + public caption: string, + ) {} + get id(): string { + return this.$uri.substr(this.$uri.lastIndexOf('/') + 1) + } + get name(): string { + return this.caption || this.id + } +} + +export class MeasuresItemsList { + constructor( + public items: MeasuresItem[] + ) {} +} + + +@Injectable() +export class DataService { + constructor(private _http: HttpClient){ } + + getResources(): Observable { + return this._http.get('/api/list') + } + + getList(store: string): Observable { + return this._http.get('/api/' + store).pipe( + map(res => res.map( + item => new MeasuresItem(item['$uri'], item['caption']) + )) + ) + } + + getValues( + store: string, + id: number, + value: string, + sampling?: string, + format: string = 'json', + rangeFrom?: string, + rangeTo?: string + ): Observable> { + let p = {} + let s = {} + p[store] = id + if (rangeFrom && rangeTo) { + p['time'] = {"$between": [rangeFrom, rangeTo]} + } + s['time'] = false + let params = new HttpParams() + .set('where', JSON.stringify(p)) + .set('sort', JSON.stringify(s)) + .set('resample', sampling) + .set('format', format) + // FIXME: add the name of the value to fetch + return this._http.get( + '/api/' + store + '/values/' + value, + { + params: params, + observe: 'response' + } + ) + } +} diff --git a/src/app/_services/geojson.service.ts b/src/app/_services/geojson.service.ts new file mode 100644 index 0000000..f73f175 --- /dev/null +++ b/src/app/_services/geojson.service.ts @@ -0,0 +1,102 @@ +import { Injectable } from '@angular/core' +import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http' + +import { Observable, forkJoin } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +import { WebsocketService } from '../_services/websocket.service' + +const getLayerQuery = gql` +query mapboxStyle($store: String!) { + mapboxStyle (store: $store) { + paint + layout + attribution + } +} +` + +export class MapboxStyle { + constructor( + public paint: string, + public layout: string, + public attribution: string, + ) {} +} + + +export class MapboxDataAndStyle { + constructor( + public data: object, + public style: MapboxStyle, + ) {} +} + + +@Injectable() +export class GeoJsonService { + constructor( + private _http: HttpClient, + private apollo: Apollo + ) {} + + getLayer(url: string, params?: object): Observable { + if (!params) { + params = {} + } + return this._http.get(url, { + headers: params, + }) + } + + getStyle(store: string): Observable { + return this.apollo.query({ + query: getLayerQuery, + variables: { + store: store + }, + errorPolicy: 'all', + }).pipe(map( + result => new MapboxStyle( + result['data']['mapboxStyle']['paint'], + result['data']['mapboxStyle']['layout'], + result['data']['mapboxStyle']['attribution'], + ) + )) + } + + getAll(url: string, store: string, params?: object): Observable { + return forkJoin([ + this.getLayer(url, params), + this.getStyle(store), + ]).pipe(map( + res => new MapboxDataAndStyle(res[0], res[1]) + )) + } +} + + +@Injectable() +export class LiveGeoJsonService { + messages = {} + ws: any + constructor( + private wsService: WebsocketService + ) {} + + connect(channel: string) { + const hostname = window.location.hostname + const port = window.location.port + let protocol = window.location.protocol == 'https:' ? 'wss:' : 'ws:' + this.wsService.connect( + protocol + '//' + hostname + ':' + port + '/gj/live/' + channel + ) + return this.wsService.ws + } + + disconnect() { + this.wsService.disconnect() + } +} \ No newline at end of file diff --git a/src/app/_services/websocket.service.ts b/src/app/_services/websocket.service.ts new file mode 100644 index 0000000..b3050b7 --- /dev/null +++ b/src/app/_services/websocket.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core' +import { Subject, Observable, Observer } from 'rxjs' +import { webSocket, WebSocketSubject } from 'rxjs/webSocket' + +@Injectable() +export class WebsocketService { + ws: WebSocketSubject + + public connect(url: string, openObserver?: Subject, closeObserver?: Subject) { + this.ws = webSocket({ + url: url, + openObserver: openObserver, + closeObserver: closeObserver + }) + } + + public disconnect() { + if (this.ws) { + this.ws.complete() + } + } + + public subscribe(message: string) { + return this.ws.next('subscribe/' + message) + } + + public unsubscribe(message: string) { + return this.ws.next('unsubscribe/' + message) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-basket/admin-basket-item/basket-item.component.css b/src/app/admin/admin-basket/admin-basket-item/basket-item.component.css new file mode 100644 index 0000000..0b9bf94 --- /dev/null +++ b/src/app/admin/admin-basket/admin-basket-item/basket-item.component.css @@ -0,0 +1,6 @@ +.item { + border: 1px solid grey; + margin: 0 3px; + padding: 0 2px; + border-radius: 3px; +} diff --git a/src/app/admin/admin-basket/admin-basket-item/basket-item.component.html b/src/app/admin/admin-basket/admin-basket-item/basket-item.component.html new file mode 100644 index 0000000..590deaf --- /dev/null +++ b/src/app/admin/admin-basket/admin-basket-item/basket-item.component.html @@ -0,0 +1,17 @@ +
+
+ {{ file.path }} +
+
+ {{ file.url }} +
+
+ {{ file.status }} +
+
+ {{ file.store }} +
+
+ {{ file.time }} +
+
\ No newline at end of file diff --git a/src/app/admin/admin-basket/admin-basket-item/basket-item.component.ts b/src/app/admin/admin-basket/admin-basket-item/basket-item.component.ts new file mode 100644 index 0000000..cf001ed --- /dev/null +++ b/src/app/admin/admin-basket/admin-basket-item/basket-item.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit, Input, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' +import { ActivatedRoute } from '@angular/router' + +import { AdminDataService } from '../../admin-data.service' +import { AdminBasketFile } from '../data.service' + +@Component({ + selector: 'gisaf-admin-basket-item', + templateUrl: './basket-item.component.html', + styleUrls: ['./basket-item.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminBasketItemComponent implements OnInit { + constructor( + public adminDataService: AdminDataService, + private route: ActivatedRoute, + private cdr: ChangeDetectorRef, + ) {} + + @Input() file: AdminBasketFile + + ngOnInit() { + } +} \ No newline at end of file diff --git a/src/app/admin/admin-basket/admin-basket-resolver.service.ts b/src/app/admin/admin-basket/admin-basket-resolver.service.ts new file mode 100644 index 0000000..17511c8 --- /dev/null +++ b/src/app/admin/admin-basket/admin-basket-resolver.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core' +import { Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable, forkJoin } from 'rxjs' +import { map } from 'rxjs/operators' + +import { AdminBasket, AdminBasketDataService } from './data.service' + +@Injectable() +export class BasketResolver implements Resolve { + constructor( + private router: Router, + private basketDataService: AdminBasketDataService, + ) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + var name = route.paramMap.get('name') + return this.basketDataService.getBasket(name) + } +} diff --git a/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.css b/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.css new file mode 100644 index 0000000..4f77430 --- /dev/null +++ b/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.css @@ -0,0 +1,30 @@ +.container { + display: flex; + flex-direction: row; + justify-content: space-evenly; +} + +.container mat-form-field { + flex: 1 1 0; +} + +.container form { + border: 1px solid grey; + padding: 2px 1em; + border-radius: 0.6em; + margin-bottom: 3px; + background-color: #424242; +} + +.importButtonGroup { + flex: 5 1 0; + display: inline-block; +} + +mat-form-field.store { + width: 18em; +} + +mat-form-field.status { + width: 4em; +} \ No newline at end of file diff --git a/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.html b/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.html new file mode 100644 index 0000000..c8e290a --- /dev/null +++ b/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.html @@ -0,0 +1,76 @@ +
+
+ + Project + + + {{ item.name }} + + + + + Surveyor + + + {{ item.name }} + + + + + Equipment + + + {{ item.name }} + + + + + Store + + + {{ item.name }} + + + + + Store + + + {{ item.name }} + + + + + Status + + + {{ item }} + + + + +
+ + + Auto import + +
+ +
+
\ No newline at end of file diff --git a/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.ts b/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.ts new file mode 100644 index 0000000..1b9b967 --- /dev/null +++ b/src/app/admin/admin-basket/admin-basket-upload/basket-upload.component.ts @@ -0,0 +1,115 @@ +import { Component, OnInit, Input, ViewChild, ElementRef, + ChangeDetectorRef, ChangeDetectionStrategy, SimpleChanges, OnChanges } from '@angular/core' +import { HttpClient } from '@angular/common/http' +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms' + +import { MatTableDataSource } from '@angular/material/table' + +import { AdminDataService } from '../../admin-data.service' +import { AdminBasketFile, AdminBasket } from '../data.service' +import { MatSnackBar } from '@angular/material/snack-bar' +import { HtmlSnackbarComponent } from '../../../custom-snackbar/custom-snackbar.component' + +@Component({ + selector: 'gisaf-admin-basket-upload', + templateUrl: './basket-upload.component.html', + styleUrls: ['./basket-upload.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminBasketUploadComponent implements OnInit, OnChanges { + constructor( + public adminDataService: AdminDataService, + private cdr: ChangeDetectorRef, + private http: HttpClient, + private snackBar: MatSnackBar, + ) {} + + @ViewChild('fileInput') fileInput: ElementRef + @Input() basket: AdminBasket + @Input() dataSource: MatTableDataSource + + //upload_fields = ['store', 'status', 'project', 'surveyor', 'equipment'] + + formGroup: UntypedFormGroup = new UntypedFormGroup({}) + + ngOnInit() { + let defaults = this.adminDataService.surveyMeta.defaults + this.formGroup = new UntypedFormGroup({ + 'store_misc': new UntypedFormControl(defaults['store_misc'], [Validators.required]), + 'store_line_work': new UntypedFormControl(defaults['store_line_work'], [Validators.required]), + 'status': new UntypedFormControl(defaults['status'], [Validators.required]), + 'project': new UntypedFormControl(defaults['project'], [Validators.required]), + 'surveyor': new UntypedFormControl(defaults['surveyor'], [Validators.required]), + 'equipment': new UntypedFormControl(defaults['equipment'], [Validators.required]), + 'autoImport': new UntypedFormControl(true), + }) + this.setupRequired() + } + + ngOnChanges(changes: SimpleChanges) { + this.setupRequired() + } + + setupRequired() { + for (let field in this.formGroup.controls) { + if (this.basket.uploadFields.includes(field)) { + this.formGroup.controls[field].setValidators(Validators.required) + } + else { + this.formGroup.controls[field].clearValidators() + } + this.formGroup.controls[field].updateValueAndValidity({onlySelf: true}) + } + this.formGroup.updateValueAndValidity({onlySelf: true}) + } + + onFileUpload() { + const formData = new FormData() + formData.append('file', this.fileInput.nativeElement.files[0]) + let fg = this.formGroup.getRawValue() + for (let field in fg) { + if (this.basket.uploadFields.indexOf(field) != -1) { + formData.append(field, fg[field]) + } + } + formData.append('autoImport', this.formGroup.get('autoImport').value) + this.http.post('upload/basket/' + this.basket.name, formData).subscribe( + resp => { + let importResult = resp['import_result'] + const importTime = resp['time'] || (importResult && importResult['time']) + const fileImport = new AdminBasketFile( + resp['id'], + resp['dir'], + resp['name'], + resp['url'], + resp['md5'], + importTime && new Date(importTime), + resp['comment'], + resp['status'], + resp['store'], + resp['project'], + resp['surveyor'], + resp['equipment'], + ) + this.dataSource.data.push(fileImport) + this.dataSource.data = this.dataSource.data + let msg = 'File ' + fileImport.name + ' added to basket' + if (importResult) { + this.snackBar.openFromComponent(HtmlSnackbarComponent, { + data: importResult + //duration: 3000 + }) + + } + else { + this.snackBar.open(msg, 'Close') + } + this.cdr.markForCheck() + } + ) + } + + is_upload_field_hidden(fname: string) { + return this.basket.uploadFields.indexOf(fname)==-1 + } +} \ No newline at end of file diff --git a/src/app/admin/admin-basket/basket.component.css b/src/app/admin/admin-basket/basket.component.css new file mode 100644 index 0000000..affa1a2 --- /dev/null +++ b/src/app/admin/admin-basket/basket.component.css @@ -0,0 +1,66 @@ +h1 { + margin-top: 0; + margin-bottom: 0; +} + +gisaf-admin-basket-upload { + flex: 1 1 0; +} + +.filter button { + min-width: 1em!important; +} + +.cdk-column-delete, .cdk-column-import { + max-width: 4em; + width: 3em; +} + +.cdk-column-name>span { + cursor: pointer; +} + +.even { + background-color: #f5f5f512; +} + +.tools { + display: flex; +} + +.tools .filter { + width: 10em; +} + +.tools .upload { + flex: 1 1 0; +} + +:host ::ng-deep th.mat-mdc-header-cell, :host ::ng-deep td.mat-mdc-cell, :host ::ng-deep td.mat-mdc-footer-cell { + padding: 0 0.5em; +} + +:host ::ng-deep td.mat-mdc-cell { + border-bottom-style: inherit; +} + +table.content { + width: 100%; +} + +.mat-column-delete, .mat-column-import { + width: 3em; + text-align: center; +} + +th.mat-mdc-header-cell:first-of-type, td.mat-mdc-cell:first-of-type, td.mat-mdc-footer-cell:first-of-type { + padding-left: inherit; +} + +th.mat-mdc-header-cell:last-of-type, td.mat-mdc-cell:last-of-type, td.mat-mdc-footer-cell:last-of-type { + padding-right: inherit; +} + +td .mat-mdc-button { + min-width: inherit ! important; +} \ No newline at end of file diff --git a/src/app/admin/admin-basket/basket.component.html b/src/app/admin/admin-basket/basket.component.html new file mode 100644 index 0000000..9fff863 --- /dev/null +++ b/src/app/admin/admin-basket/basket.component.html @@ -0,0 +1,107 @@ +
+

Basket: {{ basket.name }}

+
+ + Filter table + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+ + Import + + Name + {{ item.name }} + Store{{ item.store }}Import time{{ isDate(item.time) ? (item.time | date:'dd/MM/yyyy, HH:mm:ss') : 'never' }}URL{{ item.url }}Status{{ item.status }}Project{{ item.project }}Surveyor{{ item.surveyor }}Equipment{{ item.equipment }}
+ + + +
\ No newline at end of file diff --git a/src/app/admin/admin-basket/basket.component.ts b/src/app/admin/admin-basket/basket.component.ts new file mode 100644 index 0000000..debd6ec --- /dev/null +++ b/src/app/admin/admin-basket/basket.component.ts @@ -0,0 +1,107 @@ +import { Component, OnInit, Input, ViewChild, ElementRef, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' +import { ActivatedRoute } from '@angular/router' +import { UntypedFormGroup, UntypedFormControl } from '@angular/forms' + +import { SelectionModel } from '@angular/cdk/collections' +import { MatPaginator } from '@angular/material/paginator' +import { MatSnackBar } from '@angular/material/snack-bar' +import { MatSort } from '@angular/material/sort' +import { MatTableDataSource } from '@angular/material/table' + +import { AdminDataService } from '../admin-data.service' +import { AdminBasketDataService, AdminBasket, AdminBasketFile } from './data.service' +import { HtmlSnackbarComponent } from '../../custom-snackbar/custom-snackbar.component' + +@Component({ + selector: 'gisaf-admin-basket', + templateUrl: './basket.component.html', + styleUrls: ['./basket.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminBasketComponent implements OnInit { + constructor( + public adminDataService: AdminDataService, + public adminBasketDataService: AdminBasketDataService, + private route: ActivatedRoute, + private snackBar: MatSnackBar, + private cdr: ChangeDetectorRef, + ) {} + + basket: AdminBasket + dataSource: MatTableDataSource + @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator + @ViewChild(MatSort, {static: true}) sort: MatSort + selection = new SelectionModel(true, []) + unlockDeleteFormGroup: UntypedFormGroup = new UntypedFormGroup({}) + columns: string[] = [ + 'name', + 'status', + 'time', + 'store', + 'project', + 'surveyor', + 'equipment', + 'import', + 'delete', + ] + filterText: string + + ngOnInit() { + this.route.data.subscribe( + (basket: object) => { + this.basket = basket['basket'] + this.dataSource = new MatTableDataSource(this.basket.files) + this.dataSource.sort = this.sort + this.dataSource.paginator = this.paginator + this.cdr.markForCheck() + } + ) + this.unlockDeleteFormGroup = new UntypedFormGroup({ + 'canDelete': new UntypedFormControl(), + }) + } + + getColumns() { + return this.columns.filter( + col => this.basket.columns.indexOf(col) != -1 + ) + } + + applyFilter() { + this.dataSource.filter = this.filterText.trim().toLowerCase() + } + + download(item: AdminBasketFile) { + window.open('/download/basket/' + this.basket.name + '/' + item.id + '/' + item.name) + } + + importItem(item: AdminBasketFile, dryRun: boolean) { + this.adminBasketDataService.importItem(this.basket.name, item.id, dryRun).subscribe( + resp => { + this.basket.files.find(row => row.id == item.id).time = new Date(resp.time) + this.snackBar.openFromComponent(HtmlSnackbarComponent, { + data: resp, + //duration: 3000 + }) + this.cdr.markForCheck() + } + ) + } + + deleteItem(item: AdminBasketFile) { + this.adminBasketDataService.deleteItem(this.basket.name, item.id).subscribe( + id => { + let dsi = this.dataSource.data.findIndex(fi => fi['id'] == id) + this.dataSource.data.splice(dsi, 1) + // Force Angular change detection (??) + this.dataSource.data = this.dataSource.data + this.cdr.markForCheck() + } + ) + } + + isDate(val: any) { + return val instanceof Date && isFinite(val) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-basket/data.service.ts b/src/app/admin/admin-basket/data.service.ts new file mode 100644 index 0000000..c171397 --- /dev/null +++ b/src/app/admin/admin-basket/data.service.ts @@ -0,0 +1,223 @@ +import { Injectable } from '@angular/core' + +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +import { Project } from '../admin-data.service' + +export class AdminBasketFile { + constructor( + public id: number, + public dir: string, + public name: string, + public url: string, + public md5: string, + public time: Date, + public comment: string, + public status: string, + public store: string, + public project: string, + public surveyor: string, + public equipment: string, + public import_result?: string, + ) {} +} + +export class AdminBasket { + constructor( + public name: string, + public files?: AdminBasketFile[], + public columns?: string[], + public uploadFields?: string[], + public projects?: Project[], + ) {} +} + +export class BasketImportResult { + constructor( + public time: Date, + public message: string, + public details?: string, + ) {} +} + +export class AdminBasketUploadFieldData { + constructor( + public stores: string[], + public statuses: string[], + public projects: string[], + public surveyors: string[], + public equipments: string[], + ) {} +} + +const getAdminBasketsQuery = gql` +query admin_baskets { + admin_baskets { + name + } +} +` + +const getAdminBasketUploadFieldDataQuery = gql` +query admin_basket_upload_field_data { + admin_basket_upload_field_data { + store + status + project + surveyor + equipment + } +} +` + +const getAdminBasketQuery = gql` +query admin_basket ($name: String!) { + admin_basket (name: $name) { + name + files { + id + name + dir + url + md5 + time + comment + status + store + project + surveyor + equipment + } + columns + uploadFields + projects + } +} +` + +const deleteAdminBasketItemMutation = gql` +mutation deleteBasketItem ($basket: String!, $id: Int!) { + deleteBasketItem (basket: $basket, id: $id) { + result + } +} +` + +const importAdminBasketItemMutation = gql` +mutation importBasketItem ($basket: String!, $id: Int!, $dryRun: Boolean) { + importBasketItem (basket: $basket, id: $id, dryRun: $dryRun) { + result { + message + time + details + } + } +} +` + +@Injectable() +export class AdminBasketDataService { + constructor( + private apollo: Apollo, + ) {} + + getBaskets(): Observable { + // Get the list a basket names + return this.apollo.query({ + query: getAdminBasketsQuery, + }).pipe(map( + res => res['data']['admin_baskets'].map( + (data: object) => new AdminBasket( + data['name'], + ) + ) + )) + } + + getBasketUploadFieldData(): Observable { + // Get the list a basket names + return this.apollo.query({ + query: getAdminBasketUploadFieldDataQuery, + }).pipe(map( + res => res['data']['admin_basket_upload_field_data'].map( + (data: object) => new AdminBasketUploadFieldData( + data['store'], + data['status'], + data['project'], + data['surveyor'], + data['equipment'], + ) + ) + )) + } + + getBasket(name: string): Observable { + // Get all info and content of a basket + return this.apollo.query({ + query: getAdminBasketQuery, + variables: { + name: name + } + }).pipe(map( + res => { + let data = res['data']['admin_basket'] + return new AdminBasket( + data['name'], + data['files'].map(file => new AdminBasketFile( + file['id'], + file['dir'], + file['name'], + file['url'], + file['md5'], + new Date(file['time']), + file['comment'], + file['status'], + file['store'], + file['project'], + file['surveyor'], + file['equipment'], + )), + data['columns'], + data['uploadFields'], + // XXX: the proejct id isn't actually used in the UI, + // but required in class definition + data['projects'] && data['projects'].map( + (projectName: string) => new Project(undefined, projectName) + ), + ) + } + )) + } + + importItem(basket: string, id: number, dryRun: boolean=false): Observable { + return this.apollo.mutate({ + mutation: importAdminBasketItemMutation, + variables: { + basket: basket, + id: id, + dryRun: dryRun + } + }).pipe(map( + resp => new BasketImportResult( + resp['data']['importBasketItem']['result']['time'], + resp['data']['importBasketItem']['result']['message'], + JSON.parse(resp['data']['importBasketItem']['result']['details']), + ) + )) + } + + deleteItem(basket: string, id: number) { + return this.apollo.mutate({ + mutation: deleteAdminBasketItemMutation, + variables: { + basket: basket, + id: id, + } + }).pipe(map( + resp => resp['data']['deleteBasketItem']['result'] + )) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-data.service.ts b/src/app/admin/admin-data.service.ts new file mode 100644 index 0000000..b5a997e --- /dev/null +++ b/src/app/admin/admin-data.service.ts @@ -0,0 +1,125 @@ +import { Injectable, Input } from '@angular/core' +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +import { Store } from './admin-manage/data.service' + +export class Project { + constructor( + public id: number, + public name: string, + ) {} +} + +export class Surveyor { + constructor( + public id: number, + public name: string, + ) {} +} + +export class Equipment { + constructor( + public id: number, + public name: string, + ) {} +} + +export class SurveyMeta { + constructor( + public projects: Project[], + public surveyors: Surveyor[], + public equipments: Equipment[], + public statuses: string[], + public stores_misc: Store[], + public stores_line_work: Store[], + public defaults: Object + ) {} +} + +const getSurveyMeta = gql` +query survey_meta { + survey_meta { + projects { + id + name + } + surveyors { + id + name + } + equipments { + id + name + } + stores_misc { + name + } + stores_line_work { + name + } + statuses + default + } +} +` + +const admin_models_menu_bar_query = gql` +query admin_models_menu_bar { + admin_models_menu_bar{ + name + items{ + name + module + } + } +}` + +@Injectable() +export class AdminDataService { + surveyMeta: SurveyMeta + + constructor( + private apollo: Apollo, + ) {} + + getModelsMenuBar(): Observable { + return this.apollo.query({ + query: admin_models_menu_bar_query + }).pipe(map( + res => res['admin_models_menu_bar_query'] + )) + } + + getSurveyMeta(): Observable { + return this.apollo.query({ + query: getSurveyMeta, + }).pipe(map( + resp => { + let data = resp['data']['survey_meta'] + this.surveyMeta = new SurveyMeta( + data['projects'].map( + item => new Project(item['id'], item['name']) + ).sort((i, j) => i.name > j.name ? 1 : -1), + data['surveyors'].map( + item => new Surveyor(item['id'], item['name']) + ).sort((i, j) => i.name > j.name ? 1 : -1), + data['equipments'].map( + item => new Equipment(item['id'], item['name']) + ).sort((i, j) => i.name > j.name ? 1 : -1), + data['statuses'], + data['stores_misc'].map( + item => new Store(item['name']) + ).sort((i, j) => i.name > j.name ? 1 : -1), + data['stores_line_work'].map( + item => new Store(item['name']) + ).sort((i, j) => i.name > j.name ? 1 : -1), + JSON.parse(data['default']), + ) + return this.surveyMeta + } + )) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-detail/admin-detail-resolver.service.ts b/src/app/admin/admin-detail/admin-detail-resolver.service.ts new file mode 100644 index 0000000..eeb73bb --- /dev/null +++ b/src/app/admin/admin-detail/admin-detail-resolver.service.ts @@ -0,0 +1,31 @@ +import { Injectable } from '@angular/core' +import { Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' + +import { ModelDataService } from '../../_services/apollo.service' + +@Injectable() +export class DetailResolver implements Resolve { + constructor( + private modelDataService: ModelDataService, + private router: Router + ) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + var pk = route.paramMap.get('pk') + var modelName = route.paramMap.get('modelName') + + return this.modelDataService.resolveItemData(modelName, pk).pipe(map( + res => { + if (!res) { + this.router.navigate(['/admin', modelName]) + } + else { + return res + } + } + )) + + } +} diff --git a/src/app/admin/admin-detail/admin-detail.component.css b/src/app/admin/admin-detail/admin-detail.component.css new file mode 100644 index 0000000..63cd928 --- /dev/null +++ b/src/app/admin/admin-detail/admin-detail.component.css @@ -0,0 +1,58 @@ +/*@import '../node_modules/@angular/material/prebuilt-themes/purple-green.css';*/ + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card { + margin: 0 3px; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card .form { + display: flex; + flex-wrap: wrap; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card .form>* { + /*display: block;*/ + margin: 0 2px; +} + +textarea { + height: 5em; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card-footer { + text-align: center; + padding-bottom: 8px; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card-footer > button { + margin: 0 8px; +} + +/* +.form { + display: flex; + flex-wrap: wrap; +} + +.form>div>* { + margin: 0 1em; +} +*/ + +mat-form-field.field-symbol input { + font-family: GisafSymbols; + font-size: 200%; + text-align: center; +} + +mat-form-field.field-symbol { + width: 4em; +} + +mat-form-field.field-id { + width: 4em; +} diff --git a/src/app/admin/admin-detail/admin-detail.component.html b/src/app/admin/admin-detail/admin-detail.component.html new file mode 100644 index 0000000..a29cead --- /dev/null +++ b/src/app/admin/admin-detail/admin-detail.component.html @@ -0,0 +1,52 @@ + + + {{ modelName }} #{{ pk }} + + +
+ + + {{ field.name }} + + + {{ field.name }} + + + + {{ field.name }} + + + + + + + +
+
+ + + + +
diff --git a/src/app/admin/admin-detail/admin-detail.component.ts b/src/app/admin/admin-detail/admin-detail.component.ts new file mode 100644 index 0000000..cf49e2b --- /dev/null +++ b/src/app/admin/admin-detail/admin-detail.component.ts @@ -0,0 +1,88 @@ +import { Component, Input, ViewChild, OnInit, HostBinding, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' +import { ActivatedRoute, ParamMap, Router } from '@angular/router' +import { UntypedFormGroup, FormControl } from '@angular/forms' + +import { fadeInAnimation } from '../../animations' +import { + ModelDataService, + Model, + FieldIntrospection, +} from '../../_services/apollo.service' + +@Component({ + selector: 'gisaf-admin-detail', + templateUrl: './admin-detail.component.html', + styleUrls: ['./admin-detail.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [ fadeInAnimation ] +}) + +export class AdminDetailComponent implements OnInit { + /* + @HostBinding('@fadeInAnimation') fadeInAnimation = true + @HostBinding('style.display') display = 'block' + @HostBinding('style.position') position = 'absolute' + */ + + @Input() modelName: string + @Input() pk: string + model: Model + item: object + formGroup: UntypedFormGroup + fields: FieldIntrospection[] + + constructor( + protected route: ActivatedRoute, + protected router: Router, + public modelDataService: ModelDataService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + // Set an empty formGroup + this.formGroup = new UntypedFormGroup({}) + // In case i'm initiated with the route resolver: + // TODO: use secondary route + this.route.data.subscribe( + (data) => { + if (Object.keys(data).length != 0) { + this.route.params.subscribe( + params => { + let item = data['item'] + // FIXME (with secondary route) + /* + this.setItem( + params['modelName'], + item['model'], + item['item'][params['modelName']][0], + ) + */ + } + ) + } + } + ) + } + + setItem(modelName, model, item) { + // Fill me with the provided model and item data + // Can be called from the init and route resolver or manually (map, etc) + this.formGroup = new UntypedFormGroup({}) + this.modelName = modelName + this.item = item + this.model = model + // Get the form fields and build the formGroup controls + this.fields = this.model.getFormFields(this.formGroup, item) + this.pk = this.item[this.model.introspection.pkFields()[0].name] + this.cdr.markForCheck() + } + + submit() { + this.modelDataService.mutate(this.model.introspection, this.formGroup.value).subscribe( + res => { + console.log('TODO: submit', res) + } + ) + } +} diff --git a/src/app/admin/admin-detail/admin-detail.module.ts b/src/app/admin/admin-detail/admin-detail.module.ts new file mode 100644 index 0000000..0b1e070 --- /dev/null +++ b/src/app/admin/admin-detail/admin-detail.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { ReactiveFormsModule } from '@angular/forms' + +import { MatButtonModule } from '@angular/material/button' +import { MatCardModule } from '@angular/material/card' +import { MatCheckboxModule } from '@angular/material/checkbox' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatIconModule } from '@angular/material/icon' +import { MatInputModule } from '@angular/material/input' +import { MatSelectModule } from '@angular/material/select' + +import { JoinSelectComponent } from './join-select.component' + +import { AdminDetailComponent } from './admin-detail.component' + +@NgModule({ + imports: [ + CommonModule, + + ReactiveFormsModule, + + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatSelectModule, + ], + declarations: [ + AdminDetailComponent, + JoinSelectComponent + ], + exports: [ + AdminDetailComponent, + JoinSelectComponent + ] +}) +export class AdminDetailModule { } diff --git a/src/app/admin/admin-detail/join-select.component.html b/src/app/admin/admin-detail/join-select.component.html new file mode 100644 index 0000000..deeae6b --- /dev/null +++ b/src/app/admin/admin-detail/join-select.component.html @@ -0,0 +1,14 @@ + + {{ join.name }} + + + {{ choice['name'] }} + + + diff --git a/src/app/admin/admin-detail/join-select.component.ts b/src/app/admin/admin-detail/join-select.component.ts new file mode 100644 index 0000000..9381b5b --- /dev/null +++ b/src/app/admin/admin-detail/join-select.component.ts @@ -0,0 +1,42 @@ +import { Component, Input, ViewChild, OnInit, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { UntypedFormGroup, FormControl } from '@angular/forms' + +import { map, switchMap } from 'rxjs/operators' + +import { gql } from 'apollo-angular' + +import { ModelDataService, JoinField } from '../../_services/apollo.service' +import { Relation } from '../models' + +@Component({ + selector: 'join-select', + templateUrl: './join-select.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class JoinSelectComponent implements OnInit { + @Input() join: JoinField + @Input() formGroup: UntypedFormGroup + choices: object[] + + constructor( + protected modelDataService: ModelDataService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + var modelName = this.join.target.split('.').pop() + let query = gql`query model {${modelName}{name id}}` + this.modelDataService.get(query).pipe(map(data => { + return data[modelName] + })).subscribe(data => { + this.choices = data.map( + item => { + return {id: +item['id'], name: item['name']} + } + ) + this.cdr.markForCheck() + }) + } +} diff --git a/src/app/admin/admin-home/admin-home.component.css b/src/app/admin/admin-home/admin-home.component.css new file mode 100644 index 0000000..30f8d87 --- /dev/null +++ b/src/app/admin/admin-home/admin-home.component.css @@ -0,0 +1 @@ +/*@import '../node_modules/@angular/material/prebuilt-themes/purple-green.css';*/ diff --git a/src/app/admin/admin-home/admin-home.component.html b/src/app/admin/admin-home/admin-home.component.html new file mode 100644 index 0000000..1989705 --- /dev/null +++ b/src/app/admin/admin-home/admin-home.component.html @@ -0,0 +1,9 @@ + + Gisaf admin/control center + +

+ This is the adminstration area: baskets for importing files, + tools for the management of the database... +

+
+
diff --git a/src/app/admin/admin-home/admin-home.component.ts b/src/app/admin/admin-home/admin-home.component.ts new file mode 100644 index 0000000..3530833 --- /dev/null +++ b/src/app/admin/admin-home/admin-home.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core' + + +@Component({ + selector: 'gisaf-admin-home', + templateUrl: './admin-home.component.html', + styleUrls: ['./admin-home.component.css'] +}) +export class AdminHomeComponent {} diff --git a/src/app/admin/admin-list/admin-list.component.css b/src/app/admin/admin-list/admin-list.component.css new file mode 100644 index 0000000..3f0473e --- /dev/null +++ b/src/app/admin/admin-list/admin-list.component.css @@ -0,0 +1,77 @@ +/*@import '../node_modules/@angular/material/prebuilt-themes/purple-green.css';*/ + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card { + margin: 0 3px; +} + +table { + width: 100% +} + +.mat-mdc-header-cell { + font-weight: 800; + font-size: 14px; + background-color: #2f2f2f; +} + +td.mat-mdc-cell:first-child, th.mat-mdc-header-cell:first-child { + padding-left: 2px; +} + +td.mat-mdc-cell, th.mat-mdc-header-cell { + border-left: 1px solid rgba(255,255,255,.12); + padding: 2px; +} + +td.mat-mdc-cell:last-child, th.mat-mdc-header-cell:last-child { + border-right: 1px solid #8080802b; + padding-right: 2px; +} + +tr.mat-mdc-header-row { + height: 2em; +} + +tr.mat-mdc-row { + height: inherit; +} + +.cdk-column-select { + width: 1em; +} + +.cdk-column-actions { + width: 2em; +} + +td.mat-column-symbol>div { + font-family: GisafSymbols; + font-size: 200%; + text-align: center; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card-footer { + display: flex; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card-footer .actions { + align-self: center; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card-footer .actions { + margin: 2px; +} + +/*TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version.*/ +mat-card-footer .filter { + margin: auto; +} + +td.mat-mdc-cell>div { + max-height: 5em; + overflow-y: auto; +} diff --git a/src/app/admin/admin-list/admin-list.component.html b/src/app/admin/admin-list/admin-list.component.html new file mode 100644 index 0000000..18b6aa9 --- /dev/null +++ b/src/app/admin/admin-list/admin-list.component.html @@ -0,0 +1,79 @@ + + {{ model.name }} + + + + + + + + + + + + + + + + + +
+ + + + + + + + + {{ colName }} +
+ {{ element[colName] }} +
+
+
+ +
+ + +
+ + Filter + + + + +
+
diff --git a/src/app/admin/admin-list/admin-list.component.spec.ts b/src/app/admin/admin-list/admin-list.component.spec.ts new file mode 100644 index 0000000..8a90e60 --- /dev/null +++ b/src/app/admin/admin-list/admin-list.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { AdminListComponent } from './admin-list.component'; + +describe('AdminListComponent', () => { + let component: AdminListComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ AdminListComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-list/admin-list.component.ts b/src/app/admin/admin-list/admin-list.component.ts new file mode 100644 index 0000000..7ed9796 --- /dev/null +++ b/src/app/admin/admin-list/admin-list.component.ts @@ -0,0 +1,121 @@ +import { Component, Input, ViewChild, OnInit, HostBinding, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' +import { ActivatedRoute, ParamMap, Router } from '@angular/router' + +import { SelectionModel } from '@angular/cdk/collections' +import { MatPaginator } from '@angular/material/paginator' +import { MatSnackBar } from '@angular/material/snack-bar' +import { MatSort } from '@angular/material/sort' +import { MatTableDataSource } from '@angular/material/table' + +import { map, switchMap } from 'rxjs/operators' + +import { slideInDownAnimation } from '../../animations' + +import { ModelDataService, ModelIntrospection, FieldIntrospection } from '../../_services/apollo.service' +//import { TableDataSource } from './datasource' + +@Component({ + selector: 'gisaf-admin-list', + templateUrl: './admin-list.component.html', + styleUrls: ['./admin-list.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + animations: [ slideInDownAnimation ] +}) +export class AdminListComponent implements OnInit { + /* + @HostBinding('@slideInDownAnimation') slideInDownAnimation = true + @HostBinding('style.display') display = 'block' + @HostBinding('style.position') position = 'absolute' + */ + + dataSource: MatTableDataSource + @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator + @ViewChild(MatSort, {static: true}) sort: MatSort + model: ModelIntrospection + allColumns: string[] = [] + pageIndex: number + pageSize: number + selection = new SelectionModel(true, []) + + constructor( + protected route: ActivatedRoute, + protected router: Router, + protected dataService: ModelDataService, + public snackBar: MatSnackBar, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + this.route.params.subscribe(params => { + this.setModel(params['modelName']) + }) + } + + setModel(modelName) { + if (!modelName) { + return + } + this.dataService.introspect(modelName).subscribe( + res => { + this.model = res + this.allColumns = ['select', 'actions'].concat(this.model.columns()) + this.getData() + }, + ) + } + + getData() { + this.dataService.all(this.model).pipe(map(data => { + return data[this.model.name] + })).subscribe({ + next: data => { + if (data) { + this.dataSource = new MatTableDataSource(data) + this.dataSource.paginator = this.paginator + this.dataSource.sort = this.sort + } + else { + this.dataSource = new MatTableDataSource([]) + } + this.cdr.markForCheck() + }, + error: err => { + this.snackBar.open(err, 'close', {duration: 3000}) + } + }) + } + + /** Whether the number of selected elements matches the total number of rows. */ + isAllSelected() { + const numSelected = this.selection.selected.length + const numRows = this.dataSource.data.length + return numSelected === numRows + } + + /** Selects all rows if they are not all selected; otherwise clear selection. */ + masterToggle() { + this.isAllSelected() ? + this.selection.clear() : + this.dataSource.data.forEach(row => this.selection.select(row)) + } + + applyFilter(target: EventTarget) { + let filterValue = target['value'] + this.dataSource.filter = filterValue.trim().toLowerCase() + + if (this.dataSource.paginator) { + this.dataSource.paginator.firstPage() + } + } + + showDetail(item) { + this.router.navigate(['/admin/model', this.model.name, item[this.model.pkFields()[0].name]]) + } + + add() { + } + + deleteSelected() { + } +} diff --git a/src/app/admin/admin-manage/access/access-data.service.ts b/src/app/admin/admin-manage/access/access-data.service.ts new file mode 100644 index 0000000..661b20e --- /dev/null +++ b/src/app/admin/admin-manage/access/access-data.service.ts @@ -0,0 +1,404 @@ +import { Injectable } from '@angular/core' + +import { Observable, BehaviorSubject, forkJoin } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +import { MatDialog } from '@angular/material/dialog' + +import { GisafAdminAccessRoleDialogComponent } from './role-dialog.component' +import { GisafAdminAccessUserDialogComponent } from './user-dialog.component' +import { Role, User, ACL } from './models' + + +const getUsersQuery = gql` +query users { + users { + id + name + email + active + } +} +` + +const getRolesQuery = gql` +query getRoles { + roles { + id + name + description + } +} +` + +const getAclsQuery = gql` +query acls { + acls { + user_id + role_ids + } +} +` + +const addUserRoleMutation = gql` +mutation addUserRole( + $user_id: Int!, + $role_id: Int!, +) { + addUserRole( + user_id: $user_id, + role_id: $role_id, + ) { + result + } +} +` + +const deleteUserRoleMutation = gql` +mutation deleteUserRole( + $user_id: Int!, + $role_id: Int!, +) { + deleteUserRole( + user_id: $user_id, + role_id: $role_id, + ) { + result + } +} +` + +const deleteUserMutation = gql` +mutation deleteUser( + $id: Int!, +) { + deleteUser( + id: $id, + ) { + id + } +} +` + +const deleteRoleMutation = gql` +mutation deleteRole( + $id: Int!, +) { + deleteRole( + id: $id, + ) { + id + } +} +` + +const saveRoleMutation = gql` +mutation saveRole( + $id: Int, + $name: String!, + $description: String! +) { + saveRole ( + id: $id, + name: $name, + description: $description + ) { + id + } +} +` + +const saveUserMutation = gql` +mutation saveUser( + $id: Int, + $name: String!, + $email: String!, + $password: String, + $active: Boolean!, +) { + saveUser ( + id: $id, + name: $name, + email: $email, + active: $active, + password: $password + ) { + id + } +} +` + +@Injectable() +export class AdminManageAccessDataService { + constructor( + private apollo: Apollo, + public dialog: MatDialog, + ) {} + + private _users = new BehaviorSubject([]) + private _roles = new BehaviorSubject([]) + private _acls = new BehaviorSubject([]) + users$: Observable = this._users.asObservable() + roles$: Observable = this._roles.asObservable() + acls$: Observable = this._acls.asObservable() + + init() { + this.getAllAccessData().subscribe() + this.acls$.subscribe( + (acls: ACL[]) => { + /* + acls.forEach( + (acl: ACL) => { + // Scan all the list of users, should be an object + let user: User = this._users.value.find(u=>u.id==acl.user_id) + user._roles.next(acl.role_ids.map( + role_id => this._roles.value.find( + (role: Role) => role.id == role_id + ) + )) + } + ) + } + */ + this._users.value.forEach( + (user: User) => { + let acl: ACL = acls.find(a => a.user_id == user.id) + // Scan all the list of roles, should be an object (optimize) + if (acl && acl.role_ids) { + user._roles.next(acl.role_ids.map( + role_id => this._roles.value.find( + (role: Role) => role.id == role_id + ) + )) + } + else { + user._roles.next([]) + } + } + ) + } + ) + } + + getUsers(): Observable { + return this.apollo.query({ + query: getUsersQuery, + }).pipe(map( + res => + res['data']['users'].map( + // Really create an object because User has roles in its constructor + (item: object) => new User( + item['id'], + item['name'], + item['email'], + item['active'], + ) + ) + ) + ) + } + + getRoles(): Observable { + return this.apollo.query({ + query: getRolesQuery, + }).pipe(map( + res => + res['data']['roles'].map( + (item: object) => item as Role + ) + ) + ) + } + + getACLs(): Observable { + return this.apollo.query({ + query: getAclsQuery, + }).pipe(map( + res => + res['data']['acls'].map( + (item: object) => item as ACL + ) + ) + ) + } + + getAllAccessData(): Observable { + return forkJoin([ + this.getUsers(), + this.getRoles(), + this.getACLs(), + ]).pipe(map( + ([users, roles, acls]) => { + this._users.next(users) + this._roles.next(roles) + this._acls.next(acls) + + } + )) + } + + getUserRoles(user: User): Role[] { + let roles = this._acls.value.find( + userRole => userRole.user_id === user.id + ) + if (!roles) { + return [] + } + return roles.role_ids.map( + role_id => this._roles.value.find( + role => role.id == role_id + ) + ) + } + + addUserRole(user: User, role: Role) { + return this.apollo.mutate({ + mutation: addUserRoleMutation, + variables: { + user_id: user.id, + role_id: role.id + } + }).pipe(map( + res => { + this.getACLs().subscribe( + res => this._acls.next(res) + ) + return res['data']['addUserRole'] + } + )) + } + + deleteUserRole(user: User, role: Role) { + return this.apollo.mutate({ + mutation: deleteUserRoleMutation, + variables: { + user_id: user.id, + role_id: role.id + } + }).pipe(map( + res => { + this.getACLs().subscribe( + res => this._acls.next(res) + ) + return res['data']['deleteUserRole'] + } + )) + } + + deleteUser(user: User) { + return this.apollo.mutate({ + mutation: deleteUserMutation, + variables: { + id: user.id, + } + }).pipe(map( + res => res['data']['deleteUser'] + )) + } + + deleteRole(role: Role) { + return this.apollo.mutate({ + mutation: deleteRoleMutation, + variables: { + id: role.id, + } + }).pipe(map( + res => res['data']['deleteRole'] + )) + } + + saveRole(role: Role) { + return this.apollo.mutate({ + mutation: saveRoleMutation, + variables: { + id: role.id, + name: role.name, + description: role.description + } + }).pipe(map( + res => res['data']['saveRole'] + )) + } + + saveUser(user: User) { + return this.apollo.mutate({ + mutation: saveUserMutation, + variables: { + id: user.id, + name: user.name, + email: user.email, + active: user.active, + password: user.password, + } + }).pipe(map( + res => res['data']['saveUser'] + )) + } + + openUserDialog(user?: User) { + const dialogRef = this.dialog.open(GisafAdminAccessUserDialogComponent, { + width: '75%', + data: { + 'user': user + } + }) + dialogRef.afterClosed().subscribe( + (user: User) => user && + this.saveUser( + user + ).subscribe({ + next: (name: string) => { + if (user) { + // Update + //let row = this.dataSource.data.findIndex(c=>c['name'] == name) + //this.dataSource.data[row] = user + } + else { + // New + this.saveUser(user) + } + this.init() + }, + error: err => { + // Popup the dialog again, the error is catched by Apollo + this.openUserDialog(user) + } + }) + ) + } + + openRoleDialog(role?: Role) { + const dialogRef = this.dialog.open(GisafAdminAccessRoleDialogComponent, { + width: '75%', + data: { + 'role': role + } + }) + dialogRef.afterClosed().subscribe( + (role: Role) => role && + this.saveRole( + role + ).subscribe({ + next: (name: string) => { + if (role) { + // Update + //let row = this.dataSource.data.findIndex(c=>c['name'] == name) + //this.dataSource.data[row] = role + } + else { + // New + this.saveRole(role) + } + this.init() + }, + error: err => { + // Popup the dialog again, the error is catched by Apollo + this.openRoleDialog(role) + } + }) + ) + } + +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/models.ts b/src/app/admin/admin-manage/access/models.ts new file mode 100644 index 0000000..14d10cc --- /dev/null +++ b/src/app/admin/admin-manage/access/models.ts @@ -0,0 +1,31 @@ +import { Observable, BehaviorSubject } from 'rxjs' + +export class User { + _roles: BehaviorSubject + roles$: Observable + constructor( + public id: number, + public name: string, + public email: string, + public active: boolean, + public password?: string, + ) { + this._roles = new BehaviorSubject([]) + this.roles$ = this._roles.asObservable() + } +} + +export class Role { + constructor( + public id: number, + public name: string, + public description: string, + ) {} +} + +export class ACL { + constructor( + public user_id: number, + public role_ids: number[], + ) {} +} diff --git a/src/app/admin/admin-manage/access/role-dialog.component.css b/src/app/admin/admin-manage/access/role-dialog.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/admin/admin-manage/access/role-dialog.component.html b/src/app/admin/admin-manage/access/role-dialog.component.html new file mode 100644 index 0000000..a1d7206 --- /dev/null +++ b/src/app/admin/admin-manage/access/role-dialog.component.html @@ -0,0 +1,32 @@ +

Edit role

+ +
+
+ + id + + + + Name + + + + Description + + +
+
+ + +
+
\ No newline at end of file diff --git a/src/app/admin/admin-manage/access/role-dialog.component.ts b/src/app/admin/admin-manage/access/role-dialog.component.ts new file mode 100644 index 0000000..635f1d5 --- /dev/null +++ b/src/app/admin/admin-manage/access/role-dialog.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit, Inject } from '@angular/core' +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms' + +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog' + +import { Role } from './models' + +export interface DialogData { + role: Role +} + +@Component({ + selector: 'gisaf-admin-access-role-dialog', + templateUrl: 'role-dialog.component.html', + styleUrls: ['role-dialog.component.css'], +}) +export class GisafAdminAccessRoleDialogComponent implements OnInit { + formGroup: UntypedFormGroup = new UntypedFormGroup({}) + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData + ) {} + + ngOnInit() { + let role: Role = this.data['role'] || new Role(undefined, '', '') + this.formGroup.addControl('id', new UntypedFormControl(role.id)) + this.formGroup.addControl('name', new UntypedFormControl(role.name, [Validators.required])) + this.formGroup.addControl('description', new UntypedFormControl(role.description, [Validators.required])) + } + + save() { + this.dialogRef.close(this.formGroup.value); + } +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/role.component.css b/src/app/admin/admin-manage/access/role.component.css new file mode 100644 index 0000000..7731d27 --- /dev/null +++ b/src/app/admin/admin-manage/access/role.component.css @@ -0,0 +1,26 @@ +.container { + border: 1px solid grey; + border-radius: 5px; + margin: 2px; + background-color: #424242; + cursor: pointer; + padding: 1px; + font-size: 110%; +} + +.titleBar .mat-mdc-button { + line-height: inherit; + min-width: inherit ! important; +} + +.titleBar .mat-mdc-button .mat-icon{ + height: inherit; + width: inherit; + font-size: inherit; + vertical-align: inherit; +} + +.name { + padding: 2px 3px; + text-align: center; +} diff --git a/src/app/admin/admin-manage/access/role.component.html b/src/app/admin/admin-manage/access/role.component.html new file mode 100644 index 0000000..8165c2a --- /dev/null +++ b/src/app/admin/admin-manage/access/role.component.html @@ -0,0 +1,13 @@ +
+
+
+ {{ role.name }} +
+ + +
+
\ No newline at end of file diff --git a/src/app/admin/admin-manage/access/role.component.ts b/src/app/admin/admin-manage/access/role.component.ts new file mode 100644 index 0000000..8cacad1 --- /dev/null +++ b/src/app/admin/admin-manage/access/role.component.ts @@ -0,0 +1,31 @@ +import { Component, ChangeDetectorRef, ChangeDetectionStrategy, Input } from '@angular/core' + +import { Role } from './models' +import { AdminManageAccessDataService } from './access-data.service' + +@Component({ + selector: 'gisaf-admin-role', + templateUrl: './role.component.html', + styleUrls: ['./role.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminRoleComponent { + @Input() role: Role + + constructor( + private cdr: ChangeDetectorRef, + public adminManageAccessDataService: AdminManageAccessDataService, + ) {} + + delete() { + this.adminManageAccessDataService.deleteRole(this.role).subscribe( + res => { + this.adminManageAccessDataService.init() + } + ) + } + + edit() { + this.adminManageAccessDataService.openRoleDialog(this.role) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/user-dialog.component.css b/src/app/admin/admin-manage/access/user-dialog.component.css new file mode 100644 index 0000000..05810b3 --- /dev/null +++ b/src/app/admin/admin-manage/access/user-dialog.component.css @@ -0,0 +1,3 @@ +.mat-mdc-dialog-content { + height: 20em; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/user-dialog.component.html b/src/app/admin/admin-manage/access/user-dialog.component.html new file mode 100644 index 0000000..cdd6319 --- /dev/null +++ b/src/app/admin/admin-manage/access/user-dialog.component.html @@ -0,0 +1,47 @@ +

Edit user

+ +
+
+ + id + + + + Name + + + + Password + + + + + Email + + + + Active + +
+
+ + +
+
\ No newline at end of file diff --git a/src/app/admin/admin-manage/access/user-dialog.component.ts b/src/app/admin/admin-manage/access/user-dialog.component.ts new file mode 100644 index 0000000..439c367 --- /dev/null +++ b/src/app/admin/admin-manage/access/user-dialog.component.ts @@ -0,0 +1,37 @@ +import { Component, OnInit, Inject } from '@angular/core' +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms' + +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog' + +import { User } from './models' + +export interface DialogData { + user: User +} + +@Component({ + selector: 'gisaf-admin-access-user-dialog', + templateUrl: 'user-dialog.component.html', + styleUrls: ['user-dialog.component.css'], +}) +export class GisafAdminAccessUserDialogComponent implements OnInit { + formGroup: UntypedFormGroup + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData + ) {} + + ngOnInit() { + let user: User = this.data['user'] || new User(undefined, '', '', true) + this.formGroup = new UntypedFormGroup({}) + this.formGroup.addControl('id', new UntypedFormControl(user.id)) + this.formGroup.addControl('name', new UntypedFormControl(user.name, [Validators.required])) + this.formGroup.addControl('email', new UntypedFormControl(user.email, [Validators.required, Validators.email])) + this.formGroup.addControl('password', new UntypedFormControl('')) + this.formGroup.addControl('active', new UntypedFormControl(user.active)) + } + + save() { + this.dialogRef.close(this.formGroup.value); + } +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/user.component.css b/src/app/admin/admin-manage/access/user.component.css new file mode 100644 index 0000000..36b0331 --- /dev/null +++ b/src/app/admin/admin-manage/access/user.component.css @@ -0,0 +1,49 @@ +.container { + border: 1px solid grey; + border-radius: 5px; + margin: 1px; + background-color: #424242; + cursor: pointer; + padding: 3px; +} + +.inactive .name { + color: #ffc0c0; + font-weight: 400; + font-style: italic; +} + +.titleBar .mat-mdc-button { + line-height: inherit; + min-width: inherit ! important; +} + +.titleBar .mat-mdc-button .mat-icon{ + height: inherit; + width: inherit; + font-size: inherit; + vertical-align: inherit; +} + +.name { + font-weight: 600; + padding-left: 2px; + padding-bottom: 0.5em; + font-size: 115%; + text-align: center; + color: #aaccbf; +} + +.chips { + width: 100%; +} + +.cdk-drop-list { + min-height: 1.5em; +} + +.mat-mdc-standard-chip.mat-mdcc-chip-with-trailing-icon { + min-height: 1.5em; + padding-right: 3px; + padding-left: 8px; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/user.component.html b/src/app/admin/admin-manage/access/user.component.html new file mode 100644 index 0000000..1494642 --- /dev/null +++ b/src/app/admin/admin-manage/access/user.component.html @@ -0,0 +1,26 @@ +
+
+
+ {{ user.name }} +
+ + +
+ + + {{ role.name }} + cancel + + +
\ No newline at end of file diff --git a/src/app/admin/admin-manage/access/user.component.ts b/src/app/admin/admin-manage/access/user.component.ts new file mode 100644 index 0000000..cc06990 --- /dev/null +++ b/src/app/admin/admin-manage/access/user.component.ts @@ -0,0 +1,40 @@ +import { Component, ChangeDetectorRef, ChangeDetectionStrategy, Input } from '@angular/core' +import {COMMA, ENTER} from '@angular/cdk/keycodes' + +import { User, Role } from './models' +import { AdminManageAccessDataService } from './access-data.service' + +@Component({ + selector: 'gisaf-admin-user', + templateUrl: './user.component.html', + styleUrls: ['./user.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminUserComponent { + @Input() user: User + readonly separatorKeysCodes: number[] = [ENTER, COMMA]; + + constructor( + private cdr: ChangeDetectorRef, + public adminManageAccessDataService: AdminManageAccessDataService, + ) {} + + drop(evt) { + // Assign a role to the user + this.adminManageAccessDataService.addUserRole(this.user, evt.item.data['role']).subscribe() + } + + removeUserRole(user: User, role: Role) { + this.adminManageAccessDataService.deleteUserRole(user, role).subscribe() + } + + delete() { + this.adminManageAccessDataService.deleteUser(this.user).subscribe( + res => this.adminManageAccessDataService.init() + ) + } + + edit() { + this.adminManageAccessDataService.openUserDialog(this.user) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/users-roles.component.css b/src/app/admin/admin-manage/access/users-roles.component.css new file mode 100644 index 0000000..fbed3f8 --- /dev/null +++ b/src/app/admin/admin-manage/access/users-roles.component.css @@ -0,0 +1,24 @@ +h1 { + margin: 0; +} + +.deleteItem { + height: 2em; + border: 1px solid grey; +} + +.users { + padding: 0 1em; +} + +gisaf-admin-user { + padding: 0; +} + +.roles { + padding: 0 1em; +} + +gisaf-admin-role { + padding: 0; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/access/users-roles.component.html b/src/app/admin/admin-manage/access/users-roles.component.html new file mode 100644 index 0000000..17b9237 --- /dev/null +++ b/src/app/admin/admin-manage/access/users-roles.component.html @@ -0,0 +1,30 @@ +
+

Users and roles

+
+
+
Users
+ +
+ + +
+
+ +
+
Roles (Drag to users) +
+ + +
+ + +
+
+
+
\ No newline at end of file diff --git a/src/app/admin/admin-manage/access/users-roles.component.ts b/src/app/admin/admin-manage/access/users-roles.component.ts new file mode 100644 index 0000000..aa1c3c5 --- /dev/null +++ b/src/app/admin/admin-manage/access/users-roles.component.ts @@ -0,0 +1,22 @@ +import { Component, OnInit, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' +import { ActivatedRoute } from '@angular/router' + +import { AdminManageAccessDataService } from './access-data.service' + +@Component({ + selector: 'gisaf-admin-users-roles', + templateUrl: './users-roles.component.html', + styleUrls: ['./users-roles.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminAccessComponent implements OnInit { + constructor( + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + public adminManageAccessDataService: AdminManageAccessDataService, + ) {} + + ngOnInit() { + this.adminManageAccessDataService.init() + } +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/category/category-resolver.service.ts b/src/app/admin/admin-manage/category/category-resolver.service.ts new file mode 100644 index 0000000..0a4def7 --- /dev/null +++ b/src/app/admin/admin-manage/category/category-resolver.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core' +import { Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' + +import { AdminManageDataService, Category } from '../data.service' + + +@Injectable() +export class CategoryResolver implements Resolve { + constructor( + private adminManageDataService: AdminManageDataService, + private router: Router + ) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.adminManageDataService.getCategories() + } +} diff --git a/src/app/admin/admin-manage/category/category.component.css b/src/app/admin/admin-manage/category/category.component.css new file mode 100644 index 0000000..ee4ba9b --- /dev/null +++ b/src/app/admin/admin-manage/category/category.component.css @@ -0,0 +1,51 @@ +h1 { + margin-top: 0; + margin-bottom: 0; +} + +.tools button { + width: 12em; +} + +.filter button { + min-width: 1.5em!important; + max-width: 1.5em; +} + +td.cdk-column-symbol { + font-family: "GisafSymbols"; + font-size: 2em; +} + +table { + width: 100%; +} + +.even { + background-color: #f5f5f512; +} + +.unlockCheckbox { + text-align: center; +} + +td .mat-mdc-button { + min-width: inherit ! important; +} + +.mat-column-delete, .mat-column-edit { + width: 3em; + text-align: center; +} + +.mat-column-symbol { + width: 3em; +} + +th.mat-mdc-header-cell:first-of-type, td.mat-mdc-cell:first-of-type, td.mat-mdc-footer-cell:first-of-type { + padding-left: inherit; +} + +th.mat-mdc-header-cell:last-of-type, td.mat-mdc-cell:last-of-type, td.mat-mdc-footer-cell:last-of-type { + padding-right: inherit; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/category/category.component.html b/src/app/admin/admin-manage/category/category.component.html new file mode 100644 index 0000000..3e7b4d0 --- /dev/null +++ b/src/app/admin/admin-manage/category/category.component.html @@ -0,0 +1,82 @@ +

Survey categories

+
+ + Filter in table + + + + + +
+ + + + + + + + + + + + + + + + + + +
{{ field }}{{ item[field] }} +
+ + +
+
+ + Edit + +
+ + + \ No newline at end of file diff --git a/src/app/admin/admin-manage/category/category.component.ts b/src/app/admin/admin-manage/category/category.component.ts new file mode 100644 index 0000000..7afc653 --- /dev/null +++ b/src/app/admin/admin-manage/category/category.component.ts @@ -0,0 +1,136 @@ +import { Component, OnInit, + ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core' +import { ActivatedRoute } from '@angular/router' +import { UntypedFormGroup, UntypedFormControl } from '@angular/forms' + +import { MatTableDataSource } from '@angular/material/table' +import { MatSnackBar } from '@angular/material/snack-bar' +import { MatSort } from '@angular/material/sort' +import { MatPaginator } from '@angular/material/paginator' +import { MatDialog } from '@angular/material/dialog' + +import { GisafAdminCategoryDialogComponent } from './dialog.component' +import { Category, AdminManageDataService } from '../data.service' +import { AuthenticationService } from '../../../_services/authentication.service' +import { CategoryField, categoryFields } from './fields' + +@Component({ + selector: 'gisaf-admin-category', + templateUrl: './category.component.html', + styleUrls: ['./category.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class CategoryComponent implements OnInit { + edit_roles = ['category manager'] + categories: Category[] = [] + fields: string[] = categoryFields.map(f=>f.name) + actions: string[] = [ + 'edit', + 'delete' + ] + columns: string[] + dataSource: MatTableDataSource + @ViewChild(MatSort, {static: true}) sort: MatSort + @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator + unlockDeleteFormGroup: UntypedFormGroup = new UntypedFormGroup({}) + filterText: string + + constructor( + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + private snackBar: MatSnackBar, + private adminManageDataService: AdminManageDataService, + public authenticationService: AuthenticationService, + public dialog: MatDialog, + ) {} + + ngOnInit() { + this.route.data.subscribe( + data => { + this.categories = data['categories'] + this.dataSource = new MatTableDataSource(this.categories) + this.dataSource.sort = this.sort + this.dataSource.paginator = this.paginator + this.cdr.markForCheck() + } + ) + this.unlockDeleteFormGroup = new UntypedFormGroup({ + 'canDelete': new UntypedFormControl(), + }) + this.columns = categoryFields.filter(f=>f.inTable).map(f=>f.name) + if (this.authenticationService.isAuthorized(this.edit_roles)) { + this.columns = this.columns.concat(this.actions) + } + } + + applyFilter() { + this.dataSource.filter = this.filterText.trim().toLowerCase(); + } + + editItem(data?: Category) { + const dialogRef = this.dialog.open(GisafAdminCategoryDialogComponent, { + width: '75%', + data: { + 'category': data || new Category(''), + } + }) + dialogRef.afterClosed().subscribe( + (category: Category) => category && + this.adminManageDataService.saveCategory( + category + ).subscribe({ + next: (result: object) => { + let _mode: string = result['_mode'] + if (_mode == 'updated') { + let row = this.dataSource.data.findIndex(c=>c['name'] == category.name) + this.dataSource.data[row] = category + } + else { + this.dataSource.data.push(category as Category) + } + let msg = 'Category ' + category.name + ' ' + result['_mode'] + if (result['message']) { + msg += result['message'] + } + this.snackBar.open(msg, 'Close') + this.dataSource.data = this.dataSource.data + this.cdr.markForCheck() + }, + error: err => { + // Popup the dialog again, the error is catched by Apollo + console.error(err) + this.editItem(category) + } + }) + ) + } + + deleteItem(category: Category) { + this.adminManageDataService.deleteCategory(category).subscribe({ + next: (message: string) => { + this.snackBar.open(message, 'Close') + // Remove from table + let dsi = this.dataSource.data.findIndex(fi => fi['name'] == category.name) + this.dataSource.data.splice(dsi, 1) + // Force Angular change detection (??) + this.dataSource.data = this.dataSource.data + this.cdr.markForCheck() + }, + error: err => { + this.snackBar.open(err, 'Close') + } + }) + } + + updateRegistry() { + this.adminManageDataService.updateRegistry().subscribe( + resp => { + this.snackBar.open( + 'Success: tables created, registry updated, other Gisaf processes notified', + 'Close', + {duration: 3000} + ) + } + ) + } +} diff --git a/src/app/admin/admin-manage/category/dialog.component.css b/src/app/admin/admin-manage/category/dialog.component.css new file mode 100644 index 0000000..c7a0987 --- /dev/null +++ b/src/app/admin/admin-manage/category/dialog.component.css @@ -0,0 +1,8 @@ +mat-form-field { + padding: 0 0.5em; +} + +.symbol { + font-family: "GisafSymbols"; + font-size: 2em; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/category/dialog.component.html b/src/app/admin/admin-manage/category/dialog.component.html new file mode 100644 index 0000000..0ac5973 --- /dev/null +++ b/src/app/admin/admin-manage/category/dialog.component.html @@ -0,0 +1,17 @@ +

Edit category

+ +
+
+ + {{ keyvalue.key }} + + +
+
+ + +
+
\ No newline at end of file diff --git a/src/app/admin/admin-manage/category/dialog.component.ts b/src/app/admin/admin-manage/category/dialog.component.ts new file mode 100644 index 0000000..e4d6320 --- /dev/null +++ b/src/app/admin/admin-manage/category/dialog.component.ts @@ -0,0 +1,46 @@ +import { Component, OnInit, Input, + ChangeDetectorRef, ChangeDetectionStrategy, ViewChild, Inject } from '@angular/core' +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms' + +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog' + +import { Category } from '../data.service' +import { categoryFields } from './fields' + +export interface DialogData { + category: Category +} + + +@Component({ + selector: 'gisaf-admin-category-dialog', + templateUrl: 'dialog.component.html', + styleUrls: ['dialog.component.css'], +}) +export class GisafAdminCategoryDialogComponent implements OnInit { + formGroup: UntypedFormGroup + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData + ) {} + + ngOnInit() { + let category: Category = this.data['category'] + this.formGroup = new UntypedFormGroup({}) + //this.formGroup.addControl('name', new FormControl(category.name, [Validators.required])) + for (let categoryField of categoryFields) { + this.formGroup.addControl( + categoryField.name, + new UntypedFormControl( + category[categoryField.name] || categoryField.defaultValue, + categoryField.validators, + ) + ) + } + } + + save() { + this.dialogRef.close(this.formGroup.value); + } +} diff --git a/src/app/admin/admin-manage/category/fields.ts b/src/app/admin/admin-manage/category/fields.ts new file mode 100644 index 0000000..e016373 --- /dev/null +++ b/src/app/admin/admin-manage/category/fields.ts @@ -0,0 +1,29 @@ +import { Validators } from '@angular/forms' + +export class CategoryField { + constructor( + public name: string, + public validators = [], + public type: string = 'string', + public defaultValue?: string, + public inTable: boolean = true + ) {} +} + +export const categoryFields: CategoryField[] = [ + new CategoryField('name', [Validators.required]), + new CategoryField('description', [Validators.required]), + new CategoryField('group', [Validators.required, Validators.maxLength(4), Validators.minLength(4)]), + new CategoryField('minor_group_1', [Validators.required, Validators.maxLength(4), Validators.minLength(4)]), + new CategoryField('minor_group_2', [Validators.required, Validators.maxLength(4), Validators.minLength(4)], 'string', '----'), + new CategoryField('status', [Validators.required, Validators.maxLength(1), Validators.minLength(1)], 'string', 'E'), + //new CategoryField('auto_import', [], 'boolean'), + new CategoryField('model_type', [Validators.required, Validators.pattern('^(Point|Line|Polygon)$')], 'string', 'Point'), + new CategoryField('long_name'), + new CategoryField('symbol', [Validators.maxLength(1), Validators.minLength(1)], 'string'), + new CategoryField('mapbox_type_custom', [], 'string', '', false), + new CategoryField('mapbox_paint', [], 'string', '', false), + new CategoryField('mapbox_layout', [], 'string', '', false), + new CategoryField('viewable_role', [], 'string', '', false), + new CategoryField('extra', [], 'string', '', false), +] diff --git a/src/app/admin/admin-manage/data.service.ts b/src/app/admin/admin-manage/data.service.ts new file mode 100644 index 0000000..f32157b --- /dev/null +++ b/src/app/admin/admin-manage/data.service.ts @@ -0,0 +1,525 @@ +import { Injectable } from '@angular/core' + +import { Observable, BehaviorSubject, forkJoin, of as observableOf } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +const getSurveyStores = gql` +query geo_survey_stores { + geo_survey_stores { + name + } +} +` + +const getRawSurveyStores = gql` +query geo_raw_survey_stores { + geo_raw_survey_stores { + name + } +} +` + +const getRawSurveyPoints = gql` +query raw_survey_points ($orig_id: String!) { + raw_survey_points(orig_id: $orig_id) { + id + category + date + orig_id + store + status + type + project + } +} +` + +const reconciliationItemMutation = gql` +mutation reconciliationItem( + $id: String!, + $category: String! +) { + reconciliationItem( + id: $id, + category: $category + ) { + result { + message + } + } +} +` + +const changeSurveyPointMutation = gql` +mutation changeSurveyPointStatus( + $id: String!, + $status: String! +) { + changePointStatus( + id: $id, + status: $status + ) { + result { + message + } + } +} +` + +const deleteSurveyPointMutation = gql` +mutation deletePoint( + $id: String!, +) { + deletePoint( + id: $id, + ) { + result { + message + } + } +} +` + + +const categoryMutation = gql` +mutation categoryMutation( + $category: CategoryInput!, +) { + editCategory( + category: $category, + ) { + result { + name + _message + _mode + } + } +} +` + +const projectMutation = gql` +mutation projectMutation( + $project: ProjectInput!, +) { + editProject( + project: $project, + ) { + result { + id + } + } +} +` + +const categoryDeleteMutation = gql` +mutation deleteCategory( + $name: String! +) { + deleteCategory( + name: $name, + ) { + result + } +} +` + +const projectDeleteMutation = gql` +mutation deleteProject( + $id: Int! +) { + deleteProject( + id: $id, + ) { + result + } +} +` + +const categoriesQuery = gql` +query categories { + categories { + name + description + group + minor_group_1 + minor_group_2 + status + auto_import + model_type + long_name + symbol + mapbox_type_custom + mapbox_paint + mapbox_layout + viewable_role + extra + } +} +` + +const projectsQuery = gql` +query projects { + projects { + id + name + contact_person + site + date_approved + start_date_planned + start_date_effective + end_date_planned + end_date_effective + } +} +` + +const updateRegistryQuery = gql` +query updateRegistry { + updateRegistry +} +` + +const vacuumDbQuery = gql` +query vacuumDb { + vacuumDb +} +` + +const runIntegrityCheckQuery = gql` +query runIntegrityCheck( + $integrityCheckId: String! +) { + integrityCheckRun( + integrityCheckId: $integrityCheckId + ) { + name + description + dfData + } +} +` + +const integrityCheckQuery = gql` +query integrityChecks { + integrityChecks { + id + name + description + } +} +` + +export class Store { + constructor( + public name: string, + ) {} +} + +export class Category { + constructor( + public name: string, + public description?: string, + public group?: string, + public minor_group_1?: string, + public minor_group_2?: string, + public status?: string, + public auto_import?: string, + public model_type?: string, + public long_name?: string, + public symbol?: string, + public mapbox_type_custom?: string, + public mapbox_paint?: string, + public mapbox_layout?: string, + public viewable_role?: string, + public extra?: string, + ) {} +} + +export class Project { + constructor( + public id: number, + public name: string, + public contact_person?: string, + public site?: string, + public date_approved?: Date, + public start_date_planned?: Date, + public start_date_effective?: Date, + public end_date_planned?: Date, + public end_date_effective?: Date, + ) {} +} + +export class RawSurveyPoint { + constructor( + public id: String, + public orig_id: String, + public date: Date, + public category: String, + public status: String, + public store: String, + public type: String, + public project: String, + ) {} +} + +export class Field { + constructor( + public name: string, + public type: string, + ) {} +} + +export class DF { + constructor( + public fields: Field[], + public rows: object[] + ) {} + + get fieldNames() { + return this.fields.map(f=>f.name) + } +} + +export class IntegrityReport { + constructor( + public name: string, + public description: string, + public df?: DF, + ) {} +} + +export class IntegrityCheck { + constructor( + public id: string, + public name: string, + public description: string, + ) {} +} + +@Injectable() +export class AdminManageDataService { + constructor( + private apollo: Apollo, + ) {} + + getRawSurveyStores(): Observable { + return this.apollo.query({ + query: getRawSurveyStores, + }).pipe(map( + res => res['data']['geo_raw_survey_stores'].map( + (store: object) => new Store( + store['name'], + ) + ) + )) + } + + getSurveyStores(): Observable { + return this.apollo.query({ + query: getSurveyStores, + }).pipe(map( + res => res['data']['geo_survey_stores'].map( + (store: object) => new Store( + store['name'], + ) + ) + )) + } + + getRawSurveyPoints(orig_id: string): Observable { + return this.apollo.query({ + query: getRawSurveyPoints, + variables: { + orig_id: orig_id + } + }).pipe(map( + res => res['data']['raw_survey_points'].map( + (rawSurveyPoint: object) => new RawSurveyPoint( + rawSurveyPoint['id'], + rawSurveyPoint['orig_id'], + rawSurveyPoint['date'], + rawSurveyPoint['category'], + rawSurveyPoint['status'], + rawSurveyPoint['store'], + rawSurveyPoint['type'], + rawSurveyPoint['project'], + ) + ) + )) + } + + reconcile(item: RawSurveyPoint, category: string): Observable { + return this.apollo.mutate({ + mutation: reconciliationItemMutation, + variables: { + id: item.id, + category: category + } + }).pipe(map( + res => res['data']['reconciliationItem']['result'] + )) + } + + changeStatus(item: RawSurveyPoint, status: string): Observable { + return this.apollo.mutate({ + mutation: changeSurveyPointMutation, + variables: { + id: item.id, + status: status + } + }).pipe(map( + res => res['data']['changePointStatus']['result'] + )) + } + + delete(item: RawSurveyPoint): Observable { + return this.apollo.mutate({ + mutation: deleteSurveyPointMutation, + variables: { + id: item.id, + } + }).pipe(map( + res => res['data']['deletePoint']['result'] + )) + } + + getCategories(): Observable { + return this.apollo.query({ + query: categoriesQuery, + }).pipe(map( + res => res['data']['categories'].map( + (category: object) => new Category( + category['name'], + category['description'], + category['group'], + category['minor_group_1'], + category['minor_group_2'], + category['status'], + category['auto_import'], + category['model_type'], + category['long_name'], + category['symbol'], + category['mapbox_type_custom'], + category['mapbox_paint'], + category['mapbox_layout'], + category['viewable_role'], + category['extra'], + ) + ) + )) + } + + getProjects(): Observable { + return this.apollo.query({ + query: projectsQuery, + }).pipe(map( + res => res['data']['projects'].map( + (project: object) => project as Project + ) + )) + } + + saveCategory(category: Category): Observable { + return this.apollo.mutate({ + mutation: categoryMutation, + variables: { + category: category, + } + }).pipe(map( + res => res['data']['editCategory']['result'] + )) + } + + deleteCategory(category: Category): Observable { + return this.apollo.mutate({ + mutation: categoryDeleteMutation, + variables: { + name: category.name, + } + }).pipe(map( + // TODO: distinguish message and error + res => res['data']['deleteCategory']['result'] + )) + } + + saveProject(project: Project): Observable { + return this.apollo.mutate({ + mutation: projectMutation, + variables: { + project: project, + } + }).pipe(map( + res => res['data']['editProject']['result']['id'] + )) + } + + deleteProject(project: Project): Observable { + return this.apollo.mutate({ + mutation: projectDeleteMutation, + variables: { + id: project.id, + } + }).pipe(map( + res => res['data']['deleteProject']['result']['id'] + )) + } + + updateRegistry() { + return this.apollo.query({ + query: updateRegistryQuery, + }).pipe(map( + res => res['data']['updateRegistry']['result'] + )) + } + + vacuumDb(): Observable { + return this.apollo.query({ + query: vacuumDbQuery, + }).pipe(map( + res => res['data']['vacuumDb'] + )) + } + + runIntegrityCheck(integrityCheck: IntegrityCheck): Observable { + return this.apollo.query({ + query: runIntegrityCheckQuery, + variables: { + integrityCheckId: integrityCheck.id + } + }).pipe(map( + res => { + let report = res['data']['integrityCheckRun'] + let dfData = JSON.parse(report['dfData']) + return new IntegrityReport( + report['name'], + report['description'], + dfData && new DF( + dfData['schema']['fields'].map( + field => new Field(field['name'], field['type']) + ), + dfData['data'] + ), + ) + } + )) + } + + getIntegrityChecks(): Observable { + return this.apollo.query({ + query: integrityCheckQuery + }).pipe(map( + resp => { + let data = resp['data']['integrityChecks'] + return data.map( + (item: object) => new IntegrityCheck( + item['id'], + item['name'], + item['description'] + ) + ) + } + )) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/integrity/integrity.component.css b/src/app/admin/admin-manage/integrity/integrity.component.css new file mode 100644 index 0000000..308204b --- /dev/null +++ b/src/app/admin/admin-manage/integrity/integrity.component.css @@ -0,0 +1,19 @@ +.buttons { + margin: 1em; +} + +.buttons button { + margin: 0 1em; +} + +th.mat-mdc-header-cell, td.mat-mdc-cell, td.mat-mdc-footer-cell { + padding: 0 1em; +} + +.tools { + display: flex; +} + +.even { + background-color: #f5f5f512; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/integrity/integrity.component.html b/src/app/admin/admin-manage/integrity/integrity.component.html new file mode 100644 index 0000000..f479bfd --- /dev/null +++ b/src/app/admin/admin-manage/integrity/integrity.component.html @@ -0,0 +1,52 @@ +
+ Integrity checks: + + + + +
+ +
+

{{ report.name }}

+

{{ report.description }}

+
+
+ + Filter in report + + +
+ + + + + + + + +
{{ colName }} {{ value[colName] }}
+ + diff --git a/src/app/admin/admin-manage/integrity/integrity.component.ts b/src/app/admin/admin-manage/integrity/integrity.component.ts new file mode 100644 index 0000000..dd0ec27 --- /dev/null +++ b/src/app/admin/admin-manage/integrity/integrity.component.ts @@ -0,0 +1,67 @@ +import { Component, OnInit, ViewChild, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core'; + +import { MatSnackBar } from '@angular/material/snack-bar' +import { MatPaginator } from '@angular/material/paginator' +import { MatSort } from '@angular/material/sort' +import { MatTableDataSource } from '@angular/material/table' + +import { AdminManageDataService, IntegrityReport, IntegrityCheck } from '../data.service' + +@Component({ + selector: 'gisaf-admin-integrity', + templateUrl: './integrity.component.html', + styleUrls: ['./integrity.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminIntegrityComponent implements OnInit { + integrityChecks: IntegrityCheck[] = [] + report: IntegrityReport + pleaseWait: boolean = false + filterText: string + dataSource: MatTableDataSource + @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator + @ViewChild(MatSort, {static: true}) sort: MatSort + + constructor( + public adminManageDataService: AdminManageDataService, + private snackBar: MatSnackBar, + private cdr: ChangeDetectorRef, + ) { } + + ngOnInit(): void { + this.adminManageDataService.getIntegrityChecks().subscribe( + resp => { + this.integrityChecks = resp + this.cdr.markForCheck() + } + ) + } + + get fieldNames(): string[] { + return this.report && this.report.df ? this.report.df.fieldNames : [] + } + + runIntegrityCheck(integrityCheck: IntegrityCheck) { + this.pleaseWait = true + this.adminManageDataService.runIntegrityCheck(integrityCheck).subscribe( + (report: IntegrityReport) => { + this.pleaseWait = false + this.snackBar.open( + `Integrity check ${integrityCheck.name} executed`, + 'Close', + { duration: 3000 } + ) + this.report = report + this.dataSource = new MatTableDataSource(report.df ? report.df.rows : []) + this.dataSource.sort = this.sort + this.dataSource.paginator = this.paginator + this.cdr.markForCheck() + } + ) + } + + applyFilter() { + this.dataSource.filter = this.filterText.trim().toLowerCase() + } +} diff --git a/src/app/admin/admin-manage/maintenance/maintenance.component.css b/src/app/admin/admin-manage/maintenance/maintenance.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/admin/admin-manage/maintenance/maintenance.component.html b/src/app/admin/admin-manage/maintenance/maintenance.component.html new file mode 100644 index 0000000..76aa991 --- /dev/null +++ b/src/app/admin/admin-manage/maintenance/maintenance.component.html @@ -0,0 +1,4 @@ + diff --git a/src/app/admin/admin-manage/maintenance/maintenance.component.ts b/src/app/admin/admin-manage/maintenance/maintenance.component.ts new file mode 100644 index 0000000..5f907dc --- /dev/null +++ b/src/app/admin/admin-manage/maintenance/maintenance.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit, ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core'; + +import { MatSnackBar } from '@angular/material/snack-bar' + +import { AdminManageDataService } from '../data.service' + +@Component({ + selector: 'gisaf-admin-maintenance', + templateUrl: './maintenance.component.html', + styleUrls: ['./maintenance.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminMaintenanceComponent implements OnInit { + + constructor( + private adminManageDataService: AdminManageDataService, + private snackBar: MatSnackBar, + private cdr: ChangeDetectorRef, + ) { } + + ngOnInit(): void { + } + + vacuumDb() { + this.adminManageDataService.vacuumDb().subscribe( + resp => this.snackBar.open( + 'Database vacuum OK', + 'Close', + ) + ) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.css b/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.css new file mode 100644 index 0000000..61bc86c --- /dev/null +++ b/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.css @@ -0,0 +1,23 @@ +.destination { + width: 40em; +} + +.form, .points { + margin: 1em; +} + +.seachForm { + margin: 1em; +} + +.opForm { + border: 1px solid grey; + padding: 2px 1em; + border-radius: 0.6em; + margin-bottom: 3px; + background-color: #424242; +} + +.newStatus { + width: 6em; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.html b/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.html new file mode 100644 index 0000000..5953fe9 --- /dev/null +++ b/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.html @@ -0,0 +1,53 @@ +
+
+
+ + Original ID (search in the raw survey points) + + + + +
+
+ + New status + + + + + Reconciliation destination + + + + + + {{ category.name }} ({{ category.group }}-{{ category.minor_group_1}}, {{ category.description }}, {{ category.status }}) + + + + + Enable delete buttons + +
+
+
+
+
+ + +
\ No newline at end of file diff --git a/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.ts b/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.ts new file mode 100644 index 0000000..2e7eca2 --- /dev/null +++ b/src/app/admin/admin-manage/points-by-orig-id/points-by-orig-id.component.ts @@ -0,0 +1,63 @@ +import { Component, OnInit, Input, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { UntypedFormGroup, UntypedFormControl } from '@angular/forms' + +import { map, startWith } from 'rxjs/operators' +import { Observable } from 'rxjs' + +import { AdminManageDataService, Category, RawSurveyPoint } from '../data.service' + +@Component({ + selector: 'gisaf-admin-points-by-orig-id', + templateUrl: './points-by-orig-id.component.html', + styleUrls: ['./points-by-orig-id.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AdminPointsByOrigIdComponent implements OnInit { + formGroup: UntypedFormGroup + categories: Category[] + rawSurveyPoints: RawSurveyPoint[] + filteredCategories: Observable + destinationControl: UntypedFormControl = new UntypedFormControl() + + constructor( + private adminManageDataService: AdminManageDataService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + this.formGroup = new UntypedFormGroup({}) + this.formGroup.addControl('originalId', new UntypedFormControl()) + this.formGroup.addControl('newStatus', new UntypedFormControl()) + this.formGroup.addControl('canDelete', new UntypedFormControl()) + this.formGroup.addControl('destination', this.destinationControl) + this.adminManageDataService.getCategories().subscribe( + categories => { + this.categories = categories + this.filteredCategories = this.destinationControl.valueChanges.pipe( + startWith(''), + map(value => this._filter(value)) + ) + } + ) + } + + private _filter(value: string): Category[] { + const filterValue = value.toUpperCase() + return this.categories.filter( + category => category.name.indexOf(filterValue) != -1 + || category.group.toUpperCase().indexOf(filterValue) != -1 + || category.minor_group_1.toUpperCase().indexOf(filterValue) != -1 + ) + } + + submit() { + this.adminManageDataService.getRawSurveyPoints(this.formGroup.value['originalId']).subscribe( + res => { + this.rawSurveyPoints = res + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/admin/admin-manage/project/dialog.component.css b/src/app/admin/admin-manage/project/dialog.component.css new file mode 100644 index 0000000..c7a0987 --- /dev/null +++ b/src/app/admin/admin-manage/project/dialog.component.css @@ -0,0 +1,8 @@ +mat-form-field { + padding: 0 0.5em; +} + +.symbol { + font-family: "GisafSymbols"; + font-size: 2em; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/project/dialog.component.html b/src/app/admin/admin-manage/project/dialog.component.html new file mode 100644 index 0000000..ce5dfa1 --- /dev/null +++ b/src/app/admin/admin-manage/project/dialog.component.html @@ -0,0 +1,57 @@ +

Edit project

+ +
+
+ + id + + + + Name + + + + Contact person + + + + Site + + + + Date approved + + + + + + Start date planned + + + + + + Start date effective + + + + + + End date planned + + + + + + End date effective + + + + + +
+
+ + +
+
\ No newline at end of file diff --git a/src/app/admin/admin-manage/project/dialog.component.ts b/src/app/admin/admin-manage/project/dialog.component.ts new file mode 100644 index 0000000..20b5938 --- /dev/null +++ b/src/app/admin/admin-manage/project/dialog.component.ts @@ -0,0 +1,60 @@ +import { Component, OnInit, Input, + ChangeDetectorRef, ChangeDetectionStrategy, ViewChild, Inject } from '@angular/core' +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms' + +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog' + +import { Project } from '../data.service' +import { projectFields, ProjectField } from './fields' + +export interface DialogData { + project: Project +} + +@Component({ + selector: 'gisaf-admin-project-dialog', + templateUrl: 'dialog.component.html', + styleUrls: ['dialog.component.css'], +}) +export class GisafAdminProjectDialogComponent implements OnInit { + formGroup: UntypedFormGroup + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData + ) {} + + ngOnInit() { + let project: Project = this.data['project'] + this.formGroup = new UntypedFormGroup({}) + //this.formGroup.addControl('id', new FormControl(project.id)) + for (let projectField of projectFields) { + this.formGroup.addControl( + projectField.name, + new UntypedFormControl( + project[projectField.name] || projectField.defaultValue, + projectField.validators, + ) + ) + } + } + + save() { + // Ugly hack for just getting an ISO date like YYYY-MM-DD + projectFields.filter( + f => f.type == 'date' + ).forEach( + f => { + if (this.formGroup.value[f.name] instanceof Date) { + let qq = this.formGroup.value[f.name] + this.formGroup.value[f.name] = [ + qq.getFullYear(), + qq.getMonth().toFixed().padStart(2, 0), + qq.getDate().toFixed().padStart(2, 0) + ].join('-') + } + } + ) + this.dialogRef.close(this.formGroup.value); + } +} diff --git a/src/app/admin/admin-manage/project/fields.ts b/src/app/admin/admin-manage/project/fields.ts new file mode 100644 index 0000000..bba1331 --- /dev/null +++ b/src/app/admin/admin-manage/project/fields.ts @@ -0,0 +1,23 @@ +import { Validators } from '@angular/forms' + +export class ProjectField { + constructor( + public name: string, + public validators = [], + public type: string = 'string', + public defaultValue?: string, + public inTable: boolean = true + ) {} +} + +export const projectFields: ProjectField[] = [ + new ProjectField('id'), + new ProjectField('name', [Validators.required]), + new ProjectField('contact_person'), + new ProjectField('site'), + new ProjectField('date_approved', [], 'date'), + new ProjectField('start_date_planned', [], 'date'), + new ProjectField('start_date_effective', [], 'date'), + new ProjectField('end_date_planned', [], 'date'), + new ProjectField('end_date_effective', [], 'date'), +] diff --git a/src/app/admin/admin-manage/project/project-resolver.service.ts b/src/app/admin/admin-manage/project/project-resolver.service.ts new file mode 100644 index 0000000..ffdabbf --- /dev/null +++ b/src/app/admin/admin-manage/project/project-resolver.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core' +import { Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' + +import { AdminManageDataService, Project } from '../data.service' + + +@Injectable() +export class ProjectResolver implements Resolve { + constructor( + private adminManageDataService: AdminManageDataService, + private router: Router + ) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.adminManageDataService.getProjects() + } +} diff --git a/src/app/admin/admin-manage/project/project.component.css b/src/app/admin/admin-manage/project/project.component.css new file mode 100644 index 0000000..5ee18c6 --- /dev/null +++ b/src/app/admin/admin-manage/project/project.component.css @@ -0,0 +1,47 @@ +h1 { + margin-top: 0; + margin-bottom: 0; +} + +.tools button { + width: 12em; +} + +.filter button { + min-width: 1.5em!important; + max-width: 1.5em; +} + +td.cdk-column-symbol { + font-family: "GisafSymbols"; + font-size: 2em; +} + +table { + width: 100%; +} + +.even { + background-color: #f5f5f512; +} + +.unlockCheckbox { + text-align: center; +} + +td .mat-mdc-button { + min-width: inherit ! important; +} + +.mat-column-delete, .mat-column-edit { + width: 3em; + text-align: center; +} + +th.mat-mdc-header-cell:first-of-type, td.mat-mdc-cell:first-of-type, td.mat-mdc-footer-cell:first-of-type { + padding-left: inherit; +} + +th.mat-mdc-header-cell:last-of-type, td.mat-mdc-cell:last-of-type, td.mat-mdc-footer-cell:last-of-type { + padding-right: inherit; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/project/project.component.html b/src/app/admin/admin-manage/project/project.component.html new file mode 100644 index 0000000..b64fec6 --- /dev/null +++ b/src/app/admin/admin-manage/project/project.component.html @@ -0,0 +1,74 @@ +

Survey projects

+
+ + Filter in table + + + + +
+ + + + + + + + + + + + + + + + + + +
{{ field }}{{ item[field] }} +
+ + +
+
+ + Edit + +
+ + + \ No newline at end of file diff --git a/src/app/admin/admin-manage/project/project.component.ts b/src/app/admin/admin-manage/project/project.component.ts new file mode 100644 index 0000000..8905aa2 --- /dev/null +++ b/src/app/admin/admin-manage/project/project.component.ts @@ -0,0 +1,126 @@ +import { Component, OnInit, + ChangeDetectorRef, ChangeDetectionStrategy, ViewChild } from '@angular/core' +import { UntypedFormGroup, UntypedFormControl } from '@angular/forms' +import { ActivatedRoute } from '@angular/router' + +import { MatTableDataSource } from '@angular/material/table' +import { MatSnackBar } from '@angular/material/snack-bar' +import { MatSort } from '@angular/material/sort' +import { MatPaginator } from '@angular/material/paginator' +import { MatDialog } from '@angular/material/dialog' + +import { AdminDataService } from '../../admin-data.service' +import { Project, AdminManageDataService } from '../data.service' +import { GisafAdminProjectDialogComponent } from './dialog.component' +import { AuthenticationService } from '../../../_services/authentication.service' +import { ProjectField, projectFields } from './fields' + + +@Component({ + selector: 'gisaf-admin-project', + templateUrl: './project.component.html', + styleUrls: ['./project.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ProjectComponent implements OnInit { + edit_roles = ['project manager'] + projects: Project[] = [] + fields: string[] = projectFields.map(f=>f.name) + actions: string[] = [ + 'edit', + 'delete' + ] + columns: string[] + dataSource: MatTableDataSource + @ViewChild(MatSort, {static: true}) sort: MatSort + @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator + unlockDeleteFormGroup: UntypedFormGroup = new UntypedFormGroup({}) + filterText: string + + constructor( + private cdr: ChangeDetectorRef, + private route: ActivatedRoute, + public authenticationService: AuthenticationService, + private snackBar: MatSnackBar, + private dataService: AdminDataService, + private adminManageDataService: AdminManageDataService, + public dialog: MatDialog, + ) {} + + ngOnInit(): void { + this.route.data.subscribe( + data => { + this.projects = data['projects'] + this.dataSource = new MatTableDataSource(this.projects) + this.dataSource.sort = this.sort + this.dataSource.paginator = this.paginator + this.cdr.markForCheck() + } + ) + this.unlockDeleteFormGroup = new UntypedFormGroup({ + 'canDelete': new UntypedFormControl(), + }) + this.columns = projectFields.filter(f=>f.inTable).map(f=>f.name) + if (this.authenticationService.isAuthorized(this.edit_roles)) { + this.columns = this.columns.concat(this.actions) + } + } + + applyFilter() { + this.dataSource.filter = this.filterText.trim().toLowerCase(); + } + + editItem(data?: Project) { + const dialogRef = this.dialog.open(GisafAdminProjectDialogComponent, { + width: '75%', + data: { + 'project': data || new Project(undefined, ''), + } + }) + dialogRef.afterClosed().subscribe( + (project: Project) => project && + this.adminManageDataService.saveProject( + project + ).subscribe( + (id: number) => { + if (data) { + // Update + let row = this.dataSource.data.findIndex(c=>c['id'] == id) + this.dataSource.data[row] = project + } + else { + // New + project['id'] = id + this.dataSource.data.push(project as Project) + } + this.dataSource.data = this.dataSource.data + this.dataService.getSurveyMeta().subscribe() + this.cdr.markForCheck() + }, + err => { + // Popup the dialog again, the error is catched by Apollo + this.editItem(project) + } + ) + ) + } + + deleteItem(project: Project) { + this.adminManageDataService.deleteProject(project).subscribe( + _ => { + this.snackBar.open( + 'Project ' + project.name + ' deleted', + 'Close', + {duration: 3000} + ) + // Remove from table + let dsi = this.dataSource.data.findIndex(row => row['id'] == project.id) + this.dataSource.data.splice(dsi, 1) + // Force Angular change detection (??) + this.dataSource.data = this.dataSource.data + this.dataService.getSurveyMeta().subscribe() + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.css b/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.css new file mode 100644 index 0000000..21ac54a --- /dev/null +++ b/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.css @@ -0,0 +1,27 @@ +.container { + border: 1px solid grey; + border-radius: 5px; + padding: 3px; + margin: 3px; +} + +.id { + width: 15em; + font-weight: 800; +} + +.date { + width: 15em; +} + +.category { + width: 25em; +} + +.action { + padding-left: 1em; +} + +.buttons button { + margin: 0.5em; +} \ No newline at end of file diff --git a/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.html b/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.html new file mode 100644 index 0000000..25e7843 --- /dev/null +++ b/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.html @@ -0,0 +1,42 @@ +
+
+
+ Database id: {{ rawSurveyPoint.id }} +
+
+ Survey category: {{ rawSurveyPoint.category }} ({{ rawSurveyPoint.store }}) +
+
+ Survey date: {{ rawSurveyPoint.date }} +
+
+ Status: {{ rawSurveyPoint.status }} +
+
+ Type: {{ rawSurveyPoint.type }} +
+
+ Project: {{ rawSurveyPoint.project }} +
+
+
+ + + +
+
\ No newline at end of file diff --git a/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.ts b/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.ts new file mode 100644 index 0000000..c4d9c86 --- /dev/null +++ b/src/app/admin/admin-manage/raw-survey-point/raw-survey-point.component.ts @@ -0,0 +1,50 @@ +import { Component, OnInit, Input, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { MatSnackBar } from '@angular/material/snack-bar' + +import { AdminManageDataService, RawSurveyPoint, Category } from '../data.service' + + +@Component({ + selector: 'gisaf-admin-raw-survey-point', + templateUrl: './raw-survey-point.component.html', + styleUrls: ['./raw-survey-point.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RawSurveyPointComponent { + @Input() rawSurveyPoint: RawSurveyPoint + @Input() newStatus: string + @Input() category: string + @Input() canDelete: boolean + + constructor( + private adminManageDataService: AdminManageDataService, + private cdr: ChangeDetectorRef, + private snackBar: MatSnackBar, + ) {} + + changeStatus(evt) { + this.adminManageDataService.changeStatus(this.rawSurveyPoint, this.newStatus).subscribe( + (res: Object) => { + this.snackBar.open(res['message'], 'OK') + } + ) + } + + delete(evt) { + this.adminManageDataService.delete(this.rawSurveyPoint).subscribe( + (res: Object) => { + this.snackBar.open(res['message'], 'OK') + } + ) + } + + reconcile(evt) { + this.adminManageDataService.reconcile(this.rawSurveyPoint, this.category).subscribe( + (res: Object) => { + this.snackBar.open(res['message'], 'OK') + } + ) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-menu/admin-menu.component.css b/src/app/admin/admin-menu/admin-menu.component.css new file mode 100644 index 0000000..66bd404 --- /dev/null +++ b/src/app/admin/admin-menu/admin-menu.component.css @@ -0,0 +1,23 @@ +/*@import '../node_modules/@angular/material/prebuilt-themes/purple-green.css';*/ + +.active { + color: #efe00b; +} + +.mat-expansion-panel-header { + font-weight: 900; + padding: 0 10px; +} + + +:host ::ng-deep .mat-expansion-panel-body { + padding: 0 10px 10px 10px; +} + +:host::ng-deep .mat-mdc-list-item-content, :host::ng-deep .mat-mdc-list-item-content button { + width: 100%; +} + +.mat-expansion-panel-header-description { + flex-grow: 0; +} \ No newline at end of file diff --git a/src/app/admin/admin-menu/admin-menu.component.html b/src/app/admin/admin-menu/admin-menu.component.html new file mode 100644 index 0000000..d2feb3e --- /dev/null +++ b/src/app/admin/admin-menu/admin-menu.component.html @@ -0,0 +1,159 @@ + + + + + Baskets + + + shopping-basket + + + + + + + + + + + Survey + + + gps_fixed + + + + + + + + + + + Scheduler + + + alarm + + + + + + + + + + + + + + Manage + + + settings + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/app/admin/admin-menu/admin-menu.component.spec.ts b/src/app/admin/admin-menu/admin-menu.component.spec.ts new file mode 100644 index 0000000..638bba5 --- /dev/null +++ b/src/app/admin/admin-menu/admin-menu.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { AdminMenuComponent } from './admin-menu.component'; + +describe('AdminMenuComponent', () => { + let component: AdminMenuComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ AdminMenuComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin-menu/admin-menu.component.ts b/src/app/admin/admin-menu/admin-menu.component.ts new file mode 100644 index 0000000..e53cd6a --- /dev/null +++ b/src/app/admin/admin-menu/admin-menu.component.ts @@ -0,0 +1,17 @@ +import { Component, Input } from '@angular/core' + +import { AuthenticationService } from '../../_services/authentication.service' +import { AdminBasket } from '../admin-basket/data.service' + +@Component({ + selector: 'gisaf-admin-menu', + templateUrl: './admin-menu.component.html', + styleUrls: ['./admin-menu.component.css'], +}) +export class AdminMenuComponent { + @Input() adminModelsMenuItems: object[] + @Input() baskets: AdminBasket[] + constructor( + public authenticationService: AuthenticationService + ) {} +} diff --git a/src/app/admin/admin-resolver.service.ts b/src/app/admin/admin-resolver.service.ts new file mode 100644 index 0000000..d8044a3 --- /dev/null +++ b/src/app/admin/admin-resolver.service.ts @@ -0,0 +1,29 @@ +import { Injectable } from '@angular/core' +import { Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable, forkJoin } from 'rxjs' +import { map } from 'rxjs/operators' + +import { AdminDataService } from './admin-data.service' +import { SurveyMeta } from './admin-data.service' +import { AdminBasketDataService, AdminBasket } from './admin-basket/data.service' + + +@Injectable() +export class AdminResolver implements Resolve { + constructor( + private router: Router, + private dataService: AdminDataService, + private basketDataService: AdminBasketDataService, + ) {} + + resolve( + route: ActivatedRouteSnapshot, + state: RouterStateSnapshot, + ): Observable<[AdminBasket[], SurveyMeta/*, object[]*/]> { + return forkJoin( + this.basketDataService.getBaskets(), + this.dataService.getSurveyMeta(), + //this.dataService.getModelsMenuBar(), + ) + } +} diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts new file mode 100644 index 0000000..126716f --- /dev/null +++ b/src/app/admin/admin-routing.module.ts @@ -0,0 +1,105 @@ +import { NgModule } from '@angular/core' +import { Routes, RouterModule } from '@angular/router' + +import { AdminComponent } from './admin.component' +import { AdminAccessComponent } from './admin-manage/access/users-roles.component' +import { AdminListComponent } from './admin-list/admin-list.component' +import { AdminDetailComponent } from './admin-detail/admin-detail.component' +import { AdminBasketComponent } from './admin-basket/basket.component' +import { AdminPointsByOrigIdComponent } from './admin-manage/points-by-orig-id/points-by-orig-id.component' +import { AdminResolver } from './admin-resolver.service' +import { DetailResolver } from './admin-detail/admin-detail-resolver.service' +import { BasketResolver } from './admin-basket/admin-basket-resolver.service' +import { CategoryComponent } from './admin-manage/category/category.component' +import { CategoryResolver } from './admin-manage/category/category-resolver.service' +import { ProjectComponent } from './admin-manage/project/project.component' +import { ProjectResolver } from './admin-manage/project/project-resolver.service' +import { AdminIntegrityComponent } from './admin-manage/integrity/integrity.component' +import { AdminMaintenanceComponent } from './admin-manage/maintenance/maintenance.component' +import { AdminSchedulerJobsComponent } from './admin-scheduler/jobs.component' +import { AdminSchedulerMessagesComponent } from './admin-scheduler/messages.component' + +const routes: Routes = [ + { + path: '', + component: AdminComponent, + children: [ + { + path: 'basket/:name', + component: AdminBasketComponent, + resolve: { + basket: BasketResolver, + }, + data: { + + } + }, + { + path: 'manage/access', + component: AdminAccessComponent, + }, + { + path: 'survey/categories', + component: CategoryComponent, + resolve: { + categories: CategoryResolver + } + }, + { + path: 'scheduler/jobs', + component: AdminSchedulerJobsComponent, + }, + { + path: 'scheduler/messages', + component: AdminSchedulerMessagesComponent, + }, + { + path: 'manage/projects', + component: ProjectComponent, + resolve: { + projects: ProjectResolver + } + }, + { + path: 'manage/integrity', + component: AdminIntegrityComponent, + }, + { + path: 'manage/maintenance', + component: AdminMaintenanceComponent, + }, + { + path: 'manage/points-by-orig-id', + component: AdminPointsByOrigIdComponent, + }, + { + path: 'model/:modelName', + component: AdminListComponent, + }, + { + path: 'model/:modelName/:pk', + component: AdminDetailComponent, + resolve: { + item: DetailResolver + } + }, + ], + resolve: { + item: AdminResolver + } + } +] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [ + AdminResolver, + //AdminAccessResolver, + BasketResolver, + CategoryResolver, + ProjectResolver, + DetailResolver, + ] +}) +export class AdminRoutingModule { } diff --git a/src/app/admin/admin-scheduler/feature.component.css b/src/app/admin/admin-scheduler/feature.component.css new file mode 100644 index 0000000..a052807 --- /dev/null +++ b/src/app/admin/admin-scheduler/feature.component.css @@ -0,0 +1,8 @@ +.container { + margin: 2px; + padding: 2px; + border-radius: 2px; + background-color: #212121; + cursor: pointer; + width: fit-content; +} diff --git a/src/app/admin/admin-scheduler/feature.component.html b/src/app/admin/admin-scheduler/feature.component.html new file mode 100644 index 0000000..3a5344a --- /dev/null +++ b/src/app/admin/admin-scheduler/feature.component.html @@ -0,0 +1,5 @@ +
+ {{ feature.store }} #{{ feature.id }} +
\ No newline at end of file diff --git a/src/app/admin/admin-scheduler/feature.component.ts b/src/app/admin/admin-scheduler/feature.component.ts new file mode 100644 index 0000000..8290dd9 --- /dev/null +++ b/src/app/admin/admin-scheduler/feature.component.ts @@ -0,0 +1,30 @@ +import { Component, Input, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { Router } from '@angular/router' +import { Feature } from './scheduler.service' + +@Component({ + selector: 'gisaf-admin-scheduler-feature', + templateUrl: './feature.component.html', + styleUrls: ['./feature.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + ], +}) +export class AdminSchedulerFeatureComponent { + @Input() feature: Feature + + constructor( + private cdr: ChangeDetectorRef, + private router: Router + ) {} + + show() { + this.router.navigate(['/map'], { + queryParams: { + show: this.feature.store + ':id:' + this.feature.id + } + }) + } +} \ No newline at end of file diff --git a/src/app/admin/admin-scheduler/job.component.css b/src/app/admin/admin-scheduler/job.component.css new file mode 100644 index 0000000..e0a201d --- /dev/null +++ b/src/app/admin/admin-scheduler/job.component.css @@ -0,0 +1,71 @@ +.container { + background-color: #555555; + padding: 0.5em; + border-radius: 3px; + margin: 0.5em; + min-width: 25em; +} + +.main { + text-align: center; +} + +.lastRun { + display: inline; +} + +.name { + display: inline; + font-weight: 700; + font-size: 130%; +} + +.subtitle { + font-style: italic; + font-weight: 500; +} + +.undef .mat-badge-content { + background-color : grey; +} + +.ok .mat-badge-content { + background-color : green; +} + +.run .mat-badge-content { + background-color : #3eba3e; +} + +.longrun .mat-badge-content { + background-color : #5f6dd3; +} + +.wait .mat-badge-content { + background-color : skyblue; +} + +.warn .mat-badge-content { + background-color : orange; +} + +.err .mat-badge-content { + background-color : red; +} + +.mat-expansion-panel { + margin-top: 0.5em; +} + +.mat-expansion-panel-header { + height: inherit; + font-size: inherit; +} + +.mat-expansion-panel-header-title { + margin-top: 3px; +} + +::ng-deep .mat-expansion-panel-body { + padding: 0 1em; +} \ No newline at end of file diff --git a/src/app/admin/admin-scheduler/job.component.html b/src/app/admin/admin-scheduler/job.component.html new file mode 100644 index 0000000..4348899 --- /dev/null +++ b/src/app/admin/admin-scheduler/job.component.html @@ -0,0 +1,36 @@ +
+
+
+
{{ job.name }}
+
+
Type: {{ job.type }} ({{ job.schedParams }})
+
+
+ Last run at {{ job.lastRun.time | date : 'medium' }}: {{ job.lastRun.msg }} +
+
+
+ Next run at {{ job.nextRunTime | date : 'medium' }} +
+
+ + + + Features ({{ job.features.length }}) + + +
+
+ + +
+
+
+
\ No newline at end of file diff --git a/src/app/admin/admin-scheduler/job.component.ts b/src/app/admin/admin-scheduler/job.component.ts new file mode 100644 index 0000000..2747e47 --- /dev/null +++ b/src/app/admin/admin-scheduler/job.component.ts @@ -0,0 +1,23 @@ +import { Component, Input, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { Job, JobEvent } from './scheduler.service' + +@Component({ + selector: 'gisaf-admin-scheduler-job', + templateUrl: './job.component.html', + styleUrls: ['./job.component.css'], + //changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + ], +}) +export class AdminSchedulerJobComponent { + protected wss: object = {} // WebSocketSubject + @Input() job: Job + status: string = 'undef' + lastRun: JobEvent + + constructor( + private cdr: ChangeDetectorRef, + ) {} +} \ No newline at end of file diff --git a/src/app/admin/admin-scheduler/jobs.component.css b/src/app/admin/admin-scheduler/jobs.component.css new file mode 100644 index 0000000..f67f1a7 --- /dev/null +++ b/src/app/admin/admin-scheduler/jobs.component.css @@ -0,0 +1,23 @@ +.titleBar { + margin: 0.5em; + justify-content: space-between; + display: flex; +} + +.error { + color: #ff7070; + text-align: center; + font-size: 120%; + font-weight: bolder; + padding: 1em; + margin: 1em; +} + +.title { + font-size: 140%; + font-weight: bolder; +} + +.job { + width: fit-content; +} \ No newline at end of file diff --git a/src/app/admin/admin-scheduler/jobs.component.html b/src/app/admin/admin-scheduler/jobs.component.html new file mode 100644 index 0000000..70884c7 --- /dev/null +++ b/src/app/admin/admin-scheduler/jobs.component.html @@ -0,0 +1,13 @@ +
+
Jobs
+
+ {{ time | date : 'medium' }} +
+
+
{{ error }}
+
+ + +
\ No newline at end of file diff --git a/src/app/admin/admin-scheduler/jobs.component.ts b/src/app/admin/admin-scheduler/jobs.component.ts new file mode 100644 index 0000000..ab5ca32 --- /dev/null +++ b/src/app/admin/admin-scheduler/jobs.component.ts @@ -0,0 +1,104 @@ +import { Component, OnInit, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { Subject, timer } from 'rxjs' +import { map } from 'rxjs/operators' +import { WebSocketSubject } from 'rxjs/webSocket' + +import { SchedulerService, Job, JobEvent } from './scheduler.service' + +@Component({ + selector: 'gisaf-admin-scheduler-jobs', + templateUrl: './jobs.component.html', + styleUrls: ['./jobs.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + SchedulerService, + ], +}) +export class AdminSchedulerJobsComponent implements OnInit { + error: string + jobs: Object = {} //Job[] + status: string = 'connecting...' + timeDelta: number // Time delta between browser and scheduler (positive: ) + time: Date + + constructor( + private cdr: ChangeDetectorRef, + public schedulerService: SchedulerService, + ) {} + + ngOnInit() { + this.getJobs() + this.getTime() + // TODO: websocket status (below: plain websockets, but graphql-ws is different) + //let onOpenSubject = new Subject() + //let onCloseSubject = new Subject() + //onOpenSubject.subscribe( + // res => { + // this.status = 'connected' + // this.cdr.markForCheck() + // } + //) + //onCloseSubject.subscribe( + // (res: CloseEvent) => { + // this.status = 'disconnected - reason: ' + res.reason || res.code.toString() || 'unknown' + // this.cdr.markForCheck() + // } + //) + } + + getTime() { + // Get the time of the scheduler and set the running clock + this.schedulerService.getTime().subscribe( + serverTime => { + // Approximate the network latency: rountrip time + this.timeDelta = (serverTime.getTime() - new Date().getTime()) / 2 + 10 + // Just an approximate running clock for the user + timer(1000, 1000).subscribe( + _ => { + this.time = new Date(new Date().getTime() - this.timeDelta) + this.cdr.markForCheck() + } + ) + } + ) + } + + getJobs() { + this.schedulerService.getJobs().subscribe({ + next: jobs => { + this.jobs = {} + jobs.forEach((job: Job) => { + this.jobs[job.id] = job + }) + this.getJobEvents() + this.cdr.markForCheck() + }, + // complete: () => { + // console.log('getJobs completed') + // }, + error: err => { + console.log(err) + this.error = `Scheduler not reachable (not running?): ${err.statusText || err.message}` + this.cdr.markForCheck() + } + }) + } + + getJobEvents() { + this.schedulerService.getJobEvents().subscribe( + jobEvent => { + let job: Job = this.jobs[jobEvent.jobId] + if (!job) { + console.log('Event for unknown job', jobEvent) + return + } + job.setLastEvent(jobEvent) + // Force a change detection on jobs, to run the orderBy pipe + this.jobs = { ...this.jobs } + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/admin/admin-scheduler/messages.component.css b/src/app/admin/admin-scheduler/messages.component.css new file mode 100644 index 0000000..dc695df --- /dev/null +++ b/src/app/admin/admin-scheduler/messages.component.css @@ -0,0 +1,14 @@ +.titleBar { + margin: 0.5em; + justify-content: space-between; + display: flex; +} + +.title { + font-size: 140%; + font-weight: bolder; +} + +.status { + text-align: right; +} \ No newline at end of file diff --git a/src/app/admin/admin-scheduler/messages.component.html b/src/app/admin/admin-scheduler/messages.component.html new file mode 100644 index 0000000..3c1907a --- /dev/null +++ b/src/app/admin/admin-scheduler/messages.component.html @@ -0,0 +1,13 @@ +
+
Messages
+
+
+ {{ time | date : 'medium' }} +
+
{{ status }}
+
+
+ + {{ msg }} + \ No newline at end of file diff --git a/src/app/admin/admin-scheduler/messages.component.ts b/src/app/admin/admin-scheduler/messages.component.ts new file mode 100644 index 0000000..9b82240 --- /dev/null +++ b/src/app/admin/admin-scheduler/messages.component.ts @@ -0,0 +1,76 @@ +import { Component, OnInit, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { Subject, timer } from 'rxjs' +import { map } from 'rxjs/operators' +import { WebSocketSubject } from 'rxjs/webSocket' + +import { SchedulerService, Job, JobEvent } from './scheduler.service' + +@Component({ + selector: 'gisaf-admin-scheduler-messages', + templateUrl: './messages.component.html', + styleUrls: ['./messages.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + SchedulerService, + ], +}) +export class AdminSchedulerMessagesComponent implements OnInit { + status: string = 'Not initialised' + msgs: string[] = [] + timeDelta: number // Time delta between browser and scheduler (positive: ) + time: Date + + constructor( + private cdr: ChangeDetectorRef, + protected schedulerService: SchedulerService, + ) {} + + ngOnInit() { + this.status = 'Connecting...' + this.getTime() + let onOpenSubject = new Subject() + let onCloseSubject = new Subject() + onOpenSubject.subscribe( + res => { + this.status = 'Connected' + this.cdr.markForCheck() + } + ) + onCloseSubject.subscribe( + (res: CloseEvent) => { + this.status = 'Disconnected - reason: ' + res.reason || res.code.toString() || 'unknown' + this.cdr.markForCheck() + } + ) + + let ws: WebSocketSubject = this.schedulerService.connect(onOpenSubject, onCloseSubject) + let foo = ws.next({ + 'message': 'subscribe', + }) + ws.subscribe( + data => { + this.msgs.push(data['msg']) + this.cdr.markForCheck() + } + ) + } + + getTime() { + // Get the time of the scheduler and set the running clock + this.schedulerService.getTime().subscribe( + serverTime => { + // Approximate the network latency: rountrip time + this.timeDelta = (serverTime.getTime() - new Date().getTime()) / 2 + 10 + // Just an approximate running clock for the user + timer(1000, 1000).subscribe( + _ => { + this.time = new Date(new Date().getTime() - this.timeDelta) + this.cdr.markForCheck() + } + ) + } + ) + } +} diff --git a/src/app/admin/admin-scheduler/scheduler.service.ts b/src/app/admin/admin-scheduler/scheduler.service.ts new file mode 100644 index 0000000..8c4cb22 --- /dev/null +++ b/src/app/admin/admin-scheduler/scheduler.service.ts @@ -0,0 +1,174 @@ +import { Injectable } from '@angular/core' +import { HttpClient } from '@angular/common/http' +import { Observable, Subject, of } from 'rxjs' +import { map } from 'rxjs/operators' + +// import { Apollo, QueryRef, gql } from 'apollo-angular' + +import { WebsocketService } from '../../_services/websocket.service' + +export class Feature { + constructor( + public store: string, + public id: string, + ) {} +} + +export class Job { + constructor( + public id: string, + public name: string, + public type: string, + public schedParams: string, + public nextRunTime: Date, + public lastRun: JobEvent, + public features?: Feature[], + ) {} + + setLastEvent(event: JobEvent) { + this.lastRun = event + this.nextRunTime = event.nextRunTime + } +} + +export class JobEvent { + constructor( + public jobId: string, + public time: Date, + public status: string, + public msg: string, + public nextRunTime: Date, + ) {} +} + +// const timeQuery = gql` +// query scheduler_time { +// scheduler_time +// } +// ` + +// const jobsQuery = gql` +// query scheduler_jobs { +// scheduler_jobs { +// id +// name +// type +// schedParams +// nextRunTime +// lastRun { +// time +// status +// msg +// nextRunTime +// } +// features { +// store +// id_ +// } +// } +// }` + +// const jobsEventsSubscription = gql` +// subscription { +// jobEvent { +// jobId +// time +// status +// msg +// nextRunTime +// } +// } +// ` + +@Injectable() +export class SchedulerService { + //jobsEventsSubscriptionRef: QueryRef + constructor( + private wsService: WebsocketService, + private _http: HttpClient, + // private apollo: Apollo + ) { + /* + this.jobsEventsSubscriptionRef = apollo.watchQuery({ + query: jobsEventsSubscription, + notifyOnNetworkStatusChange: true + }) + this.jobsEventsSubscriptionRef.valueChanges.subscribe( + val => console.log(val) + ) + */ + } + + connect(openObserver?: Subject, closeObserver?: Subject) { + const hostname = window.location.hostname + const port = window.location.port + let protocol = window.location.protocol == 'https:' ? 'wss:' : 'ws:' + this.wsService.connect( + protocol + '//' + hostname + ':' + port + '/_sched/events', + openObserver, + closeObserver + ) + this.wsService.ws.pipe(map( + foo => console.log(foo), + )) + return this.wsService.ws + } + + disconnect() { + this.wsService.disconnect() + } + + getTime(): Observable { + return this._http.get('/sched/time').pipe(map( + (result: string) => new Date(result) + )) + } + + getJobs(): Observable { + return this._http.get('/sched/jobs').pipe(map( + result => result && result.map( + job => new Job( + job['id'], + job['name'], + job['type'], + job['schedParams'], + job['nextRunTime'], + job['lastRun'] || new JobEvent( + job['id'], + undefined, + 'undef', + 'Pending display update', + undefined + ), + job['features'].map( + f => new Feature( + f['store'], + f['id_'], + ) + ) + ) + ) + )) + } + + getJobEvents(): Observable { + // Open a websocket connection for job event updates + this.wsService.subscribe('jobEvent') + return of(new JobEvent('',undefined,'','',undefined)) + // return this.apollo.subscribe({ + // query: jobsEventsSubscription, + // }, + // ).pipe(map( + // result => { + // let jobEvent = result['data']['jobEvent'] + // return new JobEvent( + // jobEvent['jobId'], + // jobEvent['time'], + // jobEvent['status'], + // jobEvent['msg'], + // jobEvent['nextRunTime'], + // ) + // } + // )) + } +} \ No newline at end of file diff --git a/src/app/admin/admin.component.css b/src/app/admin/admin.component.css new file mode 100644 index 0000000..681621f --- /dev/null +++ b/src/app/admin/admin.component.css @@ -0,0 +1,9 @@ +/*@import '../node_modules/@angular/material/prebuilt-themes/purple-green.css';*/ + +mat-sidenav { + width: 15em; +} + +mat-sidenav-content { + height: 95vh +} diff --git a/src/app/admin/admin.component.html b/src/app/admin/admin.component.html new file mode 100644 index 0000000..2d4e3b3 --- /dev/null +++ b/src/app/admin/admin.component.html @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/src/app/admin/admin.component.spec.ts b/src/app/admin/admin.component.spec.ts new file mode 100644 index 0000000..17040cb --- /dev/null +++ b/src/app/admin/admin.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { AdminComponent } from './admin.component'; + +describe('AdminComponent', () => { + let component: AdminComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ AdminComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AdminComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin.component.ts b/src/app/admin/admin.component.ts new file mode 100644 index 0000000..e43be52 --- /dev/null +++ b/src/app/admin/admin.component.ts @@ -0,0 +1,32 @@ +import { Component, ViewChild, OnInit } from '@angular/core' +import { ActivatedRoute } from '@angular/router' + +import { AdminListComponent } from './admin-list/admin-list.component' +import { SurveyMeta } from './admin-data.service' +import { AdminBasket } from './admin-basket/data.service' + +@Component({ + selector: 'gisaf-admin', + templateUrl: './admin.component.html', + styleUrls: ['./admin.component.css'], +}) +export class AdminComponent implements OnInit { + adminModelsMenuItems: Object[] = [] + @ViewChild(AdminListComponent, {static: true}) adminList: AdminListComponent + baskets: AdminBasket[] + surveyMeta: SurveyMeta + + constructor( + private route: ActivatedRoute, + ) {} + + ngOnInit() { + this.route.data.subscribe( + resp => { + this.baskets = resp['item'][0] + this.surveyMeta = resp['item'][1] + this.adminModelsMenuItems = resp['item'][2] + } + ) + } +} diff --git a/src/app/admin/admin.module.spec.ts b/src/app/admin/admin.module.spec.ts new file mode 100644 index 0000000..ee0b403 --- /dev/null +++ b/src/app/admin/admin.module.spec.ts @@ -0,0 +1,13 @@ +import { AdminModule } from './admin.module'; + +describe('AdminModule', () => { + let adminModule: AdminModule; + + beforeEach(() => { + adminModule = new AdminModule(); + }); + + it('should create an instance', () => { + expect(adminModule).toBeTruthy(); + }); +}); diff --git a/src/app/admin/admin.module.ts b/src/app/admin/admin.module.ts new file mode 100644 index 0000000..75e0d9c --- /dev/null +++ b/src/app/admin/admin.module.ts @@ -0,0 +1,137 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' + +import { DragDropModule } from '@angular/cdk/drag-drop' + +import { MatAutocompleteModule } from '@angular/material/autocomplete' +import { MatBadgeModule } from '@angular/material/badge' +import { MatButtonModule } from '@angular/material/button' +import { MatCardModule } from '@angular/material/card' +import { MatCheckboxModule } from '@angular/material/checkbox' +import { MatChipsModule } from '@angular/material/chips' +import { MatNativeDateModule } from '@angular/material/core' +import { MatDatepickerModule } from '@angular/material/datepicker' +import { MatDialogModule } from '@angular/material/dialog' +import { MatExpansionModule } from '@angular/material/expansion' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatIconModule } from '@angular/material/icon' +import { MatInputModule } from '@angular/material/input' +import { MatListModule } from '@angular/material/list' +import { MatMenuModule } from '@angular/material/menu' +import { MatPaginatorModule } from '@angular/material/paginator' +import { MatProgressBarModule } from '@angular/material/progress-bar' +import { MatSelectModule } from '@angular/material/select'; +import { MatSidenavModule } from '@angular/material/sidenav' +import { MatSnackBarModule } from '@angular/material/snack-bar' +import { MatSortModule } from '@angular/material/sort' +import { MatTableModule } from '@angular/material/table' +import { MatTooltipModule } from '@angular/material/tooltip' + +import { FlexLayoutModule } from 'ngx-flexible-layout' + +import { AdminComponent } from './admin.component' +import { AdminRoutingModule } from './admin-routing.module' +import { AdminDataService } from './admin-data.service' +import { AdminHomeComponent } from './admin-home/admin-home.component' +import { AdminAccessComponent } from './admin-manage/access/users-roles.component' +import { AdminUserComponent } from './admin-manage/access/user.component' +import { AdminRoleComponent } from './admin-manage/access/role.component' +import { GisafAdminAccessUserDialogComponent } from './admin-manage/access/user-dialog.component' +import { GisafAdminAccessRoleDialogComponent } from './admin-manage/access/role-dialog.component' +import { AdminBasketComponent } from './admin-basket/basket.component' +import { AdminBasketUploadComponent } from './admin-basket/admin-basket-upload/basket-upload.component' +import { AdminListComponent } from './admin-list/admin-list.component' +import { AdminMenuComponent } from './admin-menu/admin-menu.component' +import { AdminPointsByOrigIdComponent } from './admin-manage/points-by-orig-id/points-by-orig-id.component' +import { RawSurveyPointComponent } from './admin-manage/raw-survey-point/raw-survey-point.component' +import { CategoryComponent } from './admin-manage/category/category.component' +import { GisafAdminCategoryDialogComponent } from './admin-manage/category/dialog.component' +import { AdminDetailModule } from './admin-detail/admin-detail.module' +import { AdminManageDataService } from './admin-manage/data.service' +import { AdminManageAccessDataService } from './admin-manage/access/access-data.service' +import { AdminBasketDataService } from './admin-basket/data.service'; +import { ProjectComponent } from './admin-manage/project/project.component' +import { GisafAdminProjectDialogComponent } from './admin-manage/project/dialog.component'; +import { AdminIntegrityComponent } from './admin-manage/integrity/integrity.component' +import { AdminMaintenanceComponent } from './admin-manage/maintenance/maintenance.component' +import { AdminSchedulerMessagesComponent } from './admin-scheduler/messages.component' +import { AdminSchedulerJobsComponent } from './admin-scheduler/jobs.component' +import { AdminSchedulerJobComponent } from './admin-scheduler/job.component' +import { AdminSchedulerFeatureComponent } from './admin-scheduler/feature.component' +import { WebsocketService } from '../_services/websocket.service' +import { PipesModule } from '../pipes.module' + +@NgModule({ + imports: [ + CommonModule, + + FormsModule, + ReactiveFormsModule, + + DragDropModule, + + MatAutocompleteModule, + MatBadgeModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatNativeDateModule, + MatDatepickerModule, + MatDialogModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatPaginatorModule, + MatProgressBarModule, + MatSelectModule, + MatSidenavModule, + MatSnackBarModule, + MatSortModule, + MatTableModule, + MatTooltipModule, + + FlexLayoutModule, + + AdminRoutingModule, + AdminDetailModule, + PipesModule, + ], + declarations: [ + AdminComponent, + AdminHomeComponent, + AdminAccessComponent, + AdminUserComponent, + AdminRoleComponent, + GisafAdminAccessUserDialogComponent, + GisafAdminAccessRoleDialogComponent, + AdminBasketComponent, + AdminBasketUploadComponent, + AdminListComponent, + AdminMenuComponent, + AdminPointsByOrigIdComponent, + RawSurveyPointComponent, + CategoryComponent, + GisafAdminCategoryDialogComponent, + ProjectComponent, + GisafAdminProjectDialogComponent, + AdminIntegrityComponent, + AdminMaintenanceComponent, + AdminSchedulerFeatureComponent, + AdminSchedulerJobsComponent, + AdminSchedulerJobComponent, + AdminSchedulerMessagesComponent, + ], + providers: [ + AdminDataService, + AdminManageDataService, + AdminManageAccessDataService, + AdminBasketDataService, + WebsocketService, + ] +}) +export class AdminModule { } diff --git a/src/app/admin/datasource.ts b/src/app/admin/datasource.ts new file mode 100644 index 0000000..c236c60 --- /dev/null +++ b/src/app/admin/datasource.ts @@ -0,0 +1,100 @@ +import { DataSource } from '@angular/cdk/collections' + +import { MatPaginator } from '@angular/material/paginator' +import { MatSort } from '@angular/material/sort' + +import { Observable, of as observableOf, merge, BehaviorSubject } from 'rxjs' +import { map } from 'rxjs/operators' + +import { gql } from 'apollo-angular' + +import { ModelDataService } from '../_services/apollo.service' +import { AppInjector } from '../app-injector' + +export class TableDataSource extends DataSource { + dataStream = new BehaviorSubject([]) + set data(v: object[]) { this.dataStream.next(v); } + get data(): object[] { return this.dataStream.value; } + + modelDef: object[] + loading:boolean = true + modelDataService: ModelDataService + length: number = 0 + paginator: MatPaginator + sort: MatSort + displayedColumns: string[] + + constructor( + paginator, + sort, + modelDef, + displayedColumns + ) { + super() + this.paginator = paginator + this.sort = sort + this.modelDef = modelDef + this.displayedColumns = displayedColumns + this.modelDataService = AppInjector.get(ModelDataService) + } + + connect(): Observable { + let cols = this.displayedColumns.join(' ') + let query = gql`query model {${this.modelDef['name']}{${cols}}}` + return this.fetch(query) + } + + disconnect(): void { + } + + fetch(query): Observable { + this.modelDataService.get(query).pipe(map( + data => { + //let edges = data[this.modelDef['name']]['edges'] + //this.loading = data['loading'] + //this.data = edges.map(e => e.node) + // Set the paginators length + this.loading = false + this.data = data[this.modelDef['name']] + this.paginator.length = this.data.length + return this.data + } + )).subscribe() + + const dataMutations = [ + this.dataStream, + this.paginator.page, + this.sort.sortChange + ] + + return merge(...dataMutations).pipe(map(() => { + return this.getPagedData(this.getSortedData([...this.data])) + })) + } + + private getPagedData(data: object[]) { + const startIndex = this.paginator.pageIndex * this.paginator.pageSize + return data.splice(startIndex, this.paginator.pageSize) + } + + private getSortedData(data: object[]) { + if (!this.sort.active || this.sort.direction === '') { + return data + } + + return data.sort((a, b) => { + const isAsc = this.sort.direction === 'asc' + let col = this.sort.active + return compare(a[col], b[col], isAsc) + }) + } + + set filter(searchString) { + console.log(searchString) + } +} + +/** Simple sort comparator for example ID/Name columns (for client-side sorting). */ +function compare(a, b, isAsc) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1) +} diff --git a/src/app/admin/models.ts b/src/app/admin/models.ts new file mode 100644 index 0000000..0230de2 --- /dev/null +++ b/src/app/admin/models.ts @@ -0,0 +1,35 @@ +export class FieldType { + constructor( + public name: string, + ) { } +} + +export class Field { + constructor( + public name: string, + public type: FieldType, + ) { } +} + +export class Relation { + constructor( + public target: Model, + public targetField: Field, + ) { } +} + +export class Model { + constructor( + public pkField: string, + public fields: {[name: string]: Field}, + public relations: {[key: string]: Relation}, + ) { } +} + +export class Instance { + constructor( + public model: Model, + public pk: any, + public data: {[name: string]: any}, + ) { } +} diff --git a/src/app/animations.ts b/src/app/animations.ts new file mode 100644 index 0000000..c8cdd31 --- /dev/null +++ b/src/app/animations.ts @@ -0,0 +1,37 @@ +import { animate, state, style, transition, trigger } from '@angular/animations' + +// Component transition animations +export const slideInDownAnimation = + trigger('routeAnimation', [ + state('*', + style({ + opacity: 1, + transform: 'translateX(0)' + }) + ), + transition(':enter', [ + style({ + opacity: 0, + transform: 'translateX(-100%)' + }), + animate('0.2s ease-in') + ]), + transition(':leave', [ + animate('0.5s ease-out', style({ + opacity: 0, + transform: 'translateX(100%)' + })) + ]) + ]) + +export const fadeInAnimation = + // trigger name for attaching this animation to an element using the [@triggerName] syntax + trigger('fadeInAnimation', [ + transition(':enter', [ + style({ opacity: 0 }), + animate('.3s', style({ opacity: 1 })) + ]), + transition(':leave', [ + animate('0.3s', style({ opacity: 0 })) + ]) + ]) diff --git a/src/app/app-injector.ts b/src/app/app-injector.ts new file mode 100644 index 0000000..ecbdc7c --- /dev/null +++ b/src/app/app-injector.ts @@ -0,0 +1,24 @@ +import {Injector} from '@angular/core'; + +/** + * Allows for retrieving singletons using `AppInjector.get(MyService)` (whereas + * `ReflectiveInjector.resolveAndCreate(MyService)` would create a new instance + * of the service). + */ +export let AppInjector: Injector; + +/** + * Helper to set the exported {@link AppInjector}, needed as ES6 modules export + * immutable bindings (see http://2ality.com/2015/07/es6-module-exports.html) for + * which trying to make changes after using `import {AppInjector}` would throw: + * "TS2539: Cannot assign to 'AppInjector' because it is not a variable". + */ +export function setAppInjector(injector: Injector) { + if (AppInjector) { + // Should not happen + console.error('Programming error: AppInjector was already set'); + } + else { + AppInjector = injector; + } +} diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 0000000..6b5b0f9 --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,24 @@ +import { NgModule } from '@angular/core' +import { RouterModule, Routes } from '@angular/router' +import { configResolver } from './config.service' +import { LoginComponent } from './login/login.component' +import { PageNotFoundComponent } from './pageNotFound.component' + +const routes: Routes = [ + { path: '', redirectTo: '/dashboard', pathMatch: 'full' }, + { path: 'login', component: LoginComponent }, + { path: 'dashboard', loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule) }, + { path: 'map', loadChildren: () => import('./map/map.module').then(m => m.MapModule), resolve: {conf: configResolver}, }, + { path: 'measures', loadChildren: () => import('./measures/measures.module').then(m => m.MeasuresModule) }, + { path: 'admin', loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule) }, + { path: '**', component: PageNotFoundComponent } +] + +@NgModule({ + imports: [ RouterModule.forRoot(routes, { + enableTracing: false +})], + exports: [ RouterModule ] +}) + +export class AppRoutingModule {} diff --git a/src/app/app.component.css b/src/app/app.component.css new file mode 100644 index 0000000..8895e77 --- /dev/null +++ b/src/app/app.component.css @@ -0,0 +1,27 @@ +#title { + font-size: 0.5em; + width: 6em; + white-space: normal; + line-height: 1em; + cursor: pointer; + color: white; + text-decoration: none; +} + +#title.active { + background-color: inherit; + color: indianred; +} + +.gisafIcon { + cursor: pointer; +} + +/* ng-deep is deprecated, but i couldn't get it working with the new :host syntax */ +::ng-deep .mat-mdc-menu-panel.extended-width { + max-width: inherit !important; +} + +::ng-deep html.cdk-global-scrollblock { + overflow-y: hidden; +} \ No newline at end of file diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 0000000..503bbe8 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 0000000..84c1876 --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,27 @@ +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { AppComponent } from './app.component'; +describe('AppComponent', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + declarations: [ + AppComponent + ], + }).compileComponents(); + }); + it('should create the app', waitForAsync(() => { + let fixture = TestBed.createComponent(AppComponent); + let app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); + it(`should have as title 'app works!'`, waitForAsync(() => { + let fixture = TestBed.createComponent(AppComponent); + let app = fixture.debugElement.componentInstance; + expect(app.title).toEqual('app works!'); + })); + it('should render title in a h1 tag', waitForAsync(() => { + let fixture = TestBed.createComponent(AppComponent); + fixture.detectChanges(); + let compiled = fixture.debugElement.nativeElement; + expect(compiled.querySelector('h1').textContent).toContain('app works!'); + })); +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 0000000..52f9805 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,78 @@ +import { Component, OnInit, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' +import { Title } from '@angular/platform-browser' +import { BootstrapService } from './_services/bootstrap.service' +import { ConfigService } from './config.service' +import { MatSnackBar } from '@angular/material/snack-bar' + +import { AuthenticationService } from './_services/authentication.service' + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AppComponent implements OnInit { + title = 'Gisaf' + version: string + + routes = [ + { + 'target': 'dashboard', + 'icon': 'home', + 'text': 'Home', + }, + { + 'target': 'map', + 'icon': 'map', + 'text': 'Map', + }, + { + 'target': 'measures', + 'icon': 'insert_chart', + 'text': 'Measures', + }, + ] + + constructor( + public configService: ConfigService, + private titleService: Title, + private bootstrapService: BootstrapService, + public authenticationService: AuthenticationService, + private snackBar: MatSnackBar, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + // Bootstrap: set app wide configuration + this.bootstrapService.get().subscribe({ + next: res => { + this.version = res.version + this.title = res.title || this.title + this.titleService.setTitle(res.windowTitle || this.title) + this.configService.setConf(res) + this.authenticationService.roles = res.user.roles || [] + if (res.redirect && (window != window.top)) { + // Refusing to be embedded in an iframe + let loc = res.redirect + window.location.pathname + window.document.body.innerHTML = ` + The web site you are visiting is trying to embed Gisaf (${this.title}) in an iFrame, it isn't a nice thing to do.
+ Please click this link to go to the real site: ${loc} + ` + } + }, + error: err => { + this.snackBar.open( + 'Cannot connect to the server (' + err.statusText + '). Please retry later.', + 'OK' + ) + } + }) + + this.authenticationService.isLoggedIn().subscribe({ + next: resp => resp, + error: (err: string) => this.snackBar.open(err, 'OK', {duration: 3000}) + }) + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 0000000..3647009 --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,176 @@ +import { BrowserModule } from '@angular/platform-browser' +import { BrowserAnimationsModule } from '@angular/platform-browser/animations' +import { Injector, NgModule, LOCALE_ID } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { HttpClientModule } from '@angular/common/http' + +import { MatButtonModule } from '@angular/material/button' +import { MatIconModule } from '@angular/material/icon' +import { MatSnackBarModule } from '@angular/material/snack-bar' +import { MatSnackBar } from '@angular/material/snack-bar' +import { MatToolbarModule } from '@angular/material/toolbar' +import { MatTooltipModule } from '@angular/material/tooltip' + +import { FlexLayoutModule } from 'ngx-flexible-layout' + +import { ApolloModule, APOLLO_OPTIONS } from 'apollo-angular' +import { HttpLink } from 'apollo-angular/http' +import { onError } from '@apollo/client/link/error' +import { split, from, ApolloLink, InMemoryCache, ApolloClientOptions } from '@apollo/client/core' +import { WebSocketLink } from '@apollo/client/link/ws' +import { getMainDefinition, getOperationName } from '@apollo/client/utilities' +import { DefinitionNode } from 'graphql' + +import { AppComponent } from './app.component' +import { PageNotFoundComponent } from './pageNotFound.component' +import { LoginModule } from './login/login.module' +import { AuthenticationService } from './_services/authentication.service' +import { BootstrapService } from './_services/bootstrap.service' +import { ModelDataService } from './_services/apollo.service' +import { ActionsService } from './_services/actions.service' +import { ConfigService } from './config.service' + +import { ApiService } from './openapi/services/ApiService' +import { AdminService } from './openapi/services/AdminService' +import { DashboardService } from './openapi/services/DashboardService' +import { GeoapiService } from './openapi/services/GeoapiService' +import { MapService } from './openapi/services/MapService' + +import { HtmlSnackbarComponent } from './custom-snackbar/custom-snackbar.component' + +import { AppRoutingModule } from './app-routing.module' +import { environment } from '../environments/environment' + +@NgModule({ + declarations: [ + AppComponent, + PageNotFoundComponent, + HtmlSnackbarComponent, + ], + imports: [ + ApolloModule, + + BrowserModule, + BrowserAnimationsModule, + + FormsModule, + HttpClientModule, + + MatToolbarModule, + MatButtonModule, + MatIconModule, + MatSnackBarModule, + + MatTooltipModule, + + FlexLayoutModule, + + AppRoutingModule, + LoginModule, + ], + providers: [ + ActionsService, + AuthenticationService, + BootstrapService, + ApiService, + AdminService, + GeoapiService, + DashboardService, + MapService, + ConfigService, + ModelDataService, + { + provide: LOCALE_ID, + useValue: "en-IN" + }, + { + provide: APOLLO_OPTIONS, + useFactory(httpLink: HttpLink, snackBar: MatSnackBar) { + const definitionIsMutation = (d: DefinitionNode) => { + return d.kind === 'OperationDefinition' && d.operation === 'mutation' + } + + // See https://github.com/apollographql/apollo-angular/issues/1013 + const linkQueries = httpLink.create({ + uri: '/graphql', + method: 'GET', + }) + + const linkMutations = httpLink.create({ + uri: '/graphql', + }) + + const splittedLink = split( + ({ query }) => query.definitions.some(definitionIsMutation), + linkMutations, + linkQueries, + ) + + const schedulerQueriesLink = httpLink.create({ + uri: '/graphql_sched', + method: 'GET', + }) + + const proxyLink = split( + ({ query }) => { + let res = query.definitions[0]['name']['value'].startsWith('scheduler_') + return res + }, + schedulerQueriesLink, + splittedLink + ) + + const errorLink = onError(({ graphQLErrors, networkError }) => { + if (graphQLErrors) + graphQLErrors.map(({ message, locations, path }) => { + snackBar.open(`Error: ${message}`, 'close') + console.error( + `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`, + graphQLErrors + ) + } + ) + if (networkError) { + snackBar.open( + `Network error: ${networkError['statusText']}`, + 'close', + ) + console.error(networkError) + } + }) + + const httpLinkWithErrorHandling = from([ + errorLink, + proxyLink, + ]) + + return { + link: httpLinkWithErrorHandling, + cache: new InMemoryCache(), + defaultOptions: { + watchQuery: { + fetchPolicy: 'network-only', + errorPolicy: 'ignore', + }, + query: { + fetchPolicy: 'network-only', + errorPolicy: 'all', + }, + subscription: { + fetchPolicy: 'network-only', + errorPolicy: 'all', + } + }, + } + }, + deps: [ + HttpLink, + MatSnackBar + ], + } + ], + bootstrap: [ + AppComponent + ] +}) +export class AppModule {} \ No newline at end of file diff --git a/src/app/config.service.ts b/src/app/config.service.ts new file mode 100644 index 0000000..daae786 --- /dev/null +++ b/src/app/config.service.ts @@ -0,0 +1,52 @@ +import { inject, Injectable } from "@angular/core" +import { ActivatedRouteSnapshot, ResolveFn, RouterStateSnapshot } from "@angular/router" +import { Subject, ReplaySubject, BehaviorSubject, Observable, map } from "rxjs" + +export class Config { + map = {} + proj = {} + measures = {} +} + +@Injectable({ + providedIn: 'root' +}) +export class ConfigService { + defaultConf: Config = { + 'map': {}, + 'proj': {}, + 'measures': {} + } + + hasConf = new ReplaySubject() + public conf: BehaviorSubject = new BehaviorSubject(new Config()) + + /* + bootstrap() { + return this.httpClient.get('/v1/bootstrap').subscribe( + resp => { + this.conf.value.server = resp['server'] + this.conf.value.client = resp['client'] + this.conf.value.app = resp['app'] + this.conf.next(this.conf.value) + } + ) + } + */ + + setConf(c: Object) { + this.conf.value.map = c['map'] + this.conf.value.proj = c['proj'] + this.conf.value.measures = c['measures'] + this.conf.next(this.conf.value) + this.hasConf.next(undefined) + } +} + +export const configResolver: ResolveFn> = + (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => { + let configService = inject(ConfigService) + return configService.hasConf.pipe(map( + _ => configService.conf.value + )) + } \ No newline at end of file diff --git a/src/app/custom-snackbar/custom-snackbar.component.html b/src/app/custom-snackbar/custom-snackbar.component.html new file mode 100644 index 0000000..f05b102 --- /dev/null +++ b/src/app/custom-snackbar/custom-snackbar.component.html @@ -0,0 +1,12 @@ +
+
{{ data['message']}}
+
+ + + + + +
{{ row.key }}{{ row.value }}
+
+ +
\ No newline at end of file diff --git a/src/app/custom-snackbar/custom-snackbar.component.scss b/src/app/custom-snackbar/custom-snackbar.component.scss new file mode 100644 index 0000000..7cccf33 --- /dev/null +++ b/src/app/custom-snackbar/custom-snackbar.component.scss @@ -0,0 +1,16 @@ +.container { + display: flex; + flex-direction: column; +} + +.message { + flex: 1; +} + +.data { + flex: 1; +} + +.data tr { + text-align: left; +} \ No newline at end of file diff --git a/src/app/custom-snackbar/custom-snackbar.component.ts b/src/app/custom-snackbar/custom-snackbar.component.ts new file mode 100644 index 0000000..b8d7f93 --- /dev/null +++ b/src/app/custom-snackbar/custom-snackbar.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit, Inject } from '@angular/core' +import { MatSnackBar, MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar' + +@Component({ + selector: 'gisaf-html-snackbar', + templateUrl: './custom-snackbar.component.html', + styleUrls: ['./custom-snackbar.component.scss'] +}) +export class HtmlSnackbarComponent { +constructor( + @Inject(MAT_SNACK_BAR_DATA) public data: any, + public snackBar: MatSnackBar + ) {} +} \ No newline at end of file diff --git a/src/app/dashboard/dashboard-home/dashboard-home.component.css b/src/app/dashboard/dashboard-home/dashboard-home.component.css new file mode 100644 index 0000000..3932177 --- /dev/null +++ b/src/app/dashboard/dashboard-home/dashboard-home.component.css @@ -0,0 +1,10 @@ +/*@import '../node_modules/@angular/material/prebuilt-themes/purple-green.css';*/ + +a { + color: #a65038; + text-decoration: none; +} + +.mat-mdc-card-footer a { + padding: 0 5px; +} diff --git a/src/app/dashboard/dashboard-home/dashboard-home.component.html b/src/app/dashboard/dashboard-home/dashboard-home.component.html new file mode 100644 index 0000000..619c514 --- /dev/null +++ b/src/app/dashboard/dashboard-home/dashboard-home.component.html @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/app/dashboard/dashboard-home/dashboard-home.component.ts b/src/app/dashboard/dashboard-home/dashboard-home.component.ts new file mode 100644 index 0000000..ec3b88e --- /dev/null +++ b/src/app/dashboard/dashboard-home/dashboard-home.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { DashboardService, DashboardHome } from '../../openapi' + + +@Component({ + selector: 'gisaf-dashboard-home', + templateUrl: './dashboard-home.component.html', + styleUrls: ['./dashboard-home.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DashboardHomeComponent implements OnInit { + constructor( + public dashboardService: DashboardService, + private cdr: ChangeDetectorRef, + ) {} + + dashboardHome: DashboardHome = { + title: 'Welcome to Gisaf!', + content: 'Gisaf is free, open source software for geomatics and GIS: Gisaf.', + footer: 'GNU GPL v3 license' + } + + ngOnInit() { + this.dashboardService.getHomeApiDashboardHomeGet().subscribe( + data => { + this.dashboardHome = data + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/dashboard/dashboard-menu/dashboard-menu.component.html b/src/app/dashboard/dashboard-menu/dashboard-menu.component.html new file mode 100644 index 0000000..31dfc9c --- /dev/null +++ b/src/app/dashboard/dashboard-menu/dashboard-menu.component.html @@ -0,0 +1,24 @@ +

Dashboards

+ + + + + {{ menuItem['name'] }} + + + + + + + diff --git a/src/app/dashboard/dashboard-menu/dashboard-menu.component.scss b/src/app/dashboard/dashboard-menu/dashboard-menu.component.scss new file mode 100644 index 0000000..3fa19ec --- /dev/null +++ b/src/app/dashboard/dashboard-menu/dashboard-menu.component.scss @@ -0,0 +1,31 @@ +/*@import '../node_modules/@angular/material/prebuilt-themes/purple-green.css';*/ + +:host ::ng-deep .mat-expansion-panel-body { + padding-left: 2px; + padding-right: 2px; +} + +.mat-mdc-list-item { + width: 100%; + display: block; + .mdc-button { + width: 100%; + } +} + +.active { + color: #efe00b; +} + +.mat-expansion-panel-header { + font-weight: 900; + padding: 0 10px; +} + +.mat-expansion-panel-body { + padding: 0 10px 10px 10px; +} + +h3 { + text-align: center; +} diff --git a/src/app/dashboard/dashboard-menu/dashboard-menu.component.ts b/src/app/dashboard/dashboard-menu/dashboard-menu.component.ts new file mode 100644 index 0000000..6b174d6 --- /dev/null +++ b/src/app/dashboard/dashboard-menu/dashboard-menu.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit, Input, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { DashboardService, DashboardGroup } from '../../openapi' + + +@Component({ + selector: 'gisaf-dashboard-menu', + templateUrl: './dashboard-menu.component.html', + styleUrls: ['./dashboard-menu.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DashboardMenuComponent implements OnInit { + @Input() menuItems: DashboardGroup[] + + constructor( + public dashboardService: DashboardService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + this.dashboardService.getGroupsApiDashboardGroupsGet().subscribe( + data => { + this.menuItems = data + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/dashboard/dashboard-menu/dashoard-menu.component.spec.ts b/src/app/dashboard/dashboard-menu/dashoard-menu.component.spec.ts new file mode 100644 index 0000000..1726bba --- /dev/null +++ b/src/app/dashboard/dashboard-menu/dashoard-menu.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { DashboardMenuComponent } from './dashboard-menu.component' + +describe('DashboardMenuComponent', () => { + let component: DashboardMenuComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DashboardMenuComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DashboardMenuComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dashboard/dashboard-page/dashboard-page-resolver.service.ts b/src/app/dashboard/dashboard-page/dashboard-page-resolver.service.ts new file mode 100644 index 0000000..6689f0b --- /dev/null +++ b/src/app/dashboard/dashboard-page/dashboard-page-resolver.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core' +import { Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable } from 'rxjs' + +import { DashboardDataService } from '../../_services/apollo.service' + +@Injectable() +export class DashboardPageResolver implements Resolve { + constructor( + private dashboardDataService: DashboardDataService, + ) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.dashboardDataService.getDashboardPage( + route.paramMap.get('group'), + route.paramMap.get('name') + ) + } +} diff --git a/src/app/dashboard/dashboard-page/dashboard-page-sections.component.html b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.html new file mode 100644 index 0000000..fc810ab --- /dev/null +++ b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.html @@ -0,0 +1,23 @@ +
+ + Pick one section + + + + + + {{ item.name }} + + +
+ +
+ +
\ No newline at end of file diff --git a/src/app/dashboard/dashboard-page/dashboard-page-sections.component.scss b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.scss new file mode 100644 index 0000000..14e4ad1 --- /dev/null +++ b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.scss @@ -0,0 +1,13 @@ +.plot { + text-align: center; + margin-top: 3px; + + img { + max-width: 100%; + background-color: white; + } +} + +.sectionList { + width: 100%; +} \ No newline at end of file diff --git a/src/app/dashboard/dashboard-page/dashboard-page-sections.component.ts b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.ts new file mode 100644 index 0000000..af643f0 --- /dev/null +++ b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.ts @@ -0,0 +1,99 @@ +import { Component, OnInit, Input, ViewChild, ElementRef, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' +import { ActivatedRoute, Params, Router } from '@angular/router' + +import { Observable, of } from 'rxjs' +import { map, startWith } from 'rxjs/operators' + +import { UntypedFormControl } from '@angular/forms' + +import { DashboardPage, DashboardPageSection } from '../../_services/apollo.service' + +const expandDefault = ['attachment', 'plot', 'html'] + +export class Section { + constructor( + public $uri: string, + public name: string, + ) {} +} + +@Component({ + selector: 'gisaf-dashboard-page-sections', + templateUrl: './dashboard-page-sections.component.html', + styleUrls: ['./dashboard-page-sections.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class DashboardPageSectionsComponent implements OnInit { + @Input() page: DashboardPage + currentSection: DashboardPageSection + myControl: UntypedFormControl = new UntypedFormControl() + @ViewChild('ipt', { static: true }) ipt: ElementRef + //sections: Section[] = [] + filteredOptions: Observable + + constructor( + protected route: ActivatedRoute, + protected router: Router, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + this.route.queryParams.subscribe( + (params: Params) => { + let s: DashboardPageSection[] = this.page.sections.filter(s=>s.name == params['section']) + if (s.length > 0) { + this.select(s[0]) + } + } + ) + this.filteredOptions = this.myControl.valueChanges.pipe( + startWith(''), + //map(val => this.filter(val)), + map( + section => { + if (section) { + if (typeof section === 'object') { + this.router.navigate([], { + queryParams: { + section: section['name'] + }, + // Prevents server query, as the page has data for all sections + queryParamsHandling: 'merge', + //relativeTo: this.route + }) + return section['name'] + } + return section + } + } + ), + map( + name => { + if (!name || this.page.sections.filter(ri => ri.name === name).length) { + return this.page.sections.slice() + } + if (typeof name === 'string') { + return this.filter(name) + } + } + ) + ) + } + + filter(val: string): DashboardPageSection[] { + let filter = val.toLowerCase() + return this.page.sections.filter(option => { + return option.name.toLowerCase().indexOf(filter) != -1 + }) + } + + select(section: DashboardPageSection) { + this.currentSection = section + this.cdr.markForCheck() + } + + displayFn(item: any): string { + return item ? item.name : item + } +} \ No newline at end of file diff --git a/src/app/dashboard/dashboard-page/dashboard-page.component.css b/src/app/dashboard/dashboard-page/dashboard-page.component.css new file mode 100644 index 0000000..a2b30ea --- /dev/null +++ b/src/app/dashboard/dashboard-page/dashboard-page.component.css @@ -0,0 +1,36 @@ +.mat-mdc-card-footer { + text-align: right; + font-size: 90%; + padding: 2px; +} + +a { + color: #c9faff; +} + +.mat-mdc-card-content .center { + text-align: center; +} + +:host ::ng-deep .item table { + border-collapse: collapse; +} + +:host ::ng-deep table th.mat-mdc-header-cell { + padding: 0 0.5em; +} + +:host ::ng-deep table td.mat-mdc-cell { + padding: 0 0.5em; +} +:host ::ng-deep table td.mat-mdc-footer-cell { + padding: 0 0.5em; +} + +:host ::ng-deep .mat-mdc-card-content .item table td { + border: 1px solid grey; +} + +.errors { + color: red +} diff --git a/src/app/dashboard/dashboard-page/dashboard-page.component.html b/src/app/dashboard/dashboard-page/dashboard-page.component.html new file mode 100644 index 0000000..c984f53 --- /dev/null +++ b/src/app/dashboard/dashboard-page/dashboard-page.component.html @@ -0,0 +1,74 @@ + + + {{ page.group }} / {{ page.name }} + + + {{ page.description }} + + +

+ Error: {{ page.errors }} +

+ + + + Visual + +
+ +
+
+ + + Plot + + + + + + + + Information + + +
+
+ + + + Data + + + + + + + + + +
{{ colName }} {{ value[colName] }}
+
+ + +
+
+ + + Generated: {{ page.time | date: 'dd/MM/yyyy HH:mm:ss' }} + + + from: {{ page.notebook.split('/').splice(-1) }} + + +
diff --git a/src/app/dashboard/dashboard-page/dashboard-page.component.ts b/src/app/dashboard/dashboard-page/dashboard-page.component.ts new file mode 100644 index 0000000..f9357b0 --- /dev/null +++ b/src/app/dashboard/dashboard-page/dashboard-page.component.ts @@ -0,0 +1,60 @@ +import { Component, OnInit, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' + +import { DashboardPage } from '../../_services/apollo.service' + +const expandDefault = ['attachment', 'plot', 'html'] + +@Component({ + selector: 'gisaf-dashboard-page', + templateUrl: './dashboard-page.component.html', + styleUrls: ['./dashboard-page.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class DashboardPageComponent implements OnInit { + page: DashboardPage + multiPanel: boolean = true + df_columns: string[] + // Default expanded panels + expand: string[] = [] + + plotlyConfig = { + displaylogo: false, + scrollZoom: true, + responsive: false, + toImageButtonOptions: { + format: 'svg', // one of png, svg, jpeg, webp + //filename: 'custom_image', + height: null, + width: null, + //scale: 1 // Multiply title/legend/axis/canvas sizes by this factor + } + } + + constructor( + protected route: ActivatedRoute, + protected router: Router, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + this.route.data.subscribe( + (data: DashboardPage) => { + let item = data['item'] + if (item.dfData) { + this.df_columns = item.dfData['schema']['fields'].map(f => f.name) + item.dfData = item.dfData['data'] + } + this.page = item + if (this.page.expandedPanes.length > 0) { + this.expand = this.page.expandedPanes + } + else { + this.expand = expandDefault + } + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/dashboard/dashboard-routing.module.ts b/src/app/dashboard/dashboard-routing.module.ts new file mode 100644 index 0000000..f3255bb --- /dev/null +++ b/src/app/dashboard/dashboard-routing.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from '@angular/core' +import { Routes, RouterModule } from '@angular/router' + +import { DashboardComponent } from './dashboard.component' +import { DashboardPageComponent } from './dashboard-page/dashboard-page.component' +import { DashboardPageResolver } from './dashboard-page/dashboard-page-resolver.service' + +const routes: Routes = [ + { + path: '', + component: DashboardComponent, + children: [ + { + path: ':group/:name', + component: DashboardPageComponent, + resolve: { + item: DashboardPageResolver + } + }, + ] + } +] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [DashboardPageResolver] +}) +export class DashboardRoutingModule { } diff --git a/src/app/dashboard/dashboard.component.css b/src/app/dashboard/dashboard.component.css new file mode 100644 index 0000000..95f1a0a --- /dev/null +++ b/src/app/dashboard/dashboard.component.css @@ -0,0 +1,16 @@ +/* +.mat-card-content { + background-image: url('../../assets/images/background.png'); + background-size: contain; + background-repeat: no-repeat; + background-position-x: center; +} +*/ + +mat-sidenav { + width: 12em; +} + +mat-sidenav-content { + height: 95vh +} diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html new file mode 100644 index 0000000..bfb2097 --- /dev/null +++ b/src/app/dashboard/dashboard.component.html @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/src/app/dashboard/dashboard.component.spec.ts b/src/app/dashboard/dashboard.component.spec.ts new file mode 100644 index 0000000..c7ae5de --- /dev/null +++ b/src/app/dashboard/dashboard.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { DashboardComponent } from './dashboard.component'; + +describe('DashboardComponent', () => { + let component: DashboardComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ DashboardComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DashboardComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts new file mode 100644 index 0000000..53334ae --- /dev/null +++ b/src/app/dashboard/dashboard.component.ts @@ -0,0 +1,14 @@ +import { Component, ViewChild, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { DashboardPageComponent } from './dashboard-page/dashboard-page.component' + +@Component({ + selector: 'gisaf-dashboard', + templateUrl: './dashboard.component.html', + styleUrls: ['./dashboard.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DashboardComponent { + @ViewChild(DashboardPageComponent, { static: true }) dashboardPage: DashboardPageComponent +} diff --git a/src/app/dashboard/dashboard.module.ts b/src/app/dashboard/dashboard.module.ts new file mode 100644 index 0000000..15ec44e --- /dev/null +++ b/src/app/dashboard/dashboard.module.ts @@ -0,0 +1,76 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' + +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { MatAutocompleteModule } from '@angular/material/autocomplete' +import { MatButtonModule } from '@angular/material/button' +import { MatCardModule } from '@angular/material/card' +import { MatExpansionModule } from '@angular/material/expansion' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatIconModule } from '@angular/material/icon' +import { MatInputModule } from '@angular/material/input' +import { MatListModule } from '@angular/material/list' +import { MatMenuModule } from '@angular/material/menu' +import { MatSidenavModule } from '@angular/material/sidenav' +import { MatTableModule } from '@angular/material/table' +import { MatToolbarModule } from '@angular/material/toolbar' +import { MatTooltipModule } from '@angular/material/tooltip' + +// Use Plotly Via Window Module +// See https://github.com/plotly/angular-plotly.js/blob/master/README.md#plotly-via-window-module +import { PlotlyViaWindowModule } from 'angular-plotly.js' + +//import * as PlotlyJS from 'plotly.js-dist-min' +//import { PlotlyModule } from 'angular-plotly.js' +//PlotlyModule.plotlyjs = PlotlyJS + +import { PipesModule } from '../pipes.module' + +import { DashboardDataService } from '../_services/apollo.service' +import { DashboardComponent } from './dashboard.component' +import { DashboardRoutingModule } from './dashboard-routing.module' +import { DashboardMenuComponent } from './dashboard-menu/dashboard-menu.component' +import { DashboardPageComponent } from './dashboard-page/dashboard-page.component' +import { DashboardPageSectionsComponent } from './dashboard-page/dashboard-page-sections.component' +import { DashboardHomeComponent } from './dashboard-home/dashboard-home.component' + +@NgModule({ + imports: [ + CommonModule, + + FormsModule, + ReactiveFormsModule, + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatSidenavModule, + MatTableModule, + MatToolbarModule, + MatTooltipModule, + + //PlotlyModule, + PlotlyViaWindowModule, + + PipesModule, + + DashboardRoutingModule, + ], + declarations: [ + DashboardComponent, + DashboardMenuComponent, + DashboardPageComponent, + DashboardPageSectionsComponent, + DashboardHomeComponent, + ], + providers: [ + DashboardDataService + ] +}) + +export class DashboardModule {} diff --git a/src/app/info/info-admin/info-admin.component.css b/src/app/info/info-admin/info-admin.component.css new file mode 100644 index 0000000..468d689 --- /dev/null +++ b/src/app/info/info-admin/info-admin.component.css @@ -0,0 +1,7 @@ +:host ::ng-deep mat-card { + height: 12em; +} + +:host ::ng-deep mat-card mat-card-title { + display: none; +} diff --git a/src/app/info/info-admin/info-admin.component.html b/src/app/info/info-admin/info-admin.component.html new file mode 100644 index 0000000..e9e34d1 --- /dev/null +++ b/src/app/info/info-admin/info-admin.component.html @@ -0,0 +1,4 @@ + + diff --git a/src/app/info/info-admin/info-admin.component.ts b/src/app/info/info-admin/info-admin.component.ts new file mode 100644 index 0000000..4968125 --- /dev/null +++ b/src/app/info/info-admin/info-admin.component.ts @@ -0,0 +1,14 @@ +import { Component, ViewChild, Input } from '@angular/core' + +import { AdminDetailComponent } from '../../admin/admin-detail/admin-detail.component' +import { FullInfo } from '../info-data.service' + +@Component({ + selector: 'gisaf-info-admin', + templateUrl: './info-admin.component.html', + styleUrls: ['./info-admin.component.css'], +}) +export class InfoAdminComponent { + @Input() source: FullInfo + @ViewChild(AdminDetailComponent, { static: true }) adminDetail: AdminDetailComponent +} diff --git a/src/app/info/info-attachments/attachments.component.css b/src/app/info/info-attachments/attachments.component.css new file mode 100644 index 0000000..e39e921 --- /dev/null +++ b/src/app/info/info-attachments/attachments.component.css @@ -0,0 +1,7 @@ +.image { + max-height: 100%; + max-width: 100%; + object-fit: contain; + cursor: pointer; + height: 17em; /* Hard coded: not nice */ +} \ No newline at end of file diff --git a/src/app/info/info-attachments/attachments.component.html b/src/app/info/info-attachments/attachments.component.html new file mode 100644 index 0000000..da8ff50 --- /dev/null +++ b/src/app/info/info-attachments/attachments.component.html @@ -0,0 +1,20 @@ +
+
+ {{ file.name }} ({{ file.path }}) + +
+ +
diff --git a/src/app/info/info-attachments/attachments.component.ts b/src/app/info/info-attachments/attachments.component.ts new file mode 100644 index 0000000..01b0adb --- /dev/null +++ b/src/app/info/info-attachments/attachments.component.ts @@ -0,0 +1,30 @@ +import { Component, Input } from '@angular/core' + +import { DataService } from '../../_services/data.service' + +import { Attachment, FullInfo } from '../info-data.service' + +@Component({ + selector: 'gisaf-info-attachments', + templateUrl: './attachments.component.html', + styleUrls: ['./attachments.component.css'], + providers: [ + DataService, + ], +}) +export class AttachmentsComponent { + @Input() source: FullInfo + + constructor( + protected dataService: DataService, + ) { + } + + getLink(image: Attachment): string { + return '/download/attachment/' + this.source.modelInfo.store + '/' + image.name + '/' + this.source.featureInfo.id + } + + download(attachment: object) { + window.open('/download/attachment/' + this.source.modelInfo.store + '/' + attachment['name'] + '/' + this.source.featureInfo.id) + } +} diff --git a/src/app/info/info-data.service.ts b/src/app/info/info-data.service.ts new file mode 100644 index 0000000..3084e92 --- /dev/null +++ b/src/app/info/info-data.service.ts @@ -0,0 +1,821 @@ +import { Injectable } from '@angular/core' +import { UntypedFormGroup, UntypedFormControl } from '@angular/forms' + +import { Observable, BehaviorSubject, forkJoin, of as observableOf, Subject } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +import { MapControlService } from '../map/map-control.service' +import { LayerNode } from '../map/models' +import { Tag, TagAction } from './info-tags/tags.service' + +import { ConfigService } from '../config.service' +import { DataService } from '../_services/data.service' + +const getModelInfoQuery = gql` +query modelInfo ($store: String!) { + modelInfo(store: $store) { + store + modelName + symbol + values { + name + title + unit + chartType + chartColor + } + actions { + name + icon + formFields { + name + type + } + } + formName + formFields { + name + type + } + tagPlugins + tagActions { + domain + key + actions { + plugin + name + link + action + roles + } + } + downloaders { + name + icon + } + legend { + key + value + } + } +} +` + +const getTagKeysQuery = gql` +query tagKeyList { + tagKeyList { + keys + } +} +` + +const createTagMutation = gql` +mutation createTag( + $store: String! + $id: String! + $key: String! + $value: String! +) { + createTag( + store: $store, + id: $id, + key: $key, + value: $value + ) { + tags { + key + value + } + } +} +` + +const createTagsMutations = gql` +mutation createTags( + $keys: [String]! + $values: [String]! + $stores: [String]! + $ids: [[String]]! +) { + createTags( + keys: $keys, + values: $values, + stores: $stores, + ids: $ids, + ) { + tags { + key + value + } + } +} +` + +const getPlotParamsQuery = gql` +query plotParams($store: String!, $id:String!, $value:String!) { + plotParams(store: $store, id: $id, value: $value) { + baseLines { + name + value + color + } + bgShapes { + name + valueTop + valueBottom + color + } + barBase + } +} +` + +const getFeatureInfoQuery = gql` +query featureInfo($store: String!, $id:String!) { + featureInfo(store: $store, id: $id) { + id + itemName + geoInfoItems { + key + value + } + surveyInfoItems { + key + value + } + infoItems { + key + value + } + categorizedInfoItems { + name + infoItems { + key + value + } + } + tags { + key + value + } + graph + files { + name + path + } + images { + name + path + } + externalRecordUrl + } +} +` + +const deleteTagQuery = gql` +mutation deleteTag( + $store: String! + $id: String! + $key: String! +) { + deleteTag( + store: $store, + id: $id, + key: $key, + ) { + tags { + key + value + } + } +} +` + +const getTaggedFeaturesQuery = gql` +query taggedFeatures($stores: [String], $ids: [[String]]) { + taggedFeatures(stores: $stores, ids: $ids) { + store + taggedFeatures { + id + lon + lat + tags { + key + value + } + } + } +} +` + +const getTaggedStoresQuery = gql` +query taggedStores($stores: [String]) { + taggedStores(stores: $stores) { + store + taggedFeatures { + id + lon + lat + tags { + key + value + } + } + } +} +` +const executeFeatureActionMutation=gql` +mutation executeFeatureAction ( + $store: String!, + $id: String!, + $action: String!, + $value: String, +) { + executeFeatureAction( + store: $store, + id: $id, + action: $action, + value: $value, + ) { + result + } +} +` + +export class TaggedFeature { + constructor( + public id: number, + public lon: number, + public lat: number, + public tags: Tag[], + ) {} +} + +export class TaggedLayer { + constructor( + public store: string, + public features: TaggedFeature[] + ) {} +} + +export class ModelAction { + constructor( + public name: string, + public icon: string, + public formFields: FormField[], + ) {} + + /* + execute(fullInfo: FullInfo) { + // XXX: for downloads (reports) only + // TODO: make actions generic (query, mutation, parameters...) + window.open('/download/action/' + this.name + '/' + fullInfo.modelInfo.store + '/' + fullInfo.featureInfo.id) + } + */ +} + +export class FormFieldInput { + constructor( + public name: string, + public value: string, + ) {} +} + +export class FormField { + constructor( + public name: string, + public type: string, + public dflt?: string, + public value?: string + ) {} +} + +export class ModelValue { + constructor( + public name: string, + public title: string, + public unit: string, + public chartType: string = 'line', + public chartColor: string = 'blue', + ) {} +} + +export class Downloader { + constructor( + public name: string, + public icon: string, + ) {} +} + +export class LegendItem { + constructor( + public key: string, + public value: string, + ) {} +} + +export class ModelInfo { + constructor( + public store: string, + public modelName: string, + public symbol: string, + public values: ModelValue[], + public actions: ModelAction[], + public formName: string, + public formFields: FormField[], + public tagPlugins: String[], + public tagActions: TagAction[], + public downloaders: Downloader[], + public legend: LegendItem[], + ) {} + + getFormFields(formGroup: UntypedFormGroup, fullInfo: FullInfo): object[] { + // Return the form fields and build the FormGroup controls accordingly + let formFields = [] + fullInfo.modelInfo.formFields.forEach( + field => { + let control = new UntypedFormControl(field.name) //, field.validator) + formGroup.addControl(field.name, control) + formFields.push(field) + } + ) + return formFields + } +} + +export class PlotBaseLine { + constructor( + public name: string, + public value: number, + public color: string, + ) {} +} + +export class PlotBgShape { + constructor( + public name: string, + public valueTop: number, + public valueBottom: number, + public color: string, + ) {} +} + +export class PlotParams { + constructor( + public baseLines: PlotBaseLine[] = [], + public bgShapes: PlotBgShape[] = [], + public barBase?: number + ) {} +} + +export class PlotDataParams { + constructor( + public data: Object, + public comment: string, + public params: PlotParams, + ) {} +} + +export class InfoItem { + constructor( + public key: string, + public value: string, + ) {} +} + +export class InfoCategory { + constructor( + public name: string, + public infoItems: InfoItem[], + ) {} +} + +export class Attachment { + constructor( + public name: string, + public path: string, + ) {} +} + +export class Feature { + constructor ( + public store: string, + public id: string, + ) {} +} + +export class FeatureWithField { + constructor ( + public store: string, + public field: string, + public value: string, + ) {} +} + +export class FeatureInfo { + constructor( + public id: string, + public itemName: string, + public geoInfoItems: InfoItem[], + public surveyInfoItems: InfoItem[], + public infoItems: InfoItem[], + public categorizedInfoItems: InfoCategory[], + public tags: Tag[], + public graph?: string, + public files?: Attachment[], + public images?: Attachment[], + public externalRecordUrl?: string + ) {} + openExternalRecord() { + window.open(this.externalRecordUrl) + } +} + +export class FullInfo { + constructor( + public modelInfo: ModelInfo, + public featureInfo: FeatureInfo, + ) {} + + hasForm(): Boolean { + return this.modelInfo.formFields.length > 0 + } +} + +@Injectable() +export class InfoDataService { + constructor( + public configService: ConfigService, + private apollo: Apollo, + public mapControlService: MapControlService, + protected dataService: DataService, + ) {} + + public refresh = new Subject() + public refresh$ = this.refresh.asObservable() + + public dataProviderService = new BehaviorSubject(undefined) + public dataProviderService$ = this.dataProviderService.asObservable() + + public taggedFeaturesSelectionService = new BehaviorSubject([]) + public taggedFeaturesSelectionService$ = this.taggedFeaturesSelectionService.asObservable() + + // taggedLayers: holds the tags for each feature, for each selected layer, for search + public taggedLayers = new BehaviorSubject([]) + public taggedLayers$ = this.taggedLayers.asObservable() + + getModelInfo(store: string): Observable { + return this.apollo.query({ + query: getModelInfoQuery, + variables: { + store: store, + } + }).pipe(map( + res => { + let info: Object = res['data']['modelInfo'] + let values = (info['values'] || []).map( + (value: Object) => new ModelValue( + value['name'], + value['title'], + value['unit'], + value['chartType'], + value['chartColor'], + ) + ) + return new ModelInfo( + info['store'], + info['modelName'], + info['symbol'], + values, + info['actions'] ? info['actions'].map( + action => new ModelAction( + action['name'], + action['icon'], + action['formFields'].map( + formField => new FormField( + formField['name'], + formField['type'], + formField['dflt'] + ) + ) + ) + ): [], + info['formName'], + info['formFields'] ? info['formFields'].map( + (formField: Object) => new FormField( + formField['name'], + formField['type'], + ) + ) : [], + info['tagPlugins'], + info['tagActions'] ? info['tagActions'].map( + tagAction => new TagAction( + // FIXME: set real data!!! + '**name**', + '**plugin_name**', + //tagAction['key'], + tagAction.actions[0]['action'], + ['**role**'], + '**link**', + ) + ) : [], + info['downloaders'] ? info['downloaders'].map( + downloader => new Downloader( + downloader['name'], + downloader['icon'], + ) + ) : [], + info['legend'] ? info['legend'].map( + legendItem => new LegendItem( + legendItem['key'], + legendItem['value'], + ) + ) : [], + ) + } + )) + } + + getPlotDataAndParams(store: string, id: string, value: string, resampling: string): Observable { + return forkJoin([ + this.dataService.getValues(store, +id, value, resampling), + this.getPlotParams(store, id, value), + ]).pipe(map( + res => new PlotDataParams( + res[0].body, + res[0].headers['comment'], + res[1], + ) + )) + } + + getPlotParams(store: string, id: string, value: string): Observable { + return this.apollo.query({ + query: getPlotParamsQuery, + variables: { + store: store, + id: id, + value: value + } + }).pipe(map( + info => info.data['plotParams'] ? new PlotParams( + (info.data['plotParams']['baseLines'] || []).map( + bl => new PlotBaseLine( + bl['name'], + bl['value'], + bl['color'] + ) + ), + (info.data['plotParams']['bgShapes'] || []).map( + bl => new PlotBgShape( + bl['name'], + bl['valueTop'], + bl['valueBottom'], + bl['color'] + ) + ), + info.data['plotParams']['barBase'] + ) : new PlotParams() + )) + } + + getFeatureInfo(store: string, id: string): Observable { + return this.apollo.query({ + query: getFeatureInfoQuery, + variables: { + store: store, + id: id + } + }).pipe(map( + res => { + const info = res['data']['featureInfo'] + const geoInfoItems = info['geoInfoItems'].map(ii => new InfoItem(ii['key'], ii['value'])) + const surveyInfoItems = info['surveyInfoItems'].map(ii => new InfoItem(ii['key'], ii['value'])) + const infoItems = info['infoItems'].map(ii => new InfoItem(ii['key'], ii['value'])) + const categorizedInfoItems = info['categorizedInfoItems'] && info['categorizedInfoItems'].map( + ic => new InfoCategory( + ic['name'], + ic['infoItems'].map(ii => new InfoItem(ii['key'], ii['value'])) + ) + ) + const tags = info['tags'].map(ii => new Tag(ii['key'], ii['value'])) + + return new FeatureInfo( + info['id'], + info['itemName'], + geoInfoItems, + surveyInfoItems, + infoItems, + categorizedInfoItems, + tags, + info['graph'] && info['graph'].replace(/width="\d+pt"/, '').replace(/height="\d+pt"/, ''), + info['files'] && info['files'].map(att => new Attachment(att['name'], att['path'])), + info['images'] && info['images'].map(att => new Attachment(att['name'], att['path'])), + info['externalRecordUrl'] + ) + } + )) + } + + getFullInfo(feature: Feature): Observable { + return forkJoin([ + this.getModelInfo(feature.store), + this.getFeatureInfo(feature.store, feature.id) + ]).pipe(map( + res => new FullInfo(res[0], res[1]) + )) + } + + public createTag(fullInfo: FullInfo, tag: any): Observable { + let variables = { + 'store': fullInfo.modelInfo.store, + 'id': fullInfo.featureInfo.id, + 'key': tag['key'], + 'value': tag['value'], + } + return this.apollo.mutate({ + mutation: createTagMutation, + variables: variables, + }).pipe(map( + res => res['data']['createTag']['tags'].map( + (tag: Object) => new Tag(tag['key'], tag['value'])) + )) + } + + public createTags(keys: String[], values: String[], source: Object): Observable { + let variables = { + 'keys': keys, + 'values': values, + 'stores': Object.keys(source), + 'ids': Object.values(source).map(ids => Array.from(ids)), + } + return this.apollo.mutate({ + mutation: createTagsMutations, + variables: variables, + }).pipe(map( + res => { + let tags = res['data']['createTags']['tags'] + return tags.map( + (tag: Object) => new Tag(tag['key'], tag['value'])) + } + )) + } + + public deleteTag(tag: Tag | any, fullInfo?: FullInfo): Observable { + // tag can be FeatureTree, but circular dependencies: + // import { FeatureTree } from './info-selection/info-selection-tags.component' + let variables: Object + if (tag instanceof Tag) { + variables = { + 'store': fullInfo.modelInfo.store, + 'id': fullInfo.featureInfo.id, + 'key': tag.key, + } + } + else { + // FeatureTree + variables = { + 'store': tag.getStore(), + 'id': tag.id, + 'key': tag.getKey(), + } + } + return this.apollo.mutate({ + mutation: deleteTagQuery, + variables: variables, + }) + } + + public getTagKeys(): Observable { + return observableOf(this.configService.conf.value.map['tagKeys']) + // This could be fetched from the server + /* + return this.apollo.query({ + query: getTagKeysQuery + }).pipe(map( + res => { + return res['data']['tagKeyList']['keys'] + } + )) + */ + } + + private _getTaggedLayers(taggedItems: Object[]): TaggedLayer[] { + /* + Convert tagged features to tagged layers, + putting the tag records in the graphql data structure + */ + return taggedItems.map( + layer => new TaggedLayer( + layer['store'], + layer['taggedFeatures'].map( + feature => new TaggedFeature( + feature['id'], + feature['lon'], + feature['lat'], + feature['tags'].map( + tag => new Tag(tag['key'], tag['value']) + ) + ) + ) + ) + ) + } + + public getTaggedFeatures(features: Object): Observable { + let stores = Object.keys(features) + if (stores.length == 0) { + this.taggedFeaturesSelectionService.next([]) + return observableOf([]) + } + let ids = Object.values(features).map(t => Array.from(t)) + return this.apollo.query({ + query: getTaggedFeaturesQuery, + variables: { + stores: stores, + ids: ids + } + }).pipe(map( + res => { + let taggedLayers = this._getTaggedLayers(res['data']['taggedFeatures']) + // Add features with no tag + Object.entries(features).forEach( + ([store, _features]) => { + let taggedFeatures = taggedLayers.find(s => s.store==store) + if (!taggedFeatures) { + taggedFeatures = new TaggedLayer(store, []) + taggedLayers.push(taggedFeatures) + } + let taggedFeaturesIds = taggedFeatures.features.map(tf => +tf.id) + let featureIdsNoTag = Array(..._features).filter(x => !taggedFeaturesIds.includes(x)) + featureIdsNoTag.forEach( + id => { + taggedFeatures.features.push(new TaggedFeature(id, undefined, undefined, [])) + } + ) + } + ) + this.taggedFeaturesSelectionService.next(taggedLayers) + return taggedLayers + } + )) + } + + public getTaggedStores(stores: string[]): Observable { + return this.apollo.query({ + query: getTaggedStoresQuery, + variables: { + stores: stores, + } + }).pipe(map( + res => this._getTaggedLayers(res['data']['taggedStores']) + )) + } + + public getTagsActionsStores(stores: string[]): Observable { + return this.apollo.query({ + query: getTaggedStoresQuery, + variables: { + stores: stores, + } + }).pipe(map( + res => this._getTaggedLayers(res['data']['taggedStores']) + )) + } + + // Load tags for selected layers + public getTaggedLayers(selectedLayers: LayerNode[], forceReload: boolean=true): Observable { + let selectedLayersStores = selectedLayers.map( + (l: LayerNode) => l.store + ) + // FIXME: this.taggedLayers should be really an array + let untaggedLayers = forceReload ? selectedLayersStores : selectedLayersStores.filter( + (x: string) => !Object.keys(this.taggedLayers).includes(x) + ) + if (untaggedLayers.length > 0) { + return this.getTaggedStores(untaggedLayers).pipe(map( + taggedLayers => { + // Update the known taggedLayers + for (let taggedLayer of taggedLayers) { + // FIXME: this.taggedLayers should be really an array + this.taggedLayers[taggedLayer.store] = taggedLayer + } + // Make sure that even layers without features with tags are remembered + for (let taggedLayer of untaggedLayers) { + if (!this.taggedLayers.hasOwnProperty(taggedLayer)) { + this.taggedLayers[taggedLayer] = new TaggedLayer(taggedLayer, []) + } + } + // Save to mapControlService behavior subject + this.taggedLayers.next(taggedLayers) + return taggedLayers + } + )) + } + else { + return this.taggedLayers + } + } +} diff --git a/src/app/info/info-graph/graph.component.html b/src/app/info/info-graph/graph.component.html new file mode 100644 index 0000000..405691d --- /dev/null +++ b/src/app/info/info-graph/graph.component.html @@ -0,0 +1 @@ +
diff --git a/src/app/info/info-graph/graph.component.scss b/src/app/info/info-graph/graph.component.scss new file mode 100644 index 0000000..8f2a2f3 --- /dev/null +++ b/src/app/info/info-graph/graph.component.scss @@ -0,0 +1,8 @@ +.graph-body { + text-align: center; +} + +.graph-body>svg { + width: 100% !important; + height: 100% !important; +} \ No newline at end of file diff --git a/src/app/info/info-graph/graph.component.ts b/src/app/info/info-graph/graph.component.ts new file mode 100644 index 0000000..dc04ee2 --- /dev/null +++ b/src/app/info/info-graph/graph.component.ts @@ -0,0 +1,12 @@ +import { Component, Input } from '@angular/core' + +import { FullInfo } from '../info-data.service' + +@Component({ + selector: 'gisaf-info-graph', + templateUrl: './graph.component.html', + styleUrls: ['./graph.component.scss'], +}) +export class GraphComponent { + @Input() source: FullInfo +} diff --git a/src/app/info/info-home/info-home.component.css b/src/app/info/info-home/info-home.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/info/info-home/info-home.component.html b/src/app/info/info-home/info-home.component.html new file mode 100644 index 0000000..24cc638 --- /dev/null +++ b/src/app/info/info-home/info-home.component.html @@ -0,0 +1 @@ +Select an object on the map to view details diff --git a/src/app/info/info-home/info-home.component.ts b/src/app/info/info-home/info-home.component.ts new file mode 100644 index 0000000..27de6aa --- /dev/null +++ b/src/app/info/info-home/info-home.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core' + + +@Component({ + selector: 'gisaf-info-home', + templateUrl: './info-home.component.html', + styleUrls: ['./info-home.component.css'] +}) +export class InfoHomeComponent {} diff --git a/src/app/info/info-misc/info-misc.component.css b/src/app/info/info-misc/info-misc.component.css new file mode 100644 index 0000000..b5e00de --- /dev/null +++ b/src/app/info/info-misc/info-misc.component.css @@ -0,0 +1,27 @@ +:host::ng-deep .mat-mdc-tab-label { + padding: 0 0.5em; +} + +:host::ng-deep .mat-mdc-tab-group .mat-mdc-tab-labels { + display: flex; + flex-direction: row!important; + width: auto!important; +} + +:host .mat-mdc-tab-group { + display: flex; + flex-direction: column; +} + +:host .mat-mdc-tab-group[mat-tab-header-pagination-disabled] .mat-mdc-tab-header-pagination { + display: block!important; +} + +:host::ng-deep .in-map .mat-mdc-tab-body-wrapper { + height: 14em; +} + +.link { + cursor: pointer; + text-decoration: underline; +} \ No newline at end of file diff --git a/src/app/info/info-misc/info-misc.component.html b/src/app/info/info-misc/info-misc.component.html new file mode 100644 index 0000000..125dac9 --- /dev/null +++ b/src/app/info/info-misc/info-misc.component.html @@ -0,0 +1,80 @@ + + + + toc + + + + + + + + + + + + + {{ source.featureInfo.externalRecordUrl }} + +
id{{ source.featureInfo.id }}
{{ infoItem.key }}{{ infoItem.value }}
External link
+
+ + + explore + + + + + + +
{{ infoItem.key }}{{ infoItem.value }}
+
+ + + location_searching + + + + + + +
{{ infoItem.key }}{{ infoItem.value }}
+
+ + + dns + + + + + + +
{{ legendItem.key }}{{ legendItem.value }}
+
+ + + + attach_file + + + + + + + + + + +
{{ categorizedInfoItem.key }}{{ categorizedInfoItem.value }}
+
+
\ No newline at end of file diff --git a/src/app/info/info-misc/info-misc.component.ts b/src/app/info/info-misc/info-misc.component.ts new file mode 100644 index 0000000..c29cbef --- /dev/null +++ b/src/app/info/info-misc/info-misc.component.ts @@ -0,0 +1,40 @@ +import { Component, Input, OnInit, + ChangeDetectorRef, ChangeDetectionStrategy } from '@angular/core' + +import { DataService } from '../../_services/data.service' +import { FullInfo, InfoDataService } from '../info-data.service' + +@Component({ + selector: 'gisaf-info-misc', + templateUrl: './info-misc.component.html', + styleUrls: ['./info-misc.component.css'], + providers: [ + DataService, + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InfoMiscComponent implements OnInit { + @Input() inMap: boolean = false + @Input() source: FullInfo + @Input() class: string + + constructor( + protected dataService: DataService, + protected infoDataService: InfoDataService, + private cdr: ChangeDetectorRef, + ) { + } + + ngOnInit() { + this.infoDataService.dataProviderService$.subscribe( + (fullInfo: FullInfo) => { + this.source = fullInfo + this.cdr.markForCheck() + } + ) + } + + hasSurveyInfo(): boolean { + return Object.keys(this.source.featureInfo.surveyInfoItems).length == 0 + } +} diff --git a/src/app/info/info-plot/plot.component.css b/src/app/info/info-plot/plot.component.css new file mode 100644 index 0000000..f5fa597 --- /dev/null +++ b/src/app/info/info-plot/plot.component.css @@ -0,0 +1,15 @@ +.chart-container { + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; + max-width: 100%; + max-height: 100%; +} + +.chart-container .noData { + font-weight: 500; + font-size: 150%; + text-align: center; + padding: 1em; +} \ No newline at end of file diff --git a/src/app/info/info-plot/plot.component.html b/src/app/info/info-plot/plot.component.html new file mode 100644 index 0000000..b230c68 --- /dev/null +++ b/src/app/info/info-plot/plot.component.html @@ -0,0 +1,48 @@ +
+
+ + +
+ +
+ Value: + + + {{ val.title || val.name }} + + + + + + Resample: + + + No resampling + Hourly + Daily + Weekly + Monthly + Yearly + + + + + + Extended range + + + {{ comment }} +
+
+ + +
No data to plot
+
\ No newline at end of file diff --git a/src/app/info/info-plot/plot.component.ts b/src/app/info/info-plot/plot.component.ts new file mode 100644 index 0000000..f4dfc65 --- /dev/null +++ b/src/app/info/info-plot/plot.component.ts @@ -0,0 +1,317 @@ +import { Component, OnInit, ViewChild, Input, AfterViewInit, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { Observable, of } from 'rxjs' +import { map, catchError } from 'rxjs/operators' + +import { MatSelectChange } from '@angular/material/select' +import { MatSnackBar } from '@angular/material/snack-bar' + +import { PlotlyComponent, PlotlyService } from 'angular-plotly.js' + +import { DataService } from '../../_services/data.service' +import { FullInfo, InfoDataService, PlotDataParams, PlotParams } from '../info-data.service' +import { MatSlideToggle } from '@angular/material/slide-toggle' + +@Component({ + selector: 'gisaf-info-plot', + templateUrl: './plot.component.html', + styleUrls: ['./plot.component.css'], + providers: [ + DataService, + PlotlyService, + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InfoPlotComponent implements OnInit, AfterViewInit { + routerItems: Object[] = [] + icon: string = '' + hasPlot: boolean = false + revision: number = 0 + + rangeFrom: Date + rangeTo: Date + + resampling: string = '0' + value: string = '' + comment: string = '' + + fontColor: string = 'white' + + useResizeHandler = true + + minY: number + minEY: number + maxY: number + maxEY: number + borderY: number + + plotStyle = { + position: 'relative', + height: '100%', + width: '100%', + } + + chartColor: string = 'blue' + + @Input() marginRatio: number = 0.1 + @ViewChild(MatSlideToggle) extendedRange: MatSlideToggle + xRange = ['1968-02-28', '2099-12-31'] + + @Input() source: FullInfo + + @Input() hasTools: boolean = true + @Input() hasControls: boolean = true + + @ViewChild(PlotlyComponent, { static: true }) plot: PlotlyComponent + + @Input() plotXAxisType = 'date' + @Input() plotTitle: string = '' + @Input() plotLayout: object = { + margin: { + l: 50, + r: 10, + b: 30, + t: 10, + pad: 5 + }, + dragmode: 'pan', + autosize: true, + shapes: [], + //showlegend: true, + } + + plotlyConfig = { + displaylogo: false, + scrollZoom: true, + showLink: false, + modeBarButtonsToRemove: ['sendDataToCloud', 'select2d', 'lasso2d'], + responsive: true, + + //plot_bgcolor: "rgba(0, 0, 0, 0)", + //paper_bgcolor: "rgba(0,0,0,0)", + toImageButtonOptions: { + format: 'svg', // one of png, svg, jpeg, webp + //filename: 'custom_image', + height: null, + width: null, + //scale: 1 // Multiply title/legend/axis/canvas sizes by this factor + } + } + plotData: object[] = [] + + constructor( + protected dataService: DataService, + protected infoDataService: InfoDataService, + public plotly: PlotlyService, + public snackBar: MatSnackBar, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + let now = new Date() + let lastYear = new Date() + lastYear.setFullYear(now.getFullYear() - 1) + this.rangeTo = now + this.rangeFrom = lastYear + + this.plotLayout['xaxis'] = { + type: this.plotXAxisType, + range: [this.rangeFrom, this.rangeTo], + } + this.plotLayout['yaxis'] = { + fixedrange: true, + range: [-10, 10], + } + this.plotLayout['title'] = this.plotTitle + } + + ngAfterViewInit() { + this.infoDataService.dataProviderService$.subscribe( + (fullInfo: FullInfo) => { + this.source = fullInfo + if (this.source.modelInfo.values.length > 0) { + // Eventually set the default value to plot as the first one + if (!this.source.modelInfo.values.map(v=>v.name).includes(this.value)) { + this.value = this.source.modelInfo.values[0].name + } + this.refreshGraph() + } + else { + this.createPlot([]) + } + } + ) + } + + getValues(): Observable { + return this.infoDataService.getPlotDataAndParams( + this.source.modelInfo.store, + this.source.featureInfo.id, + this.value, + this.resampling, + //this.rangeFrom.toISOString(), + //this.rangeTo.toISOString() + ).pipe( + map( + (resp: PlotDataParams) => { + this.comment = resp.comment + this.createPlot(resp.data, resp.params) + } + ), + catchError( + err => { + // Switch to resampling if the server replies so + let message = err.statusText + let resampling = err['headers'].get('resampling') + if (resampling) { + this.resampling = resampling + this.refreshGraph() + } + this.snackBar.open(message, 'Close', {duration: 4000}) + return of([]) + } + ) + ) + } + + createPlot(data: any, plotParams?: PlotParams) { + // Kept compatibility with previous API + const values = data.map(d => d[this.value]) + this.plotData = [] + if (values.length > 0) { + const valueInfo = this.source.modelInfo.values.find(v => v.name == this.value) + + // Add data + + const plotData = { + x: data.map(d => d['time']), + y: values, + type: valueInfo.chartType || 'line', + name: this.value, + marker: { + color: valueInfo.chartColor || this.chartColor, + opacity: 1, + line: { + width: 0, + } + }, + } + if (plotParams.barBase) { + plotData['base'] = plotParams.barBase + // Adjust the height of the bars + plotData['y'] = plotData['y'].map(v => v - plotParams.barBase) + } + this.plotData.push(plotData) + + // Add plot "decorations" found in plotParams + //const xRange = [data[0].time, data[data.length-1].time] + plotParams.baseLines.forEach( + bl => { + this.plotData.push({ + x: this.xRange, + y: [bl.value, bl.value], + mode: 'lines', + name: bl.name, + opacity: 0.5, + line: { + color: bl.color, + //width: 3 + } + }) + } + ) + this.plotLayout['shapes'] = plotParams.bgShapes.map( + shape => { + return { + type: 'rect', + xref: 'x', + yref: 'y', + x0: this.xRange[0], + y0: shape.valueTop, + x1: this.xRange[1], + y1: shape.valueBottom, + fillcolor: shape.color, + opacity: 1, + layer: 'below', + line: { + width: 0 + } + } + } + ) + // Fake plot, just to add legend entries + plotParams.bgShapes.forEach( + bl => { + this.plotData.push({ + x: [0], + y: [0], + name: bl.name, + type: 'bar', + marker: { + color: bl.color, + opacity: 1, + line: { + width: 0, + } + }, + }) + } + ) + //this.plotLayout['shapes'] = [] + + // Give some space around min and max values + this.minY = Math.min.apply(Math, values) + this.minEY = Math.min( + Math.min.apply(Math, plotParams.baseLines.map(bl => bl.value)), + this.minY + ) + this.maxY = Math.max.apply(Math, values) + this.maxEY = Math.max( + Math.max.apply(Math, plotParams.baseLines.map(bl => bl.value)), + this.maxY + ) + this.borderY = (this.maxY - this.minY) * this.marginRatio + this.adjustYRange() + if (!this.plotLayout['yaxis']['title']) { + this.plotLayout['yaxis']['title'] = {} + } + + this.plotLayout['yaxis']['title']['text'] = valueInfo ? valueInfo.unit : '' + } + + // FIXME: set yaxis plot layout parameters: + // bug in angular-plotly, relayout gives too much of a problem? + this.cdr.markForCheck() + } + + adjustYRange() { + if (this.extendedRange.checked) { + this.plotLayout['yaxis']['range'] = [this.minEY - this.borderY, this.maxEY + this.borderY] + } + else { + this.plotLayout['yaxis']['range'] = [this.minY - this.borderY, this.maxY + this.borderY] + } + this.revision += 1 + this.cdr.markForCheck() + } + + refreshGraph(evt?: MatSelectChange) { + this.getValues().subscribe({ + next: data => { + this.revision += 1 + this.cdr.markForCheck() + }, + error: err => { + this.snackBar.open(err.statusText, 'Close', {duration: 4000}) + } + }) + } + + download() { + window.open('/download/csv/' + this.source.modelInfo.store + + '/' + this.source.featureInfo.id + + '/' + this.value + + '/' + this.resampling) + } +} diff --git a/src/app/info/info-plot/plot.module.ts b/src/app/info/info-plot/plot.module.ts new file mode 100644 index 0000000..0022907 --- /dev/null +++ b/src/app/info/info-plot/plot.module.ts @@ -0,0 +1,44 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' + +import { MatButtonModule } from '@angular/material/button' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatIconModule } from '@angular/material/icon' +import { MatSelectModule } from '@angular/material/select' +import { MatSlideToggleModule } from '@angular/material/slide-toggle' + +import { FlexLayoutModule } from 'ngx-flexible-layout' + +// Use Plotly Via Window Module +// See https://github.com/plotly/angular-plotly.js/blob/master/README.md#plotly-via-window-module +import { PlotlyViaWindowModule } from 'angular-plotly.js' + +//import * as PlotlyJS from 'plotly.js-dist-min' +//import { PlotlyModule } from 'angular-plotly.js' +//PlotlyModule.plotlyjs = PlotlyJS + +import { InfoPlotComponent } from './plot.component' + + +@NgModule({ + imports: [ + CommonModule, + MatButtonModule, + MatFormFieldModule, + MatIconModule, + MatSelectModule, + MatSlideToggleModule, + + FlexLayoutModule, + + //PlotlyModule, + PlotlyViaWindowModule, + ], + declarations: [ + InfoPlotComponent, + ], + exports: [ + InfoPlotComponent, + ] +}) +export class InfoPlotModule { } diff --git a/src/app/info/info-resolver.service.ts b/src/app/info/info-resolver.service.ts new file mode 100644 index 0000000..e4b2cce --- /dev/null +++ b/src/app/info/info-resolver.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core' +import { Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable, of, EMPTY, forkJoin } from 'rxjs' +import { map, mergeMap, take, first } from 'rxjs/operators' + +import { InfoDataService, FullInfo } from './info-data.service' + +@Injectable() +export class InfoResolver implements Resolve { + constructor( + private infoDataService: InfoDataService, + private router: Router + ) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return forkJoin([ + this.infoDataService.getModelInfo( + route.paramMap.get('type'), + ), + this.infoDataService.getFeatureInfo( + route.paramMap.get('type'), + route.paramMap.get('id'), + ) + ]).pipe(map( + res => new FullInfo(res[0], res[1]) + )) + } +} diff --git a/src/app/info/info-routing.module.ts b/src/app/info/info-routing.module.ts new file mode 100644 index 0000000..e62077d --- /dev/null +++ b/src/app/info/info-routing.module.ts @@ -0,0 +1,29 @@ +import { NgModule } from '@angular/core' +import { Routes, RouterModule } from '@angular/router' + +import { InfoComponent } from './info.component' +import { InfoHomeComponent } from './info-home/info-home.component' +import { InfoResolver } from './info-resolver.service' + +const routes: Routes = [ + { + path: '', + component: InfoComponent, + outlet: 'info', + }, + { + path: ':type/:id', + component: InfoComponent, + outlet: 'info', + resolve: { + item: InfoResolver + } + } +] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [InfoResolver] +}) +export class InfoRoutingModule { } diff --git a/src/app/info/info-selection/info-selection-tags.component.css b/src/app/info/info-selection/info-selection-tags.component.css new file mode 100644 index 0000000..31cc4af --- /dev/null +++ b/src/app/info/info-selection/info-selection-tags.component.css @@ -0,0 +1,26 @@ +.tag-tree { + overflow-x: hidden; + overflow-y: auto; +} + +.tag-tree-invisible { + display: none; +} + +.tag-tree ul, +.tag-tree li { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +.mat-tree-node { + padding: 0; + min-height: 0; +} + +.mat-mdc-icon-button { + height: inherit; + width: inherit; + line-height: inherit; +} diff --git a/src/app/info/info-selection/info-selection-tags.component.html b/src/app/info/info-selection/info-selection-tags.component.html new file mode 100644 index 0000000..321abcf --- /dev/null +++ b/src/app/info/info-selection/info-selection-tags.component.html @@ -0,0 +1,30 @@ + + +
  • + + + {{ node.getLabel() }} + + +
  • +
    + +
  • +
    + + {{ node.getLabel() }} +
    +
      + +
    +
  • +
    +
    \ No newline at end of file diff --git a/src/app/info/info-selection/info-selection-tags.component.ts b/src/app/info/info-selection/info-selection-tags.component.ts new file mode 100644 index 0000000..cf85c4d --- /dev/null +++ b/src/app/info/info-selection/info-selection-tags.component.ts @@ -0,0 +1,241 @@ +import { Component, Input, ViewChild } from '@angular/core'; + +import { NestedTreeControl } from '@angular/cdk/tree' +import { MatTreeNestedDataSource } from '@angular/material/tree' + +import { Tag } from '../info-tags/tags.service' +import { TagFormComponent } from '../info-tags/tag-form.component' +import { MapControlService } from '../../map/map-control.service' +import { InfoDataService, TaggedLayer, TaggedFeature, Feature } from '../info-data.service' + +export class Node { + expanded: Boolean = true + hasDelete: Boolean = false + hasInfo: Boolean = false + getChildren() { + return [] + } +} + +export class FeatureTree extends Node { + constructor( + public id: Number, + public storeTree: StoreTree, + ) { + super() + this.hasDelete = true + this.hasInfo = true + } + label = "Feature" + getLabel(): string { + return this.id.toString() + } + getStore(): string { + return this.storeTree.store + } + getValue(): string { + return this.storeTree.tagValueTree.value + } + getKey(): string { + return this.storeTree.tagValueTree.tagKeyTree.key + } +} + +export class StoreTree extends Node { + constructor( + public store: string, + public tagValueTree: TagValueTree, + public features: FeatureTree[] = [] + ) { + super() + this.expanded = false + } + label = 'Store (layer)' + getLabel(): string { + return this.store + ' (' + this.features.length + ')' + } + addNewFeature(id: Number): void { + this.features.push(new FeatureTree(id, this)) + } + getChildren() { + return this.features + } +} + +export class TagValueTree extends Node { + constructor( + public value: string, + public tagKeyTree: TagKeyTree, + public stores: StoreTree[] = [] + ) { + super() + } + label = 'Tag value' + addNewStore(store: string): StoreTree { + if (!this.stores.map(storeTree => storeTree.store).includes(store)) { + let storeTree = new StoreTree(store, this) + this.stores.push(storeTree) + return storeTree + } + else { + return this.stores.find(storeTree => storeTree.store == store) + } + } + getChildren() { + return this.stores + } + getLabel(): string { + return this.value + } +} + +export class TagKeyTree extends Node { + constructor( + public key: string, + public tagTree: TagTree, + public values: TagValueTree[] = [] + ) { + super() + } + label = 'Tag key' + addNewValue(value: string): TagValueTree { + if (!this.values.map(tagKeyValue => tagKeyValue.value).includes(value)) { + let tagKeyValue = new TagValueTree(value, this) + this.values.push(tagKeyValue) + return tagKeyValue + } + else { + return this.values.find(tagKeyValues => tagKeyValues.value == value) + } + } + getChildren() { + return this.values + } + getLabel(): string { + return this.key + } +} + +export class TagTree extends Node { + constructor( + public keys: TagKeyTree[] = [], + ) { + super() + } + addNewKey(key: string): TagKeyTree { + if (!this.keys.map(tagKeyTree => tagKeyTree.key).includes(key)) { + let tagKeyTree = new TagKeyTree(key, this) + this.keys.push(tagKeyTree) + return tagKeyTree + } + else { + return this.keys.find(tagKeyTree => tagKeyTree.key == key) + } + } + getChildren() { + return this.keys + } +} + + +@Component({ + selector: 'gisaf-info-selection-tags', + templateUrl: './info-selection-tags.component.html', + styleUrls: ['./info-selection-tags.component.css'] +}) +export class InfoSelectionTagsComponent { + /* Component showing information for the selection */ + @ViewChild(TagFormComponent, {static: true}) form: TagFormComponent + @Input() selection: TaggedLayer[] + treeControl: NestedTreeControl + nestedDataSource: MatTreeNestedDataSource + + constructor( + private infoDataService: InfoDataService, + private mapControlService: MapControlService, + ) { + this.treeControl = new NestedTreeControl(this.getChildren) + this.treeControl.isExpandable = (node => { + if (node.expanded) {this.treeControl.expand(node)} + return false + }) + this.nestedDataSource = new MatTreeNestedDataSource() + } + + ngOnInit() { + this.mapControlService.selection$.subscribe( + selection => { + this.infoDataService.getTaggedFeatures(selection).subscribe() + } + ) + + this.infoDataService.taggedFeaturesSelectionService$.subscribe( + (taggedLayers: TaggedLayer[]) => { + let tagTree: TagTree = this._convertSelectionToTagTree(taggedLayers) + this.nestedDataSource.data = tagTree.keys + } + ) + } + + getChildren(node: Node) { + return node.getChildren() + } + + hasChild = (_: number, node: Node) => node.getChildren().length > 0 + + private _convertSelectionToTagTree(taggedLayers: TaggedLayer[]): TagTree { + let tagTree = new TagTree() + let tagKeyTree: TagKeyTree + let tagValueTree: TagValueTree + let storeTree: StoreTree + taggedLayers.forEach( + taggedLayer => { + taggedLayer.features.forEach( + (feature: TaggedFeature) => { + if (feature.tags.length == 0) { + tagKeyTree = tagTree.addNewKey('[No tag]') + tagValueTree = tagKeyTree.addNewValue('-') + storeTree = tagValueTree.addNewStore(taggedLayer.store) + storeTree.addNewFeature(feature.id) + } + else { + feature.tags.forEach( + (tag: Tag) => { + tagKeyTree = tagTree.addNewKey(tag.key) + tagValueTree = tagKeyTree.addNewValue(tag.value) + storeTree = tagValueTree.addNewStore(taggedLayer.store) + storeTree.addNewFeature(feature.id) + } + ) + } + } + ) + } + ) + return tagTree + } + + delete(node: FeatureTree) { + this.infoDataService.deleteTag(node).subscribe( + _ => { + let features = node.storeTree.features + features.splice(features.indexOf(node), 1) + this._refreshTree() + } + ) + } + + showInfo(node: FeatureTree) { + this.mapControlService.featureClicked.next( + new Feature(node.storeTree.store, node.id.toString()) + ) + } + + private _refreshTree() { + // Angular bug, see https://github.com/angular/components/issues/11381 + let _data = this.nestedDataSource.data + this.nestedDataSource.data = null + this.nestedDataSource.data = _data + this.mapControlService.search.next(/* refresh */true) + } +} \ No newline at end of file diff --git a/src/app/info/info-selection/info-selection.component.css b/src/app/info/info-selection/info-selection.component.css new file mode 100644 index 0000000..5f5582b --- /dev/null +++ b/src/app/info/info-selection/info-selection.component.css @@ -0,0 +1,26 @@ +.row { + display: flex; + justify-content: space-between; +} + +.column { + flex-basis: content; +} + +.itemList { + height: 11em; + overflow: auto; +} + +.form { + display: flex; + flex-direction: column; +} + +gisaf-tag-form { + padding-left: 1em; +} + +gisaf-info-selection-tags { + height: 100%; +} \ No newline at end of file diff --git a/src/app/info/info-selection/info-selection.component.html b/src/app/info/info-selection/info-selection.component.html new file mode 100644 index 0000000..f5b1ce2 --- /dev/null +++ b/src/app/info/info-selection/info-selection.component.html @@ -0,0 +1,4 @@ +
    + + +
    \ No newline at end of file diff --git a/src/app/info/info-selection/info-selection.component.spec.ts b/src/app/info/info-selection/info-selection.component.spec.ts new file mode 100644 index 0000000..318c4a4 --- /dev/null +++ b/src/app/info/info-selection/info-selection.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { InfoSelectionComponent } from './info-selection.component'; + +describe('InfoSelectionComponent', () => { + let component: InfoSelectionComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ InfoSelectionComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InfoSelectionComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/info/info-selection/info-selection.component.ts b/src/app/info/info-selection/info-selection.component.ts new file mode 100644 index 0000000..4e058d4 --- /dev/null +++ b/src/app/info/info-selection/info-selection.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'gisaf-info-selection', + templateUrl: './info-selection.component.html', + styleUrls: ['./info-selection.component.css'] +}) +export class InfoSelectionComponent { +} diff --git a/src/app/info/info-tags/tag-action.component.css b/src/app/info/info-tags/tag-action.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/info/info-tags/tag-action.component.html b/src/app/info/info-tags/tag-action.component.html new file mode 100644 index 0000000..2c44f83 --- /dev/null +++ b/src/app/info/info-tags/tag-action.component.html @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/src/app/info/info-tags/tag-action.component.ts b/src/app/info/info-tags/tag-action.component.ts new file mode 100644 index 0000000..9df7138 --- /dev/null +++ b/src/app/info/info-tags/tag-action.component.ts @@ -0,0 +1,78 @@ +import { Component, Input, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { Tag } from './tags.service' +import { FullInfo, InfoDataService, FormField } from '../info-data.service' +import { Action, ActionsService } from '../../_services/actions.service' + +import { MatSnackBar } from '@angular/material/snack-bar' +import { AuthenticationService } from '../../_services/authentication.service' +import { MapControlService } from '../../map/map-control.service' + +@Component({ + selector: 'gisaf-tag-action', + templateUrl: './tag-action.component.html', + styleUrls: ['./tag-action.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TagActionComponent { + @Input() source: FullInfo + @Input() action: Action + constructor( + private actionsService: ActionsService, + private infoDataService: InfoDataService, + private snackBar: MatSnackBar, + private authenticationService: AuthenticationService, + protected mapControlService: MapControlService, + private cdr: ChangeDetectorRef, + ) {} + + get isAuthorized() { + // At least one role of the user must match the roles of the action + return this.authenticationService.roles.filter(r => this.action.roles.indexOf(r.name) != -1).length > 0 + } + + execute() { + this.actionsService.execute( + [this.source.modelInfo.store], + [[this.source.featureInfo.id.toString()]], + [this.action.name], + this.action.params, + ).subscribe( + results => { + // Update the tags in the info source + let result = results[0].actionResults[0] + if (result.message) { + this.snackBar.open(result.message, 'Close', {duration: 3000}) + } + if (!result.actionResults || result.actionResults.length == 0) { + return + } + let layer = result.actionResults[0].taggedLayers.find( + tl => tl.store == this.source.modelInfo.store + ) + let feature = layer.features.find(f=>f.id == this.source.featureInfo.id) + if (feature) { + feature.tags.forEach( + tag => { + let existingTag = this.source.featureInfo.tags.find(t => t.key == tag.key) + if (existingTag) { + console.log("Tag update: test me!") + existingTag.value = tag.value + this.infoDataService.dataProviderService.next(this.source) + } + else { + this.source.featureInfo.tags.push(new Tag(tag.key, tag.value)) + } + } + ) + this.infoDataService.dataProviderService.next(this.source) + } + // Trick to refresh the tags on the map + if (this.mapControlService.hasTags.value) { + this.mapControlService.hasTags.next(true) + } + } + ) + } +} \ No newline at end of file diff --git a/src/app/info/info-tags/tag-form.component.css b/src/app/info/info-tags/tag-form.component.css new file mode 100644 index 0000000..81b81f3 --- /dev/null +++ b/src/app/info/info-tags/tag-form.component.css @@ -0,0 +1,27 @@ +.key { + width: 8em; + padding-right: 1em; +} + +.plugin .key { + display: inline-block; +} + +.value { + width: 12em; + padding-right: 1em; +} + +.mat-mdc-button, .mat-mdc-raised-button, button { + min-width: inherit ! important; + line-height: 2em; +} + +.submitButton { + height: 2em; + margin-top: 1em; +} + +.pluginsTagsForm>div { + height: 2.5em; +} \ No newline at end of file diff --git a/src/app/info/info-tags/tag-form.component.html b/src/app/info/info-tags/tag-form.component.html new file mode 100644 index 0000000..d85d123 --- /dev/null +++ b/src/app/info/info-tags/tag-form.component.html @@ -0,0 +1,42 @@ +
    +
    + + Key + + + + + {{ item }} + + + + + Value + + + +
    +
    + +
    +
    +
    +
    + {{ keyvalue.key }} +
    + + + + +
    +
    + +
    \ No newline at end of file diff --git a/src/app/info/info-tags/tag-form.component.ts b/src/app/info/info-tags/tag-form.component.ts new file mode 100644 index 0000000..0fa3980 --- /dev/null +++ b/src/app/info/info-tags/tag-form.component.ts @@ -0,0 +1,236 @@ +import { Component, OnInit, Input, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' +import { UntypedFormGroup, UntypedFormControl } from '@angular/forms' + +import { map } from 'rxjs/operators' +import { forkJoin, combineLatest } from 'rxjs' + +import { MapControlService } from '../../map/map-control.service' +import { FullInfo, InfoDataService, TaggedLayer } from '../info-data.service' +import { Tag, TagsPluginsService } from './tags.service' +import { AuthenticationService } from '../../_services/authentication.service' + +@Component({ + selector: 'gisaf-tag-form', + templateUrl: './tag-form.component.html', + styleUrls: ['./tag-form.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TagFormComponent implements OnInit { + @Input() source: FullInfo | TaggedLayer[] + formGroup: UntypedFormGroup + availableKeys: string[] = [] + plugins: Object = {} + pluginsFormGroup: UntypedFormGroup + + constructor( + protected infoDataService: InfoDataService, + protected mapControlService: MapControlService, + public tagsPluginsService: TagsPluginsService, + private authenticationService: AuthenticationService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + // Set an empty formGroup + this.formGroup = new UntypedFormGroup({ + key: new UntypedFormControl(''), + value: new UntypedFormControl(''), + }) + + if (this.source) { + if (this.source instanceof FullInfo) { + this.fetchSingle() + } + else { + this.fetchSelection() + } + } + + this.infoDataService.getTagKeys().subscribe( + tags => { + this.availableKeys = tags + this.cdr.markForCheck() + } + ) + } + + get storeNames(): string[] { + if (this.source instanceof FullInfo) { + let source = this.source + return [source.modelInfo.store] + } + else { + return Object.keys(this.mapControlService.selection.value) + } + } + + submit() { + if (this.source instanceof FullInfo) { + this.submitSingle() + } + else { // source: TaggedLayer[] + this.submitSelection() + } + } + + submitPlugins() { + let newTags = Object.entries(this.pluginsFormGroup.value).filter( + ([key, value]) => !!value + ) + let keys: string[] = newTags.map(kv => kv[0]) + let values: string[] = newTags.map(kv => kv[1]) + if (this.source instanceof FullInfo) { + this.submitPluginsSingle(keys, values) + } + else { // source: TaggedLayer[] + this.submitPluginsSelection(keys, values) + } + } + + /* Below, implementations for fetch, submit simple tag and plugin tags, for single feature selection */ + + protected fetchSingle() { + combineLatest([ + this.infoDataService.dataProviderService$, + this.tagsPluginsService.getTagsPlugins() + ]).pipe(map( + ([fullInfo, stores]) => { + this.pluginsFormGroup = new UntypedFormGroup({}) + for (let store of stores.stores.filter( + store => store.store == fullInfo.modelInfo.store + )) { + for (let tagKey of store.tagActions) { + if (tagKey.actions.map( + action => this.authenticationService.isAuthorized(action.roles) + ).filter(i => i).length > 0) { + this.pluginsFormGroup.addControl( + tagKey.domain ? tagKey.domain + ':' + tagKey.key : tagKey.key, + new UntypedFormControl() + ) + } + } + } + this.cdr.markForCheck() + } + )).subscribe() + } + + submitSingle() { + let source = this.source + this.infoDataService.createTag(source, this.formGroup.value).subscribe( + (tags: Tag[]) => { + source.featureInfo.tags = tags + this.infoDataService.dataProviderService.next(source) + // Update the search, forcing refreshing the tags + this.mapControlService.search.next(true) + this.cdr.markForCheck() + } + ) + } + + submitPluginsSingle(keys: string[], values: string[]) { + let source = this.source + this.tagsPluginsService.submit( + { + [source.modelInfo.store]: [source.featureInfo.id] + }, + keys, + values + ).pipe(map( + (tags: Tag[]) => { + for (let tag of tags) { + let existing_tags = source.featureInfo.tags.filter( + existing_tag => existing_tag.key == tag.key + ) + for (let existing_tag of existing_tags) { + // Remove any existing tag with the same key + source.featureInfo.tags.splice(source.featureInfo.tags.indexOf(existing_tag), 1) + } + source.featureInfo.tags.push(tag) //new Tag(key, value)) + } + } + )).subscribe( + resp => { + this.infoDataService.dataProviderService.next(source) + // Update the search, forcing refreshing the tags + this.mapControlService.search.next(true) + // Trick to refresh the tags on the map + if (this.mapControlService.hasTags.value) { + this.mapControlService.hasTags.next(true) + } + this.cdr.markForCheck() + } + ) + } + + /* Below, implementations for fetch, submit simple tag and plugin tags, for selection */ + + protected fetchSelection() { + combineLatest([ + this.mapControlService.selection$, + this.tagsPluginsService.getTagsPlugins() + ]).pipe(map( + ([selection, stores]) => { + for (let store of stores.stores.filter( + store => selection.hasOwnProperty(store.store) + )) { + for (let tagKey of store.tagActions) { + this.pluginsFormGroup.addControl(tagKey.key, new UntypedFormControl()) + } + } + this.cdr.markForCheck() + } + )).subscribe() + } + + private updateTags(tags: Tag[]) { + // Update infoDataService.taggedFeaturesSelectionService + let taggedFeatures = this.infoDataService.taggedFeaturesSelectionService.value + tags.forEach( + tag => taggedFeatures.forEach( + taggedLayer => taggedLayer.features.forEach( + taggedFeature => { + // Update existing tags + taggedFeature.tags.filter( + ftag => tag.key == ftag.key + ).map( + ftag => ftag.value = tag.value + ) + // Add new tag + if (taggedFeature.tags.findIndex(ftag => ftag.key == tag.key) == -1) { + taggedFeature.tags.push(tag) + } + } + ) + ) + ) + this.infoDataService.taggedFeaturesSelectionService.next(taggedFeatures) + // Update the search, forcing refreshing the tags + this.mapControlService.search.next(true) + this.cdr.markForCheck() + } + + submitSelection() { + let source = this.mapControlService.selection.value + this.infoDataService.createTags( + [this.formGroup.value['key']], + [this.formGroup.value['value']], + source, + ).subscribe( + (tags: Tag[]) => this.updateTags(tags) + ) + } + + submitPluginsSelection(keys: string[], values: string[]) { + let source = this.mapControlService.selection.value + //features[source.modelInfo.store] = [source.featureInfo.id] + this.tagsPluginsService.submit( + source, + keys, + values, + ).subscribe( + (tags: Tag[]) => this.updateTags(tags) + ) + } +} diff --git a/src/app/info/info-tags/tag.component.css b/src/app/info/info-tags/tag.component.css new file mode 100644 index 0000000..e5aaa24 --- /dev/null +++ b/src/app/info/info-tags/tag.component.css @@ -0,0 +1,38 @@ +.container { + border-radius: 0.3em; + padding: 0.3em 0.4em; + background-color: #595959; + padding: 0.1em; +} + +.key { + font-weight: 400; +} + +.value { + font-weight: 500; +} + +.link { + cursor: pointer; + color: #97c4ead4; +} + +.action { + cursor: pointer; + color: #ff9595; +} + +.button>mat-icon { + font-size: inherit; + width: inherit; + height: inherit; + float: right; + cursor: pointer; + color: #8b8b8b; + padding-left: 0.5em; +} + +.button>mat-icon:hover { + color: white; +} diff --git a/src/app/info/info-tags/tag.component.html b/src/app/info/info-tags/tag.component.html new file mode 100644 index 0000000..c8a0d03 --- /dev/null +++ b/src/app/info/info-tags/tag.component.html @@ -0,0 +1,15 @@ +
    +
    + {{ tag.key }} +
    + delete +
    +
    +
    + {{ tag.value }} +
    +
    + Open in new tab + {{ action.action }} +
    +
    \ No newline at end of file diff --git a/src/app/info/info-tags/tag.component.ts b/src/app/info/info-tags/tag.component.ts new file mode 100644 index 0000000..bea2d05 --- /dev/null +++ b/src/app/info/info-tags/tag.component.ts @@ -0,0 +1,98 @@ +import { Component, OnInit, Input, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { MatSnackBar } from '@angular/material/snack-bar' + +import { FullInfo, InfoDataService } from '../info-data.service' +import { MapControlService } from '../../map/map-control.service' +import { Tag, TagsPluginsService, TagAction } from './tags.service' +import { AuthenticationService } from '../../_services/authentication.service' + +@Component({ + selector: 'gisaf-tag', + templateUrl: './tag.component.html', + styleUrls: ['./tag.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TagComponent implements OnInit { + @Input() source: FullInfo + /* + @Input() set source(_source: FullInfo) { + this._source = _source + this.cdr.markForCheck() + } + */ + @Input() tag: Tag + actions: TagAction[] = [] + + constructor( + private snackBar: MatSnackBar, + private tagsPluginsService: TagsPluginsService, + protected mapControlService: MapControlService, + protected infoDataService: InfoDataService, + private authenticationService: AuthenticationService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + // Find applicable tag actions + this.tagsPluginsService.getTagsPlugins().subscribe( + stores => { + const fstores = stores.stores.filter(store => store.store == this.source.modelInfo.store) + for (let store of fstores) { + for (let tagAction of store.tagActions) { + if (tagAction.fullKey == this.tag.key) { + this.actions = tagAction.actions + return + } + } + } + } + ) + } + + get isAuthorized() { + // At least one role of the user must match the roles of the action + return this.authenticationService.roles.filter( + role => this.actions.map( + action => action.roles.indexOf(role.name) != -1 + ) + ).length > 0 + } + + getUrl(action: TagAction) { + return action.link.replace('{value}', this.tag.value) + } + + followLink(action: TagAction) { + window.open(this.getUrl(action)) + } + + doAction(store: string, id: string, action: TagAction, value: string) { + this.tagsPluginsService.doAction(store, id, action, value).subscribe( + resp => { + this.snackBar.open(resp, 'Close', {duration: 3000}) + // Refresh display + this.infoDataService.refresh.next(true) + this.mapControlService.search.next(true) + } + ) + } + + delete() { + this.infoDataService.deleteTag(this.tag, this.source).subscribe({ + next: res => { + const tags = res['data']['deleteTag']['tags'].map( + ii => new Tag(ii['key'], ii['value']) + ) + this.source.featureInfo.tags = tags + this.infoDataService.dataProviderService.next(this.source) + this.mapControlService.search.next(true) + this.cdr.markForCheck() + }, + error: err => { + console.error(err) + } + }) + } +} \ No newline at end of file diff --git a/src/app/info/info-tags/tags.component.css b/src/app/info/info-tags/tags.component.css new file mode 100644 index 0000000..d522386 --- /dev/null +++ b/src/app/info/info-tags/tags.component.css @@ -0,0 +1,15 @@ +.container { + padding: 0; +} + +h2{ + margin: 0; +} + +.existingTagsContainer { + min-width:33%; +} + +.new-tag-form { + height: 10em; +} \ No newline at end of file diff --git a/src/app/info/info-tags/tags.component.html b/src/app/info/info-tags/tags.component.html new file mode 100644 index 0000000..f97a035 --- /dev/null +++ b/src/app/info/info-tags/tags.component.html @@ -0,0 +1,25 @@ +
    +
    +
    Add tag
    + +
    +
    +
    +
    Existing tags
    +
    + + +
    +
    +
    + +
    + + +
    + No tags defined +
    +
    \ No newline at end of file diff --git a/src/app/info/info-tags/tags.component.ts b/src/app/info/info-tags/tags.component.ts new file mode 100644 index 0000000..2a0cef8 --- /dev/null +++ b/src/app/info/info-tags/tags.component.ts @@ -0,0 +1,40 @@ +import { Component, OnInit, Input, ViewChild, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { FullInfo, InfoDataService } from '../info-data.service' +import { MapControlService } from '../../map/map-control.service' +import { Tag, TagActions } from './tags.service' +import { TagFormComponent } from './tag-form.component' + +@Component({ + selector: 'gisaf-tags', + templateUrl: './tags.component.html', + styleUrls: ['./tags.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InfoTagsComponent implements OnInit { + @ViewChild(TagFormComponent, {static: true}) form: TagFormComponent + _source: FullInfo + @Input() set source(_source: FullInfo) { + this._source = _source + this.cdr.markForCheck() + } + tags: Tag[] = [] + links: TagActions[] = [] + + constructor( + protected infoDataService: InfoDataService, + protected mapControlService: MapControlService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + this.infoDataService.dataProviderService$.subscribe( + source => { + this._source = source + this.tags = this._source.featureInfo.tags + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/info/info-tags/tags.service.ts b/src/app/info/info-tags/tags.service.ts new file mode 100644 index 0000000..e2d73cd --- /dev/null +++ b/src/app/info/info-tags/tags.service.ts @@ -0,0 +1,203 @@ +import { Injectable } from '@angular/core' +import { Observable, BehaviorSubject, of as observableOf } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + + +const tagsPluginQuery = gql` +query tagsPlugins { + tagsPlugins { + stores { + store + tagActions { + domain + key + actions { + name + plugin + link + roles + action + } + } + } + } +} +` + +const tagsPluginSubmitMutation = gql` +mutation submitTagsPlugin( + $stores: [String], + $ids: [[String]], + $values: [String]!, + $keys: [String]!, +) { + submitTagsPlugin( + stores: $stores, + ids: $ids, + values: $values, + keys: $keys + ) { + tags { + key + value + } + } +} +` +const doTagActionMutation=gql` +mutation doTagAction ( + $store: String!, + $id: String!, + $plugin: String!, + $action: String!, + $value: String!, +) { + doTagAction( + store: $store, + id: $id, + plugin: $plugin, + action: $action, + value: $value, + ) { + result + } +} +` + +export class Tag { + constructor( + public key: string, + public value: string, + ) {} +} + +export class TagAction { + constructor( + public name: string, + public plugin: string, + public action: string, + public roles: string[], + public link: string, + ) {} +} + +export class TagActions { + constructor( + public domain: string, + public key: string, + public actions: TagAction[], + ) {} + + get fullKey() { + return (this.domain == '') ? this.key : this.domain + ':' + this.key + } +} + +export class Store { + constructor( + public store: string, + public tagActions: TagActions[], + ) {} +} + +export class Stores { + constructor( + public stores: Store[], + ) {} + + getByNames(stores: string[]): Store[] { + return this.stores.filter(store => stores.find(s => store.store == s)) + } +} + +@Injectable() +export class TagsPluginsService { + protected _tagsPlugins: Object = {} + protected _stores: Stores + + constructor( + private apollo: Apollo + ) { + // FIXME: the stores are available only after the instantiation of the TagsPluginsService + /* + this.getTagsPlugins().subscribe( + tagsPluginsStores => { + this.stores = tagsPluginsStores + } + ) + */ + } + + getTagsPlugins(): Observable { + if (this._stores === undefined) { + return this.apollo.query({ + query: tagsPluginQuery, + }).pipe(map( + res => { + const stores = new Stores( + res['data']['tagsPlugins']['stores'].map( + (store: Object) => new Store( + store['store'], + store['tagActions'].map( + (tagKey: Object) => new TagActions( + tagKey['domain'], + tagKey['key'], + tagKey['actions'].map( + (tagAction: Object) => new TagAction( + tagAction['name'], + tagAction['plugin'], + tagAction['action'], + tagAction['roles'], + tagAction['link'], + ) + ) + ) + ) + ) + ) + ) + this._stores = stores + return stores + } + )) + } + else { + return observableOf(this._stores) + } + } + + submit(features, keys: string[], values: string[]): Observable { + let variables = { + stores: Object.keys(features), + ids: Object.values(features).map(ids => Array.from(ids)), + keys: keys, + values: values, + } + return this.apollo.mutate({ + mutation: tagsPluginSubmitMutation, + variables: variables, + }).pipe(map( + res => res['data']['submitTagsPlugin']['tags'].map( + (tag: Object) => new Tag(tag['key'], tag['value']) + ) + )) + } + + doAction(store: string, id: string, action: TagAction, value: string): Observable { + let variables = { + "store": store, + "id": id, + "plugin": action.plugin, + "action": action.action, + "value": value, + } + return this.apollo.mutate({ + mutation: doTagActionMutation, + variables: variables + }).pipe(map( + res => res['data']['doTagAction']['result'] + )) + } +} \ No newline at end of file diff --git a/src/app/info/info-tools/action-form.component.css b/src/app/info/info-tools/action-form.component.css new file mode 100644 index 0000000..5a66018 --- /dev/null +++ b/src/app/info/info-tools/action-form.component.css @@ -0,0 +1,18 @@ +h3 { + margin-bottom: 0.3em; + margin-top: 0; +} + +.fields { + flex-wrap: wrap; + gap: 1em; +} + +.button { + align-self: center; +} + +.container { + margin: 0 1em; + height: 15em; +} diff --git a/src/app/info/info-tools/action-form.component.html b/src/app/info/info-tools/action-form.component.html new file mode 100644 index 0000000..010ee7d --- /dev/null +++ b/src/app/info/info-tools/action-form.component.html @@ -0,0 +1,47 @@ +

    {{ action.name }}

    +
    +
    + + + + + + + + + + + + + + + + + + + + + {{ field.name }} + + +
    + +
    \ No newline at end of file diff --git a/src/app/info/info-tools/action-form.component.ts b/src/app/info/info-tools/action-form.component.ts new file mode 100644 index 0000000..150be60 --- /dev/null +++ b/src/app/info/info-tools/action-form.component.ts @@ -0,0 +1,101 @@ +import { Component, Input, OnInit } from '@angular/core' + +import { UntypedFormGroup, UntypedFormControl, FormControl } from '@angular/forms' +import { MatSnackBar } from '@angular/material/snack-bar' + +import { FullInfo, InfoDataService, ModelAction, FormFieldInput } from '../info-data.service' +import { ActionsService, Action, ActionResult } from '../../_services/actions.service' + +@Component({ + selector: 'gisaf-action-form', + templateUrl: './action-form.component.html', + styleUrls: ['./action-form.component.css'] +}) +export class ActionFormComponent implements OnInit { + @Input() action: ModelAction + @Input() source: FullInfo + formGroup: UntypedFormGroup + + constructor( + private actionsService: ActionsService, + private snackBar: MatSnackBar, + ) {} + + ngOnInit() { + this.formGroup = new UntypedFormGroup({}) + this.action.formFields.forEach( + field => { + // TODO: pick appropriate control for different types + if (field.type == 'date') { + this.formGroup.addControl( + field.name, + new FormControl(new Date()) + ) + } + else if (field.type == 'time') { + this.formGroup.addControl( + field.name, + new FormControl(new Date().toLocaleTimeString( + [], {hour: '2-digit', minute:'2-digit'})) + ) + } + else if (field.type == 'number') { + this.formGroup.addControl( + field.name, + new FormControl(0) + ) + } + else if (field.type == 'checkbox') { + this.formGroup.addControl( + field.name, + new FormControl(false) + ) + } + else { + this.formGroup.addControl( + field.name, + new FormControl('') + ) + } + } + ) + } + + execute() { + this.actionsService.execute( + [this.source.modelInfo.store], + [[this.source.featureInfo.id.toString()]], + [this.action.name], + [], // params + Object.entries(this.formGroup.value).map( + ([key, value]) => { + let formField = this.action.formFields.filter( + ff => ff.name == key)[0] + let val: string + if (formField.type == 'date') { + val = (value).toISOString() + } + else { + val = `${value}` + } + return new FormFieldInput(key, val) + } + ) + ).subscribe( + results => { + // Update the tags in the info source + let result = results[0].actionResults[0] + let messages = [] + if (result.message) { + messages.push(result.message) + } + if (result.actionResults) { + result.actionResults.forEach( + (element: ActionResult) => messages.push(element.message) + ) + } + this.snackBar.open(messages.join(', '), 'Close', {duration: 3000}) + } + ) + } +} diff --git a/src/app/info/info-tools/downloader.component.css b/src/app/info/info-tools/downloader.component.css new file mode 100644 index 0000000..e69de29 diff --git a/src/app/info/info-tools/downloader.component.html b/src/app/info/info-tools/downloader.component.html new file mode 100644 index 0000000..5f7035c --- /dev/null +++ b/src/app/info/info-tools/downloader.component.html @@ -0,0 +1,7 @@ +

    {{ downloader.name }}

    + diff --git a/src/app/info/info-tools/downloader.component.ts b/src/app/info/info-tools/downloader.component.ts new file mode 100644 index 0000000..29c68a9 --- /dev/null +++ b/src/app/info/info-tools/downloader.component.ts @@ -0,0 +1,26 @@ +import { Component, Input, OnInit } from '@angular/core' + +import { MatSnackBar } from '@angular/material/snack-bar' + +import { FullInfo, Downloader } from '../info-data.service' + +@Component({ + selector: 'gisaf-downloader', + templateUrl: './downloader.component.html', + styleUrls: ['./downloader.component.css'] +}) +export class DownloaderComponent implements OnInit { + @Input() source: FullInfo + @Input() downloader: Downloader + + constructor( + private snackBar: MatSnackBar, + ) {} + + ngOnInit() { + } + + execute() { + window.open('/downloader/' + this.downloader.name + '/' + this.source.modelInfo.store + '/' + this.source.featureInfo.id) + } +} \ No newline at end of file diff --git a/src/app/info/info-tools/tools.component.css b/src/app/info/info-tools/tools.component.css new file mode 100644 index 0000000..746f606 --- /dev/null +++ b/src/app/info/info-tools/tools.component.css @@ -0,0 +1,8 @@ +.mat-mdc-tab-group { + display: flex; + flex-direction: row!important; +} + +.mat-mdc-tab-group .mat-mdc-tab-labels { + width: 4em!important; +} \ No newline at end of file diff --git a/src/app/info/info-tools/tools.component.html b/src/app/info/info-tools/tools.component.html new file mode 100644 index 0000000..55cdb9c --- /dev/null +++ b/src/app/info/info-tools/tools.component.html @@ -0,0 +1,22 @@ + + + + {{ action.icon }} + + + + + + + {{ downloader.icon }} + + + + + \ No newline at end of file diff --git a/src/app/info/info-tools/tools.component.ts b/src/app/info/info-tools/tools.component.ts new file mode 100644 index 0000000..88ba76a --- /dev/null +++ b/src/app/info/info-tools/tools.component.ts @@ -0,0 +1,74 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core' + +import { UntypedFormGroup, FormControl } from '@angular/forms' +import { MatSnackBar } from '@angular/material/snack-bar' + +import { DataService } from '../../_services/data.service' +import { AuthenticationService } from '../../_services/authentication.service' +import { ActionsService, Action } from '../../_services/actions.service' + +import { FullInfo, InfoDataService, ModelAction } from '../info-data.service' + +@Component({ + selector: 'gisaf-info-tools', + templateUrl: './tools.component.html', + styleUrls: ['./tools.component.css'], + providers: [ + DataService, + ] +}) +export class ToolsComponent { + formGroup: UntypedFormGroup + actions: Action[] = [] + _source: FullInfo + + @Input() source: FullInfo + @Output() shouldRefresh: EventEmitter = new EventEmitter() + + constructor( + private dataService: DataService, + private infoDataService: InfoDataService, + private actionsService: ActionsService, + private snackBar: MatSnackBar, + private authenticationService: AuthenticationService + ) { + } + + ngOnInit() { + this.infoDataService.dataProviderService$.subscribe( + (source: FullInfo) => { + this._source = source + this.formGroup = new UntypedFormGroup({}) + source.modelInfo.getFormFields(this.formGroup, source) + } + ) + this.actionsService.actionsProviderService$.subscribe( + actions => { + let storeActions = actions.find( + a => a.store == this._source.modelInfo.store + ) + this.actions = storeActions ? storeActions.actions : [] + } + ) + } + + get isAuthorized() { + return this.authenticationService.user.value + } + + executeAction(action: ModelAction, fullInfo: FullInfo) { + this.actionsService.execute( + [fullInfo.modelInfo.store], + [[fullInfo.featureInfo.id.toString()]], + [action.name], + [] + ).subscribe( + results => { + let result = results[0].actionResults[0] + if (result.message) { + this.snackBar.open(result.message, 'Close', {duration: 3000}) + } + } + ) + } +} \ No newline at end of file diff --git a/src/app/info/info.component.css b/src/app/info/info.component.css new file mode 100644 index 0000000..66601c6 --- /dev/null +++ b/src/app/info/info.component.css @@ -0,0 +1,114 @@ +.mainContainer { + background-color: #7b7b7b; +} + +.mainContainer>div { + background-color: #424242; +} + +.titleBar { + text-align: center; + font-weight: 800; + font-size: 120%; + background-color: #2121214f; +} + +.titleBar>.closeBtn { + float: right; + line-height: 1.35em; + width: 1.2em; + height: 2em; +} + +.titleBar .title { + top: 0.4em; + position: relative; +} + +.titleBar>span.gisaf-intext { + height: 100%; + line-height: 100%; +} + +mat-drawer { + background-color: inherit; +} + +#modeSelector { + width: 3em; +} + +#infoTabs::ng-deep .mat-mdc-card { + border-radius: none; +} + +.mat-mdc-card::ng-deep .mat-mdc-card-title { + margin-bottom: 0; +} + +#infoTabs::ng-deep mat-ink-bar { + display: none; +} + +#infoTabs::ng-deep .mat-mdc-tab-body-wrapper { + width: 100%; +} + +/* +#infoTabs::ng-deep .mat-tab-body-content { + height: 18em; +} +*/ + +:host::ng-deep .mainContainer.vertical mat-tab-group .mat-mdc-tab-labels { + display: flex; + flex-direction: column; + width: 4em; +} + +:host::ng-deep .mainContainer.vertical .mat-mdc-tab { + min-width: 3em; + height: 3em; +} + +:host .mainContainer.vertical mat-tab-group { + display: flex; + flex-direction: row; +} + +:host .mainContainer mat-tab-group[mat-tab-header-pagination-disabled] .mat-tab-header-pagination { + display: none!important; +} + +.mat-mdc-card-title { + text-align: center; + padding: 0 1em; + font-size: 1.2em; +} + +:host::ng-deep .mdc-tab { + min-width: inherit; +} + +table { + width: 100% +} + +table, th, td { + border: 1px solid lightgrey; + border-collapse: collapse; +} + +table th { + text-align: left; + font-weight: normal; + font-style: italic; + background-color: rgba(0,0,0,.12); +} + +.gisaf-intext { + width: 1em; + font-size: 2em; + vertical-align: text-top; + float: left; +} \ No newline at end of file diff --git a/src/app/info/info.component.html b/src/app/info/info.component.html new file mode 100644 index 0000000..ee40faf --- /dev/null +++ b/src/app/info/info.component.html @@ -0,0 +1,93 @@ +
    +
    +
    + + {{ fullInfo.modelInfo.modelName }}: {{ fullInfo.featureInfo.itemName }} + + close +
    + +
    + + + + info + + + + + + + comment + + + + + + + insert_chart + + + + + + + build + + + + + + + + device_hub + + + + + + + +
    +
    +
    +
    + Selection (tags) + close +
    + + +
    +
    \ No newline at end of file diff --git a/src/app/info/info.component.spec.ts b/src/app/info/info.component.spec.ts new file mode 100644 index 0000000..139727d --- /dev/null +++ b/src/app/info/info.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { InfoComponent } from './info.component'; + +describe('InfoComponent', () => { + let component: InfoComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ InfoComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InfoComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/info/info.component.ts b/src/app/info/info.component.ts new file mode 100644 index 0000000..c29745e --- /dev/null +++ b/src/app/info/info.component.ts @@ -0,0 +1,202 @@ +import { Component, OnInit, Input, ViewChild, ViewChildren, AfterViewInit, + ChangeDetectionStrategy, ChangeDetectorRef, QueryList } from '@angular/core' +import { ActivatedRoute, Router, ParamMap } from '@angular/router' + +import { MatButtonToggleGroup } from '@angular/material/button-toggle' +import { MatTabGroup, MatTabChangeEvent } from '@angular/material/tabs' + +import { DataService } from '../_services/data.service' +import { ModelDataService } from '../_services/apollo.service' + +import { MapControlService } from '../map/map-control.service' + +import { InfoPlotComponent } from './info-plot/plot.component' +import { ToolsComponent } from './info-tools/tools.component' +import { GraphComponent } from './info-graph/graph.component' +import { InfoAdminComponent } from './info-admin/info-admin.component' +import { FullInfo, InfoDataService, Feature } from './info-data.service' + +@Component({ + selector: 'gisaf-info', + templateUrl: './info.component.html', + styleUrls: ['./info.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InfoComponent implements OnInit /*, AfterViewInit */ { + @Input() id: string + @Input() store: string + @Input() inMap: boolean = false + + canBeHidden: boolean = true + hasFeature: boolean = true + hasSelection: boolean = false + featureClicked: Feature = undefined + + attachment: object = {} + image: object = {} + view = [800, 300] + hideAdmin: boolean = true + tags: object = {} + show: boolean = false + + fullInfo: FullInfo + + @ViewChild(MatButtonToggleGroup, { static: true }) modeSelector: MatButtonToggleGroup + @ViewChild(InfoPlotComponent, { static: true }) plot: InfoPlotComponent + @ViewChild(ToolsComponent, { static: true }) tools: ToolsComponent + @ViewChild(GraphComponent, { static: true }) graph: GraphComponent + @ViewChild(InfoAdminComponent, { static: true }) admin: InfoAdminComponent + @ViewChild(MatTabGroup) tabs!: MatTabGroup + @ViewChildren(InfoComponent) childrenComponent: QueryList + + constructor( + protected dataService: DataService, + protected modelDataService: ModelDataService, + protected mapControlService: MapControlService, + protected route: ActivatedRoute, + protected router: Router, + protected infoDataService: InfoDataService, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + // The component can be used with mapControlService... + this.mapControlService.featureClicked$.subscribe( + feature => { + this.featureClicked = feature + this.updateShow() + this.setFeature(this.featureClicked) + } + ) + + // ... or, the component can be used with a router (with children) + this.route.parent.paramMap.subscribe( + (params: ParamMap) => this.store = params.get('store') + ) + + this.route.paramMap.subscribe( + (params: ParamMap) => { + if (params.has('id')) { + this.id = params.get('id') + this.featureClicked = new Feature(this.store, this.id) + this.updateShow() + this.setFeature(this.featureClicked) + } + } + ) + + this.mapControlService.selection$.subscribe( + selection => { + this.hasSelection = Object.entries(selection).length != 0 + this.updateShow() + this.cdr.markForCheck() + } + ) + + this.mapControlService.toggleInfo$.subscribe( + flag => { + if (this.canBeHidden) { + if (this.hasFeature == flag) { + this.hasFeature = !flag + } + } + } + ) + + this.infoDataService.refresh$.subscribe( + _ => { + this.setFeature(this.featureClicked) + } + ) + } + + /* + selectDefaultTab() { + if (this.fullInfo.modelInfo.values.length > 0) { + this.tabs.selectedIndex = 2 + } + else { + if (!!this.fullInfo.featureInfo.graph) { + this.tabs.selectedIndex = 4 + } + else { + this.tabs.selectedIndex = 0 + } + } + } + */ + + /* + ngAfterViewInit() { + this.childrenComponent.changes.subscribe( + (comps: QueryList) => this.selectDefaultTab() + ) + } + */ + + setFeature(feature: Feature) { + if (feature) { + this.infoDataService.getFullInfo(feature).subscribe( + fullInfo => { + this.fullInfo = fullInfo + /* + if (this.tabs) { + this.selectDefaultTab() + } + */ + this.store = fullInfo.modelInfo.store + // Emit the data for measures, etc + this.infoDataService.dataProviderService.next(fullInfo) + this.cdr.markForCheck() + } + ) + } + else { + this.fullInfo = undefined + this.cdr.markForCheck() + } + } + + close() { + this.featureClicked = undefined + this.updateShow() + this.setFeature(undefined) + } + + closeSelection() { + this.mapControlService.selection.next([]) + } + + get icon(): string { + return this.store.replace('.', '-') + } + + get title(): string { + return this.store + ': ' + (this.fullInfo.featureInfo.itemName || this.id) + } + + updateShow(){ + let _newShow = !!this.featureClicked || this.hasSelection + if (_newShow != this.show) { + setTimeout( + () => this.mapControlService.resize(), + 0 + ) + this.show = _newShow + } + } + + get link(): string { + // Return a URL that can be copied/paste, to the Gisaf instance which will zoom to and select the feature + return window.location.origin + '/map?show=' + this.fullInfo.modelInfo.store + ':id:' + this.fullInfo.featureInfo.id + } + + onTabChange(evt: MatTabChangeEvent) { + // Workaround for plotly to resize to its div + window.dispatchEvent(new Event('resize')) + } + + goToAdmin(store, id) { + this.router.navigate(['/admin', store, id]) + } +} diff --git a/src/app/info/info.module.spec.ts b/src/app/info/info.module.spec.ts new file mode 100644 index 0000000..df06d77 --- /dev/null +++ b/src/app/info/info.module.spec.ts @@ -0,0 +1,13 @@ +import { InfoModule } from './info.module'; + +describe('InfoModule', () => { + let infoModule: InfoModule; + + beforeEach(() => { + infoModule = new InfoModule(); + }); + + it('should create an instance', () => { + expect(infoModule).toBeTruthy(); + }); +}); diff --git a/src/app/info/info.module.ts b/src/app/info/info.module.ts new file mode 100644 index 0000000..cdce196 --- /dev/null +++ b/src/app/info/info.module.ts @@ -0,0 +1,119 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' + +import { ClipboardModule } from '@angular/cdk/clipboard' + +import { MatAutocompleteModule } from '@angular/material/autocomplete' +import { MatButtonModule } from '@angular/material/button' +import { MatButtonToggleModule } from '@angular/material/button-toggle' +import { MatCardModule } from '@angular/material/card' +import { MatCheckboxModule } from '@angular/material/checkbox' +import { MatNativeDateModule } from '@angular/material/core' +import { MatDatepickerModule } from '@angular/material/datepicker' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatIconModule } from '@angular/material/icon' +import { MatInputModule } from '@angular/material/input' +import { MatListModule } from '@angular/material/list' +import { MatSelectModule } from '@angular/material/select' +import { MatSidenavModule } from '@angular/material/sidenav' +import { MatSnackBarModule } from '@angular/material/snack-bar' +import { MatTabsModule } from '@angular/material/tabs' +import { MatTooltipModule } from '@angular/material/tooltip' +import { MatTreeModule } from '@angular/material/tree' + +import { FlexLayoutModule } from 'ngx-flexible-layout' + +import { PipesModule } from '../pipes.module' +import { AdminDetailModule } from '../admin/admin-detail/admin-detail.module' + +import { DashboardDataService } from '../_services/apollo.service' +import { InfoDataService } from './info-data.service' + +import { InfoComponent } from './info.component' +import { InfoHomeComponent } from './info-home/info-home.component' +import { InfoPlotModule } from './info-plot/plot.module' +import { InfoTagsComponent } from './info-tags/tags.component' +import { TagFormComponent } from './info-tags/tag-form.component' +import { TagComponent } from './info-tags/tag.component' +import { TagActionComponent } from './info-tags/tag-action.component' +import { TagsPluginsService } from './info-tags/tags.service' +import { ToolsComponent } from './info-tools/tools.component' +import { AttachmentsComponent } from './info-attachments/attachments.component' +import { InfoMiscComponent } from './info-misc/info-misc.component' +import { GraphComponent } from './info-graph/graph.component' +import { InfoAdminComponent } from './info-admin/info-admin.component' +import { InfoSelectionComponent } from './info-selection/info-selection.component' +import { InfoSelectionTagsComponent } from './info-selection/info-selection-tags.component' +import { ActionFormComponent } from './info-tools/action-form.component' +import { DownloaderComponent } from './info-tools/downloader.component' +//import { InfoRoutingModule } from './info-routing.module' + + +@NgModule({ + imports: [ + CommonModule, + + FormsModule, + ReactiveFormsModule, + + ClipboardModule, + + MatAutocompleteModule, + MatButtonModule, + MatButtonToggleModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatListModule, + MatNativeDateModule, + MatSelectModule, + MatSidenavModule, + MatSnackBarModule, + MatTabsModule, + MatTooltipModule, + MatTreeModule, + + FlexLayoutModule, + + PipesModule, + + //InfoRoutingModule, + InfoPlotModule, + AdminDetailModule, + ], + declarations: [ + InfoComponent, + InfoHomeComponent, + ToolsComponent, + InfoTagsComponent, + TagFormComponent, + TagComponent, + TagActionComponent, + InfoSelectionTagsComponent, + ActionFormComponent, + AttachmentsComponent, + InfoMiscComponent, + GraphComponent, + InfoAdminComponent, + InfoSelectionComponent, + DownloaderComponent, + ], + exports: [ + InfoComponent, + ToolsComponent, + AttachmentsComponent, + InfoMiscComponent, + GraphComponent, + InfoAdminComponent, + ], + providers: [ + InfoDataService, + DashboardDataService, + TagsPluginsService, + ] +}) +export class InfoModule { } diff --git a/src/app/login/login.component.css b/src/app/login/login.component.css new file mode 100644 index 0000000..d20c094 --- /dev/null +++ b/src/app/login/login.component.css @@ -0,0 +1,3 @@ +.error { + color: red +} \ No newline at end of file diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html new file mode 100644 index 0000000..6e24cc8 --- /dev/null +++ b/src/app/login/login.component.html @@ -0,0 +1,23 @@ +
    +

    Login

    +
    +     
    + + User name + + + + Password +          + +     
    +
    {{error}}
    +         +
    +
    \ No newline at end of file diff --git a/src/app/login/login.component.spec.ts b/src/app/login/login.component.spec.ts new file mode 100644 index 0000000..093cec3 --- /dev/null +++ b/src/app/login/login.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ LoginComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts new file mode 100644 index 0000000..a139b70 --- /dev/null +++ b/src/app/login/login.component.ts @@ -0,0 +1,62 @@ +import { + Component, OnInit, ViewChild, ElementRef, + ChangeDetectorRef, ChangeDetectionStrategy +} from '@angular/core' +import { Router } from '@angular/router' + +import { UntypedFormGroup, UntypedFormControl, Validators } from '@angular/forms' + +import { ConfigService } from '../config.service' +import { AuthenticationService } from '../_services/authentication.service' + +@Component({ + templateUrl: './login.component.html', + styleUrls: ['./login.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) + +export class LoginComponent implements OnInit { + loading = false + error = '' + + formGroup: UntypedFormGroup + @ViewChild('userName', { static: true }) userName: ElementRef + + constructor( + public configService: ConfigService, + private router: Router, + private authenticationService: AuthenticationService, + private cdr: ChangeDetectorRef, + ) { } + + ngOnInit() { + this.userName.nativeElement.focus() + this.formGroup = new UntypedFormGroup({ + userName: new UntypedFormControl('', Validators.required), + password: new UntypedFormControl('', Validators.required), + }) + } + + submit() { + this.loading = true + this.authenticationService.login(this.formGroup.value.userName, this.formGroup.value.password).subscribe({ + next: result => { + if (result === true) { + // login successful + this.router.navigate(['/']) + } else { + // login failed + this.error = 'User name or password is incorrect' + this.loading = false + this.cdr.markForCheck() + } + }, + error: error => { + console.error(error) + this.error = error.statusText + this.loading = false + this.cdr.markForCheck() + } + }) + } +} diff --git a/src/app/login/login.module.ts b/src/app/login/login.module.ts new file mode 100644 index 0000000..6d58ea6 --- /dev/null +++ b/src/app/login/login.module.ts @@ -0,0 +1,31 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' + +import { MatButtonModule } from '@angular/material/button' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatInputModule } from '@angular/material/input' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' + +import { FlexLayoutModule } from 'ngx-flexible-layout' + +import { LoginComponent } from './login.component' + +@NgModule({ + imports: [ + CommonModule, + + MatFormFieldModule, + MatInputModule, + MatButtonModule, + + FormsModule, + ReactiveFormsModule, + + FlexLayoutModule, + ], + declarations: [ + LoginComponent, + ], +}) + +export class LoginModule {} diff --git a/src/app/map/base-map/base-map.component.css b/src/app/map/base-map/base-map.component.css new file mode 100644 index 0000000..90dfc1d --- /dev/null +++ b/src/app/map/base-map/base-map.component.css @@ -0,0 +1,7 @@ +::ng-deep .mat-mdc-select-panel { + max-height: 80vh !important; +} + +.mat-mdc-form-field { + width: 100%; +} \ No newline at end of file diff --git a/src/app/map/base-map/base-map.component.html b/src/app/map/base-map/base-map.component.html new file mode 100644 index 0000000..af8a6d6 --- /dev/null +++ b/src/app/map/base-map/base-map.component.html @@ -0,0 +1,15 @@ + + Base map + + + {{ bm.name }} + + + \ No newline at end of file diff --git a/src/app/map/base-map/base-map.component.ts b/src/app/map/base-map/base-map.component.ts new file mode 100644 index 0000000..da7260c --- /dev/null +++ b/src/app/map/base-map/base-map.component.ts @@ -0,0 +1,78 @@ +import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' +import { ActivatedRoute, Router } from '@angular/router' +import { combineLatest } from 'rxjs' + +import { MapControlService } from '../map-control.service' +import { MatOptionSelectionChange } from '@angular/material/core' + +import { BaseMap, MapDataService } from '../map-data.service' +import { UntypedFormGroup, UntypedFormControl } from '@angular/forms' + +@Component({ + selector: 'gisaf-map-base-map', + templateUrl: './base-map.component.html', + styleUrls: ['./base-map.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class BaseMapComponent implements OnInit { + constructor( + protected mapControlService: MapControlService, + public mapDataService: MapDataService, + protected route: ActivatedRoute, + protected router: Router, + private cdr: ChangeDetectorRef, + ) {} + + formGroup: UntypedFormGroup + + ngOnInit() { + this.route.paramMap.subscribe( + (params) => { + let baseMapParams = params.get('baseMap') + if (baseMapParams) { + let baseMapNameList = baseMapParams ? baseMapParams.split(',') : [] + + baseMapNameList.forEach( + baseMapName => { + let baseMap = this._getBaseMapByName(baseMapName) + this.mapControlService.addBaseMapLayers(baseMap.stores) + } + ) + } + } + ) + + this.mapControlService.addBaseMap$.subscribe( + (baseMap: BaseMap) => { + let existingIndex = this.mapDataService.mapInitData.baseMaps.findIndex(bm => bm.name == baseMap.name) + if (existingIndex > -1) { + this.mapDataService.mapInitData.baseMaps.splice(existingIndex, 1) + } + if (baseMap.stores.length > 0) { + this.mapDataService.mapInitData.baseMaps.push(baseMap) + this.formGroup.controls['baseMaps'].setValue([baseMap.name]) + } + this.cdr.markForCheck() + } + ) + + this.formGroup = new UntypedFormGroup({}) + this.formGroup.addControl('baseMaps', new UntypedFormControl()) + } + + protected _getBaseMapByName(name: string): BaseMap { + return this.mapDataService.mapInitData.baseMaps.find(bm => bm.name == name) + } + + selChange(evt: MatOptionSelectionChange, baseMap: BaseMap) { + if (evt.isUserInput) { + if (evt.source.selected) { + this.mapControlService.addBaseMapLayers(baseMap.stores) + } + else { + this.mapControlService.removeBaseMapLayers(baseMap.stores) + } + this.mapControlService.updateSelection.next(true) + } + } +} \ No newline at end of file diff --git a/src/app/map/controls/create-base-map-dialog.html b/src/app/map/controls/create-base-map-dialog.html new file mode 100644 index 0000000..ad32cfc --- /dev/null +++ b/src/app/map/controls/create-base-map-dialog.html @@ -0,0 +1,12 @@ +

    Create a base map with all selected layers

    +
    +

    {{ data.instruction }}

    + + Base map name + + +
    +
    + + +
    diff --git a/src/app/map/controls/create-base-map-dialog.ts b/src/app/map/controls/create-base-map-dialog.ts new file mode 100644 index 0000000..7acad5c --- /dev/null +++ b/src/app/map/controls/create-base-map-dialog.ts @@ -0,0 +1,20 @@ +import { Component, Inject } from '@angular/core' +import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog' + + +export interface DialogData { + instruction: string, + baseMapName: string, + stores: string[] +} + +@Component({ + selector: 'create-base-map-dialog', + templateUrl: './create-base-map-dialog.html', +}) +export class CreateBaseMapDialogComponent { + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: DialogData, + ) {} +} diff --git a/src/app/map/controls/map-controls.component.css b/src/app/map/controls/map-controls.component.css new file mode 100644 index 0000000..59fc403 --- /dev/null +++ b/src/app/map/controls/map-controls.component.css @@ -0,0 +1,15 @@ +.mat-mdc-raised-button { + max-width: 10em!important; +} + +.search button { + min-width: 1em!important; +} + +.search .mat-form-field { + width: 10em; +} + +.status { + width: 10em; +} \ No newline at end of file diff --git a/src/app/map/controls/map-controls.component.html b/src/app/map/controls/map-controls.component.html new file mode 100644 index 0000000..49ff855 --- /dev/null +++ b/src/app/map/controls/map-controls.component.html @@ -0,0 +1,170 @@ + + + + + + + + + Background + + + + + + + +
    + + +
    +
    + + + + + + + Annotations + + + +
    + + Labels + +
    + +
    + + Tags + +
    +
    + + + + + Filter / search + + + +
    + + Filter by status + + {{ _status }} + + +
    + + + + +
    + + + + + Downloads & more + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/map/controls/map-controls.component.ts b/src/app/map/controls/map-controls.component.ts new file mode 100644 index 0000000..703a12f --- /dev/null +++ b/src/app/map/controls/map-controls.component.ts @@ -0,0 +1,186 @@ +import { Component, OnInit } from '@angular/core' + +import { FormControl } from '@angular/forms' +import { MatSnackBar } from '@angular/material/snack-bar' + +import { ConfigService } from '../../config.service' +import { MapControlService } from '../map-control.service' +import { TreeLayerItemComponent } from '../tree-layer-item/tree-layer-item.component' +import { InfoDataService, TaggedLayer } from '../../info/info-data.service' +import { BaseMap, MapDataService, BaseStyle } from '../map-data.service' +import { LayerNode } from '../models' +import { AuthenticationService } from '../../_services/authentication.service' +import { CreateBaseMapDialogComponent } from './create-base-map-dialog' +import { MatDialog } from '@angular/material/dialog' + +@Component({ + selector: 'gisaf-map-controls', + templateUrl: './map-controls.component.html', + styleUrls: ['./map-controls.component.css'], +}) +export class MapControlsComponent implements OnInit { + baseUrl: string = '/gj/' + simplify: number = 2 + simplify_max: number = 100 + simplify_step: number = 1 + + searchText: string + tagsFilterText: string + + baseStyles: BaseStyle[] + + baseStyleOpacity: number = this.configService.conf.value.map['opacity'] + + status = new FormControl([]) + + canCreateBaseMap: boolean = false + + constructor( + public snackBar: MatSnackBar, + public configService: ConfigService, + public mapControlService: MapControlService, + protected infoDataService: InfoDataService, + public mapDataService: MapDataService, + private authenticationService: AuthenticationService, + public dialog: MatDialog, + ) { + } + + + ngOnInit() { + this.mapControlService.layerLoaded$.subscribe({ + next: layerNode => { + let item = layerNode.treeElement + item.checked = true + item.indeterminate = false + item.cdr.markForCheck() + }, + error: err => { + /* + item.checked = false + item.indeterminate = false + item.cdr.markForCheck() + if (err.status == 401) { + this.openSnackBar('Not authorized') + } + else if (err.error) { + this.openSnackBar(err.error) + } + else { + this.openSnackBar("Unexpected problem: " + err.message) + } + */ + console.error(err) + } + }) + + this.mapControlService.baseStyleOpacitySlider$.subscribe( + value => { + this.baseStyleOpacity = value + } + ) + + this.mapControlService.search$.subscribe( + forceReload => this.filter(forceReload) + ) + + /* + for (let s in this.baseStyles) { + if ('openmaptiles' in this.baseStyles[s]['sources']) { + this.baseStyles[s]['sources']['openmaptiles']['url'] = 'https://free.tilehosting.com/data/v3.json?key=' + this.conf['map']['openMapTilesKey'] + } + else if ('gisafTiles' in this.baseStyles[s]['sources']) { + this.baseStyles[s]['sources']['gisafTiles']['url'] = this.conf['map']['tilesUrl'] + this.baseStyles[s]['sprite'] = this.conf['map']['spriteUrl'] + } + } + */ + + this.status.valueChanges.subscribe( + value => { + this.mapControlService.status.next(value) + } + ) + this.status.setValue(this.configService.conf.value.map['defaultStatus']) + + this.mapControlService.baseStyleOpacity.next(this.baseStyleOpacity) + + this.canCreateBaseMap = this.authenticationService.isAuthorized(['base_map_creator']) + } + + openSnackBar(msg: string):void { + this.snackBar.open(msg, 'close', {duration: 3000}) + } + + showLayer(item: TreeLayerItemComponent): void { + item.indeterminate = true + this.mapControlService.addLayer(item.node, this.simplify) + } + + hideLayer(item: TreeLayerItemComponent) { + this.mapControlService.removeLayer(item.node as LayerNode) + item.indeterminate = false + item.checked = false + } + + toggleInfo(event) { + this.mapControlService.toggleInfo(event.checked) + } + + filter(forceReload: boolean = false) { + if (this.tagsFilterText && this.mapControlService.hasTags.getValue()) { + this.infoDataService.getTaggedLayers( + this.mapControlService.selectedLayers, + forceReload + ).subscribe( + (taggedLayers: TaggedLayer[]) => { + this.mapControlService.filter(this.searchText, taggedLayers, this.tagsFilterText) + } + ) + } + else { + this.mapControlService.filter(this.searchText) + } + } + + downloadSelectedLayers(format: String='gpkg', reproject: Boolean=false) { + let selectedLayersStores = this.mapControlService.selectedLayers.map( + (l: LayerNode) => l.store + ) + if (selectedLayersStores.length == 0) { + this.openSnackBar("There's no layer to download, please make a selection") + } + else { + window.open('/download/layers/' + format + '/' + selectedLayersStores.join(',') + + '?reproject=' + reproject) + } + } + + createBaseMap() { + let selectedLayersStores = this.mapControlService.selectedLayers.map( + (l: LayerNode) => l.store + ) + + let instruction = selectedLayersStores.length == 0 ? + "There's no layer selected, give a base map name to delete it." : + "Give a name of a base map name to create or update it." + + const dialogRef = this.dialog.open(CreateBaseMapDialogComponent, { + width: '25em', + data: { + instruction: instruction, + stores: selectedLayersStores + } + }) + + dialogRef.afterClosed().subscribe( + result => result && + this.mapDataService.createBaseMap( + result.baseMapName, + result.stores + ).subscribe( + (baseMap: BaseMap) => this.mapControlService.addBaseMap.next(baseMap) + ) + ) + } +} \ No newline at end of file diff --git a/src/app/map/gisaf-mapbox/gisaf-control.component.css b/src/app/map/gisaf-mapbox/gisaf-control.component.css new file mode 100644 index 0000000..e5d7656 --- /dev/null +++ b/src/app/map/gisaf-mapbox/gisaf-control.component.css @@ -0,0 +1,16 @@ +.gisaf-maplibregl-ctrl { + margin: 0; + float: right; + clear: both; + color: #333; + background-color: hsla(0,0%,100%,.5); + padding: 0 5px; +} + +.right { + float: right; +} + +.left { + float: left; +} \ No newline at end of file diff --git a/src/app/map/gisaf-mapbox/gisaf-control.component.ts b/src/app/map/gisaf-mapbox/gisaf-control.component.ts new file mode 100644 index 0000000..916bfbf --- /dev/null +++ b/src/app/map/gisaf-mapbox/gisaf-control.component.ts @@ -0,0 +1,70 @@ +import { + AfterContentInit, OnInit, + ChangeDetectionStrategy, + Component, + ElementRef, + Input, + OnDestroy, + ViewChild, +} from '@angular/core'; +import { IControl, ControlPosition } from 'maplibre-gl' +import { MapService } from '@maplibre/ngx-maplibre-gl' + +export class CustomControl implements IControl { + constructor(private container: HTMLElement) {} + + onAdd() { + return this.container; + } + + onRemove() { + return this.container.parentNode!.removeChild(this.container); + } + + getDefaultPosition(): ControlPosition { + return 'top-right'; + } +} + +@Component({ + selector: 'gisaf-mgl-control', + template: + '
    ', + styleUrls: ['gisaf-control.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class GisafControlComponent + implements OnInit, OnDestroy, AfterContentInit { + private controlAdded = false; + clsName: string + + /* Init inputs */ + @Input() position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'; + + @ViewChild('content', { static: true }) content: ElementRef; + + control: T | CustomControl; + + constructor(private MapService: MapService) {} + + ngOnInit() { + //this.content.nativeElement. + this.clsName = "gisaf-maplibregl-ctrl " + (this.position.endsWith('left') ? 'left' : 'right') + } + + ngAfterContentInit() { + if (this.content.nativeElement.childNodes.length) { + this.control = new CustomControl(this.content.nativeElement); + this.MapService.mapCreated$.subscribe(() => { + this.MapService.addControl(this.control!, this.position); + this.controlAdded = true; + }); + } + } + + ngOnDestroy() { + if (this.controlAdded) { + this.MapService.removeControl(this.control); + } + } +} diff --git a/src/app/map/gisaf-mapbox/gisaf-mapbox.component.css b/src/app/map/gisaf-mapbox/gisaf-mapbox.component.css new file mode 100644 index 0000000..cd5f772 --- /dev/null +++ b/src/app/map/gisaf-mapbox/gisaf-mapbox.component.css @@ -0,0 +1,87 @@ +.mat-mdc-icon-button { + width: 30px; + height: 30px; + line-height: inherit; + border-radius: 4px; + color: black; + background-color: white; + padding: 0px; + /* box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.1); */ +} + +.mat-mdc-icon-button:hover { + background-color: #eee; +} + +:host ::ng-deep mgl-map { + height: 100%; + background-color: white; +} + +/* TODO: remove mapboxgl-canvas-container when it's changed to maplibregl-canvas-container, + see https://github.com/maplibre/maplibre-gl-js/issues/83 */ +:host ::ng-deep mgl-map .mapboxgl-canvas-container.maplibregl-interactive { + cursor: crosshair; +} + +:host ::ng-deep mgl-map .mapboxgl-canvas-container.maplibregl-interactive:active { + cursor: grabbing; +} + +:host ::ng-deep mgl-map .maplibregl-canvas-container.maplibregl-interactive { + cursor: crosshair; +} + +:host ::ng-deep mgl-map .maplibregl-canvas-container.maplibregl-interactive:active { + cursor: grabbing; +} + +:host ::ng-deep mgl-map div.maplibregl-popup-content { + background-color: #424242; + color: white; + padding: 3px 6px; + font-weight: 550; +} + +:host ::ng-deep mgl-map div.maplibregl-popup-content button { + display: none; +} + +:host ::ng-deep mgl-map div.maplibregl-popup-tip { + background: transparent; + border-top-color: #424242; +} + +:host ::ng-deep mgl-map .maplibregl-popup-anchor-left .maplibregl-popup-tip { + border-right-color: #424242; + border-top-color: transparent; +} + +:host ::ng-deep mgl-map .maplibregl-popup-anchor-right .maplibregl-popup-tip { + border-left-color: #424242; + border-top-color: transparent; +} + +:host ::ng-deep mgl-map .maplibregl-popup-anchor-top .maplibregl-popup-tip { + border-bottom-color: #424242; +} + +:host ::ng-deep mgl-map .maplibregl-ctrl-attrib { + color: #333; +} + +:host ::ng-deep .mat-mdc-icon-button.-active { + background-color: #4264fb; + color: white; +} + +/* Actually unused: see root app styles.css */ +:host ::ng-deep mgl-map .maplibregl-canvas .boxdraw { + background: rgba(56,135,190,0.1); + border: 2px solid #3887be; + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; +} \ No newline at end of file diff --git a/src/app/map/gisaf-mapbox/gisaf-mapbox.component.html b/src/app/map/gisaf-mapbox/gisaf-mapbox.component.html new file mode 100644 index 0000000..aa9ac3d --- /dev/null +++ b/src/app/map/gisaf-mapbox/gisaf-mapbox.component.html @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    + + +
    +
    +
    \ No newline at end of file diff --git a/src/app/map/gisaf-mapbox/gisaf-mapbox.component.ts b/src/app/map/gisaf-mapbox/gisaf-mapbox.component.ts new file mode 100644 index 0000000..6e4a1db --- /dev/null +++ b/src/app/map/gisaf-mapbox/gisaf-mapbox.component.ts @@ -0,0 +1,1277 @@ +import { Component, OnInit, OnDestroy, Input, ViewChild, NgZone, + ChangeDetectionStrategy, ChangeDetectorRef, ElementRef } from '@angular/core' +import { ActivatedRoute, Params, Router } from '@angular/router' + +import { Observable } from 'rxjs' +import { map } from 'rxjs/operators' +import { WebSocketSubject } from 'rxjs/webSocket' + +import { MatSnackBar } from '@angular/material/snack-bar' + +import { Map, MapMouseEvent, LayerSpecification, + GeoJSONSourceSpecification, FitBoundsOptions, ExpressionSpecification } from 'maplibre-gl' +import Point from '@mapbox/point-geometry' + +import * as bbox from '@turf/bbox' + +import { GeoJsonService, LiveGeoJsonService, MapboxDataAndStyle } from '../../_services/geojson.service' +import { ConfigService } from '../../config.service' +import { MapControlService } from '../map-control.service' +import { LayerNode } from '../models' +import { InfoDataService, Feature, TaggedLayer, FeatureWithField, TaggedFeature } from '../../info/info-data.service' +import { Store, MapDataService, BaseStyle } from '../map-data.service' + +export class LayerWithMetaData { + constructor( + public layer: LayerSpecification, + public highlightedLayer: LayerSpecification, + public layerNode: LayerNode, + ) {} +} + +let normalize = (s: string) => s ? s.trim().toLowerCase() : '' + + +@Component({ + selector: 'gisaf-mapbox', + templateUrl: 'gisaf-mapbox.component.html', + styleUrls: [ 'gisaf-mapbox.component.css' ], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + GeoJsonService, + LiveGeoJsonService, + ], +}) +export class GisafMapboxComponent implements OnInit, OnDestroy { + @ViewChild('mglMap', { static: true }) mglMap: Map + @ViewChild('featureInfo', { static: true }) featureInfo: ElementRef + @ViewChild('mouseLngLat', { static: true }) mouseLngLat: ElementRef + @ViewChild('customAttribution', { static: true }) customAttributionElement: ElementRef + + // XXX: temporary, for keeping map-controls.component.ts happy + map: Map + + zoom: number = this.configService.conf.value.map['zoom'] + pitch: number = this.configService.conf.value.map['pitch'] + lat: number = this.configService.conf.value.map['lat'] + lng: number = this.configService.conf.value.map['lng'] + bearing: number = this.configService.conf.value.map['bearing'] + globalAttribution: string = this.configService.conf.value.map['attribution'] + + baseStyle: BaseStyle = new BaseStyle('None') + protected _baseStyleName: string = this.configService.conf.value.map['style'] + protected _bottom: number = 0 + + protected canvas: HTMLElement + + protected selStart: Point + protected selAppend: boolean + protected selBox: HTMLDivElement + + geolocateTrackUserLocation = true + geolocateShowUserLocation = true + geolocatePositionOptions = { + "enableHighAccuracy": true + } + geolocateFitBoundsOptions: FitBoundsOptions = { + "maxZoom": 12, + } + + popupOnFeature: string | null | number + + layerDefs: object = {} + layers: object = {} + highlightedLayers: object = {} + originalBaseStyle: BaseStyle + pendingLayers: LayerWithMetaData[] = [] + subscribedLiveLayers: LayerNode[] = [] + + protected _baseStyleOpacity: number + private _pendingBaseStyleOpacity: number + protected wss: object = {} // WebSocketSubject + + symbolTextSize: ExpressionSpecification = [ + 'interpolate', ["linear"], ['zoom'], 14, 13, 20, 24 + ] + + constructor( + public configService: ConfigService, + protected route: ActivatedRoute, + protected router: Router, + protected ngZone: NgZone, + private cdr: ChangeDetectorRef, + public snackBar: MatSnackBar, + protected _geoJsonService: GeoJsonService, + protected _liveGeoJsonService: LiveGeoJsonService, + protected mapDataService: MapDataService, + public mapControlService: MapControlService, + protected infoDataService: InfoDataService, + ) {} + + @Input() + set baseStyleName(styleName: string) { + this._baseStyleName = styleName + this.mapDataService.getBaseStyle(styleName).subscribe( + (baseStyle: BaseStyle) => { + // XXX: this assumes mapbox map is loaded + this.originalBaseStyle = baseStyle + if (this.map) { + // Copy the base style for reference (eg. apply opacities) + let oldStyle = this.map.getStyle() + // Copy the layers to the new source + for (let store in this.layers) { + let highlightedStore = store + '-highlighted' + let tagsStore = store + '-tags' + let layer = oldStyle.layers.find(l => l.id == store) + let highlightedLayer = oldStyle.layers.find(l => l.id == highlightedStore) + let source = (this.map.getSource(store)).serialize() + let highlightedSource = (this.map.getSource(highlightedStore)).serialize() + baseStyle.style['sources'][store] = source + baseStyle.style['sources'][highlightedStore] = highlightedSource + //layer['source'] = source + //highlightedLayer['source'] = source + baseStyle.style['layers'].push(layer) + baseStyle.style['layers'].push(highlightedLayer) + let tagsSourceRaw = (this.map.getSource(tagsStore)) + if (tagsSourceRaw) { + let tagsLayer = oldStyle.layers.find(l => l.id == tagsStore) + baseStyle.style['sources'][tagsStore] = tagsSourceRaw.serialize() + baseStyle.style['layers'].push(tagsLayer) + } + } + setTimeout(() => this.applyBaseStyleOpacity(), 0) + } + this.baseStyle = baseStyle + this.cdr.markForCheck() + } + ) + } + get baseStyleName() { + return this._baseStyleName + } + + @Input() + get permaLink() { + if (!this.map) return + let baseUrl = window.location.origin + '/' + 'map' + '?' + let center = this.map.getCenter() + let data = {} + let ret = [] + data['lat'] = center['lat'].toFixed(6) + data['lng'] = center['lng'].toFixed(6) + data['zoom'] = this.map.getZoom().toFixed(2) + data['pitch'] = this.map.getPitch().toFixed(1) + data['bearing'] = this.map.getBearing().toFixed(1) + data['baseStyleName'] = this.baseStyleName + data['baseStyleOpacity'] = this.baseStyleOpacity.toFixed(2) + data['layers'] = this.getLayersForUrl().join(',') + for (let d in data) { + ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d])) + } + return baseUrl + ret.join('&') + } + + protected getLayersForUrl(): string[] { + return Object.keys(this.layers) + } + + @Input() + set baseStyleOpacity(opacity: number) { + if (opacity == this._baseStyleOpacity) return + if (!this.map) { + if (!this._pendingBaseStyleOpacity) { + this._pendingBaseStyleOpacity = opacity + } + return + } + this._baseStyleOpacity = opacity + this.applyBaseStyleOpacity() + } + get baseStyleOpacity(): number { + return this._baseStyleOpacity + } + + _getNewSingleOpacity(layerId: string, originalOpacity: number | object): number | object { + if (typeof(originalOpacity) === 'number') { + return originalOpacity * this._baseStyleOpacity + } + else { + let newOpacity = {} + for (const k in originalOpacity) { + let v = originalOpacity[k] + if (k == 'stops') { + newOpacity[k] = v.map(stop => [stop[0], stop[1] * this._baseStyleOpacity]) + } + else { + newOpacity[k] = v + } + } + return newOpacity + } + } + + _getNewOpacity(layer: object): object { + let originalStyle = this.originalBaseStyle.style['layers'].find( + (_layer: object) => layer['id'] == _layer['id'] + ) + if (!('paint' in originalStyle)) { + originalStyle['paint'] = {} + } + if (['raster', 'background', 'fill', 'line'].indexOf(layer['type']) != -1) { + let prop = layer['type'] + '-opacity' + return { + [prop]: this._getNewSingleOpacity(layer['id'], originalStyle['paint'][prop] || 1.0) + } + } + else { + let prop1 = 'text-opacity' + let prop2 = 'icon-opacity' + let newOpacity1 = this._getNewSingleOpacity(layer['id'], originalStyle['paint'][prop1] || 1.0) + let newOpacity2 = this._getNewSingleOpacity(layer['id'], originalStyle['paint'][prop2] || 1.0) + return { + [prop1]: newOpacity1, + [prop2]: newOpacity2, + } + } + } + + applyBaseStyleOpacity() { + for (let bsLayer of this.baseStyle.style['layers']) { + // Skip our layers + if (this.layers[bsLayer['id']] || bsLayer['id'].endsWith('-highlighted') || bsLayer['id'].endsWith('-tags') || bsLayer['id'].endsWith('-labels')) { + continue + } + for (const [key, value] of Object.entries(this._getNewOpacity(bsLayer))) { + this.map.setPaintProperty(bsLayer.id, key, value) + } + } + } + + /* + * For reference: + routeQueryParamSetter = ['lat', 'lng', 'zoom', 'pitch', 'baseStyleName', 'bearing', 'baseStyleOpacity', 'layers'] + */ + + ngOnInit() { + this.route.queryParams.subscribe( + (params: Params) => { + if ('lat' in params) { + this.lat = parseFloat(params['lat']) + } + if ('lng' in params) { + this.lng = parseFloat(params['lng']) + } + if ('zoom' in params) { + this.zoom = parseFloat(params['zoom']) + } + if ('pitch' in params) { + this.pitch = parseFloat(params['pitch']) + } + if ('bearing' in params) { + this.bearing = parseFloat(params['bearing']) + } + if ('baseStyleOpacity' in params) { + this._pendingBaseStyleOpacity = parseFloat(params['baseStyleOpacity']) + } + if ('baseStyleName' in params) { + this.baseStyleName = params['baseStyleName'] + } + else { + this.baseStyleName = this._baseStyleName + } + if ('layers' in params) { + this.mapControlService.mapReady$.subscribe( + _ => { + this.mapControlService.addBaseMapLayers( + params['layers'].split(',').map((store: string) => new Store(store)) + ) + } + ) + } + if ('show' in params) { + let featureRef: string[] = params['show'].split(':') + let store = featureRef[0] + let field = featureRef[1] + let value = featureRef[2] + this.mapControlService.mapReady$.subscribe( + _ => this.mapControlService.showFeature.next( + new FeatureWithField(store, field, value) + ) + ) + } + this.cdr.markForCheck() + } + ) + + /*** Subscriptions ***/ + + this.mapControlService.baseStyleOpacity$.subscribe( + baseStyleOpacity => { + this.baseStyleOpacity = baseStyleOpacity + } + ) + + this.mapControlService.baseStyleName$.subscribe( + baseStyleName => { + this.baseStyleName = baseStyleName + } + ) + + this.mapControlService.layerAdd$.subscribe( + (layerNode: LayerNode) => { + layerNode.mapSubscription = this.addLayer(layerNode).subscribe( + _ => { + this.setAttributions() + this.mapControlService.layerLoaded.next(layerNode) + } + ) + } + ) + + this.mapControlService.layerRemove$.subscribe( + (layerNode: LayerNode) => { + this.removeLayer(layerNode) + layerNode.cancelDownload() + } + ) + + this.mapControlService.filter$.subscribe( + ([searchText, taggedFeatures, taggedFeatureText]) => { + this.filter(searchText, taggedFeatures, taggedFeatureText) + } + ) + + this.mapControlService.resize$.subscribe( + flag => { + this.map && this.map.resize() + } + ) + + this.mapControlService.zoomToFeatures$.subscribe( + flag => { + this.zoomToFeatures() + } + ) + + this.mapControlService.hasLabels$.subscribe( + flag => { + if (flag) { + this.addLabelsLayers(this.mapControlService.selectedLayers) + } + else { + this.removeLabelsLayers() + } + } + ) + this.mapControlService.hasTags$.subscribe( + flag => { + if (flag) { + this.infoDataService.getTaggedLayers( + this.mapControlService.selectedLayers, + true + ).subscribe( + (taggedLayers: TaggedLayer[]) => this.addTagsLayers(taggedLayers) + ) + } + else { + this.removeTaggedLayers() + } + } + ) + + this.mapControlService.status$.subscribe( + status => { + this.filterByStatus(status) + } + ) + + this.mapControlService.tempSelection$.subscribe( + features => { + for (let layerName in this.highlightedLayers) { + this.highlightFeatures(this.layers[layerName], features[layerName]) + } + } + ) + + this.mapControlService.selection$.subscribe( + features => { + // Verse tempSelection to selection + this.mapControlService.tempSelection.next(features) + } + ) + + // Got tags, add layers + this.infoDataService.taggedLayers$.subscribe( + taggedLayers => this.addTagsLayers(taggedLayers) + ) + } + + onLoad(map: Map) { + this.map = map + if (!this.map) { + console.error('Something quite wrong with the map init') + return + } + this.map.on('mousemove', evt => this.onMove(evt)) + this.map.on('mouseleave', evt => this.onLeave(evt)) + this.map.getCanvasContainer().addEventListener('keydown', evt => this.onKeyDown(evt)) + if (this._pendingBaseStyleOpacity) { + this.mapControlService.baseStyleOpacitySlider.next(this._pendingBaseStyleOpacity) + this.baseStyleOpacity = this._pendingBaseStyleOpacity + this._pendingBaseStyleOpacity = undefined + } + else { + this.applyBaseStyleOpacity() + } + // Set up a trigger for adding more layers + this.map.on('style.load', _ => this.addLayers()) + this.pendingLayers.forEach(layerAndDef => this.addLayerOnMap(layerAndDef)) + this.canvas = map.getCanvasContainer() + + // Trigger the event / observable + this.mapControlService.mapLoaded.complete() + } + + /* + * Feature selection (with alt key down) + */ + + private _mousePos(evt): Point { + var rect = this.canvas.getBoundingClientRect(); + return new Point( + evt.clientX - rect.left - this.canvas.clientLeft, + evt.clientY - rect.top - this.canvas.clientTop + ) + } + + onMouseDown(evt) { + // Continue the rest of the function if the altKey is pressed. + if (!(evt.originalEvent.altKey && evt.originalEvent.button === 0 && this.canvas)) return + + // Disable default drag zooming when the altKey is held down. + this.map.dragPan.disable() + + // Capture the first xy coordinates + this.selStart = this._mousePos(evt.originalEvent) + + // Make sure that the selBox is initiated (takes care of case of a single click) + this.onMouseMove(evt) + + // Remember if the new selBox should append to the current selection + this.selAppend = evt.originalEvent.shiftKey + } + + onMouseMove(evt) { + // Capture the ongoing xy coordinates + if (!this.inSelectionMode()) return + + // Append the selBox element if it doesnt exist + if (!this.selBox) { + this.selBox = document.createElement('div') + this.selBox.classList.add('boxdraw') + this.canvas.appendChild(this.selBox) + } + + let selCurrent: Point = this._mousePos(evt.originalEvent) + var minX = Math.min(this.selStart.x, selCurrent.x), + maxX = Math.max(this.selStart.x, selCurrent.x), + minY = Math.min(this.selStart.y, selCurrent.y), + maxY = Math.max(this.selStart.y, selCurrent.y) + + // Adjust width and xy position of the selBox element ongoing + var pos = 'translate(' + minX + 'px,' + minY + 'px)' + this.selBox.style.transform = pos + this.selBox.style.webkitTransform = pos + this.selBox.style.width = maxX - minX + 'px' + this.selBox.style.height = maxY - minY + 'px' + this.selectFeaturesInBbox(this.selStart, this._mousePos(evt.originalEvent)) + } + + onMouseUp(evt) { + // Capture xy coordinates + if (this.inSelectionMode()) { + this.selFinish() + } + } + + inSelectionMode() { + return !!this.selStart + } + + onKeyDown(evt) { + // If the ESC key is pressed + if (evt.keyCode === 27) { + this.mapControlService.selectFeatures([]) + this.mapControlService.selectFeaturesTemp([]) + if (this.inSelectionMode()) { + this.selFinish() + } + } + } + + selectFeaturesInBbox(point1: Point, point2: Point) { + let featureList = this.map.queryRenderedFeatures( + [point1, point2], + {layers: Object.keys(this.layers)} + ) + + // XXX: there should be a better method to build the dict of selected features, eg. map-reduce + let features: object = {} + for (let feature of featureList) { + if (!features.hasOwnProperty(feature.layer.id)) { + features[feature.layer.id] = new Set() + } + features[feature.layer.id].add(feature.id || feature.properties['id']) + } + + if (this.selAppend) { + let previousSel = this.mapControlService.selection.getValue() + for (let layerName in previousSel) { + if (features.hasOwnProperty(layerName)) { + features[layerName] = new Set([ + ...features[layerName], + ...previousSel[layerName] || [] + ]) + } + else { + features[layerName] = previousSel[layerName] + } + } + } + // Emit an event with the features, for the info panel and highlight layers + this.mapControlService.selectFeaturesTemp(features) + } + + selFinish() { + this.mapControlService.selectFeatures(this.mapControlService.tempSelection.getValue()) + if (this.selBox) { + this.selBox.parentNode.removeChild(this.selBox); + this.selBox = null; + this.selStart = null; + } + this.map.dragPan.enable(); + } + + ngOnDestroy() { + //this.map.removeHash() + // Remove tagged layers + this.infoDataService.taggedLayers.next([]) + } + + disconnectLive() { + this._liveGeoJsonService.disconnect() + } + + addLayers() { + // Add the layers already selected + for (let layerName in this.layers) { + let layer: LayerSpecification = this.layers[layerName] + this.ngZone.runOutsideAngular( + () => { + this.map.addLayer(layer, this.getLayerNameBefore(this.layerDefs[layerName])) + } + ) + } + } + + getLayerNameBefore(layerDef) { + if (!layerDef.zIndex) { + return + } + let layersAfter = Object.keys(this.layerDefs) + .map(k => this.layerDefs[k]) + .filter(l => l.zIndex && (l.zIndex > layerDef.zIndex)) + .sort((l1, l2) => l1.zIndex - l2.zIndex) + if (layersAfter.length > 0) { + return layersAfter[0].store + } + } + + setAttributions() { + const attributions = Object.values(this.layers).map(l => l['attribution']) + const uniques = [...new Set(attributions)] + this.customAttributionElement.nativeElement.innerHTML = uniques.join(', ') + } + + addLayer(layerNode: LayerNode, simplify: number = 0.2): Observable { + /* + * All the hard work formatting the data and style to MapBox + */ + let layerDef = layerNode + return this._geoJsonService.getAll(layerNode.getUrl(), layerNode.store, { + simplify: String(simplify) + }).pipe(map( + (resp: MapboxDataAndStyle) => { + let data = resp.data + if (!data['features'] || data['features'].length == 0) { + console.log('Empty layer', layerDef.store) + return + } + let mapboxPaint = JSON.parse(resp.style.paint) + let mapboxLayout = JSON.parse(resp.style.layout) + this.layerDefs[layerDef.store] = layerDef + + // Make sure ids are not in properties (like postGis to_GeoJson) + // because Mapbox doesn't like strings as ids + if (!data['features'][0]['id'] && data['features'][0]['properties']['id']) { + /* + data['features'].forEach( + (feature:Object) => { + feature['id'] = feature['properties']['id'] + } + ) + */ + } + else { + data['features'].forEach( + (feature:object) => { + feature['properties']['id'] = feature['id'] + } + ) + } + + // Add a property to each feature, keeping track of selection + data['features'].forEach( + (feature:object) => feature['properties']['_selected'] = false + ) + + let layer: LayerSpecification = { + id: layerDef.store, + type: layerDef.type, + source: { + type: "geojson", + data: data + }, + attribution: resp.style.attribution + } + this.layers[layerDef.store] = layer + + let highlightedLayer: LayerSpecification = { + id: layerDef.store + '-highlighted', + type: layerDef.type, + source: { + type: "geojson", + data: data + }, + filter: ["==", "_selected", true] + } + this.highlightedLayers[layerDef.store] = highlightedLayer + + let layerX = new LayerWithMetaData(layer, highlightedLayer, layerNode) + + if (layerDef.type == 'symbol') { + layer['layout'] = { + 'text-line-height': 1, + 'text-padding': 0, + 'text-allow-overlap': true, + 'text-field': layerDef.symbol || '\ue32b', + 'icon-optional': true, + 'text-font': ['GisafSymbols'], + 'text-size': this.symbolTextSize, + } + layer['paint'] = { + 'text-translate-anchor': 'viewport', + 'text-color': '#000000' + } + highlightedLayer['layout'] = { + 'text-line-height': 1, + 'text-padding': 0, + 'text-allow-overlap': true, + 'text-field': layerDef.symbol || '\ue32b', + 'icon-optional': true, + 'text-font': ['GisafSymbols'], + 'text-size': this.symbolTextSize, + } + highlightedLayer['paint'] = { + 'text-translate-anchor': 'viewport', + 'text-color': 'red' + } + } + else if (layerDef.type == 'fill') { + layer['paint'] = { + 'fill-color': 'blue', + 'fill-opacity': 0.50, + } + highlightedLayer['paint'] = { + 'fill-color': 'red', + 'fill-opacity': 0.70, + } + } + else if (layerDef.type == 'line') { + layer['paint'] = { + 'line-color': 'red', + 'line-opacity': 0.70, + 'line-width': 2, + 'line-blur': 0.5, + } + highlightedLayer['paint'] = { + 'line-color': 'red', + 'line-opacity': 0.90, + 'line-width': 2, + 'line-blur': 0.5, + } + } + else if (layerDef.type == 'circle') { + layer['paint'] = { + 'circle-blur': 0.5, + 'circle-opacity': 0.7, + 'circle-color': '#404', + 'circle-radius': 10, + } + highlightedLayer['paint'] = { + 'circle-blur': 0.5, + 'circle-opacity': 0.9, + 'circle-color': 'red', + 'circle-radius': 10, + } + } + else if (layerDef.type == 'fill-extrusion') { + layer['paint'] = { + 'fill-extrusion-height': 5, + 'fill-extrusion-opacity': 0.7, + } + highlightedLayer['paint'] = { + 'fill-extrusion-height': (mapboxPaint && mapboxPaint['fill-extrusion-height']) || 5, + 'fill-extrusion-opacity': 0.9, + 'fill-extrusion-color': 'red', + } + } + + if (mapboxPaint) { + layer['paint'] = mapboxPaint + } + if (mapboxLayout) { + layer['layout'] = mapboxLayout + } + + if (this.map) { + this.addLayerOnMap(layerX) + } + else { + this.pendingLayers.push(layerX) + } + + if (this.mapControlService.hasLabels.value) { + this.addLabelsLayer(layerDef) + } + + if (this.mapControlService.hasTags.value) { + this.getAndAddTagsLayer(layerDef) + } + } + )) + } + + zoomToAndInfoFeature(layerX: LayerWithMetaData) { + // Zoom to the feature, if it's in the layer + let featuretoShow = this.mapControlService.showFeature.value + if (!featuretoShow) return + if (featuretoShow.store != layerX.layerNode.store) return + let id: string + let featureData: object[] + if (featuretoShow.field === 'id') { + id = featuretoShow.value + // XXX: remove typings (maplibre 2.x) + featureData = [(layerX.layer).source.data['features'].find( + (f: object) => f['id'] == id || f['properties']['id'] == id + )] + } + else { + featureData = (layerX.layer).source.data['features'].filter( + (f: object) => f['properties'][featuretoShow.field] == featuretoShow.value || f[featuretoShow.field] == featuretoShow.value + ) + // Select only the first matching id + id = featureData[0]['id'] + } + + // Zoom + if (featureData.length > 0 && !!featureData[0]) { + // Show info + this.mapControlService.featureClicked.next(new Feature(featuretoShow.store, id)) + + // Clear to prevent zooming again + this.mapControlService.showFeature.next(undefined) + + // XXX: zoomToFeatures should actually be called when the layer is loaded + // Using setTimeout as workaround + setTimeout( + () => this.zoomToFeatures(featureData), + 700 + ) + } + } + + addLayerOnMap(layerX: LayerWithMetaData) { + // Zoom and info of the feature to show (as per the router query), + // if that layer matches the store of that feature + this.zoomToAndInfoFeature(layerX) + + if (!!this.map.getLayer(layerX.layerNode.store)) { + console.debug('Layer already on the map', layerX.layerNode) + return + } + this.ngZone.runOutsideAngular( + () => { + this.map.addLayer(layerX.layer, this.getLayerNameBefore(layerX.layerNode)) + this.map.addLayer(layerX.highlightedLayer) + } + ) + this.filterByStatus(this.mapControlService.status.value, layerX.layerNode.store, layerX.layerNode) + + // Register events for that layer + this.map.on('mouseenter', layerX.layer['id'], evt => this.onEnter(evt)) + this.map.on('mousemove', layerX.layer['id'], evt => this.onMoveOnLayer(evt)) + this.map.on('mouseleave', layerX.layer['id'], evt => this.onLeaveOnLayer(evt)) + + // Live layer + if (layerX.layerNode.live) { + this.subscribedLiveLayers.push(layerX.layerNode) + this.addLiveLayerListener(layerX.layerNode) + } + + this.setAttributions() + } + + addLiveLayerListener(layerDef: LayerNode) { + let ws: WebSocketSubject = this._liveGeoJsonService.connect(layerDef.store) + this.wss[layerDef.store] = ws + ws.next({ + 'message': 'subscribeLiveLayer', + }) + ws.subscribe({ + next: (data: GeoJSON.FeatureCollection) => { + // XXX: remove typings (maplibre 2.x) + let source = this.map.getSource(layerDef.store) + if (!source) { + // Unsubscribe from channel on server + console.warn('Live WS: cannot getSource for WS message: ', layerDef.store, data) + ws.next({ + 'message': 'unsubscribeLiveLayer', + }) + return + } + source.setData(data) + }, + error: err => { + console.error('Websocket', layerDef.store, err) + //this.snackBar.open('Lost contact with Gisaf live server', 'OK') + } + }) + } + + removeLiveLayerListener(layerDef: LayerNode) { + let ws: WebSocketSubject = this.wss[layerDef.store] + if (!ws) { + return + } + ws.next({ + 'message': 'unsubscribeLiveLayer', + }) + delete this.wss[layerDef.store] + } + + removeLayer(layerDef: LayerNode) { + // See https://github.com/mapbox/mapbox-gl-js/issues/4466 + this.removeLayersByIds([ + layerDef.store, + layerDef.store + '-tags', + layerDef.store + '-labels', + ]) + if (layerDef.store in this.highlightedLayers) { + this.removeLayersByIds([this.highlightedLayers[layerDef.store]['id']]) + } + delete this.layerDefs[layerDef.store] + delete this.layers[layerDef.store] + delete this.highlightedLayers[layerDef.store] + if (layerDef.live) { + this.removeLiveLayerListener(layerDef) + } + this.setAttributions() + } + + filter(searchText: string, taggedFeatures: TaggedLayer[], taggedFeatureText: string): void { + for (let layerName in this.layers) { + this.filterLayer(layerName, normalize(searchText), taggedFeatures, normalize(taggedFeatureText)) + } + } + + filterLayer(layerName: string, searchText: string, taggedFeatures: TaggedLayer[]=[], taggedFeatureText: string) { + let layer = this.layers[layerName] + let tagsLayerName = layerName + '-tags' + let labelsLayerName = layerName + '-labels' + let hasTagsLayer = !!this.map.getLayer(tagsLayerName) + let hasLabelsLayer = !!this.map.getLayer(labelsLayerName) + let filteredIds: any[] + + if (!searchText && !taggedFeatureText) { + // Clear all filters + this.map.setFilter(layerName, null) + hasTagsLayer && this.map.setFilter(tagsLayerName, null) + hasLabelsLayer && this.map.setFilter(labelsLayerName, null) + return + } + + if (searchText) { + // TODO: regex matching (waiting for https://github.com/mapbox/mapbox-gl-js/pull/6228) + //this.map.setFilter(layerName, ['regex-test', 'popup', searchText]) + //this.map.setFilter(layerName, ['==', 'popup', searchText]) + // Layer from JSON + let filtered = layer.source.data.features.filter( + feature => normalize(feature.properties.popup).indexOf(searchText) > -1 + ) + // Feature ids are converted to int in mapbox for some reason (https://github.com/mapbox/geojson-vt/pull/60) + filteredIds = filtered.map(feature => feature.id || feature.properties.id) + } + else { + filteredIds = [] + } + + // Features with matching tags + let taggedLayerFeatures = taggedFeatures.find(t => t.store == layerName) + if (taggedLayerFeatures) { + filteredIds.push(...taggedLayerFeatures.features.filter( + feature => feature.tags.filter( + tag => ( + normalize(tag.key).indexOf(taggedFeatureText) > -1) + || (normalize(tag.value).indexOf(taggedFeatureText) > -1 + ) + ).length > 0 + ).map(feature => feature.id)) + } + + if (filteredIds.length > 0) { + // Filter the feature layers + this.map.setFilter( + layerName, + // Filter expressions using 'match' seem not support $id, using 'in' + ['in', 'id', ...filteredIds] + ) + // Filter the tags layers + hasTagsLayer && this.map.setFilter(tagsLayerName, ['in', 'id', ...filteredIds]) + // Filter the labels layers + hasLabelsLayer && this.map.setFilter(labelsLayerName, ['in', 'id', ...filteredIds]) + // TODO: filter the selection layers + } + else { + // Nothing found, set filters as-is (should be none) + this.map.setFilter(layerName, ['==', 'popup', searchText]) + hasTagsLayer && this.map.setFilter(tagsLayerName, ['==', 'popup', taggedFeatureText]) + hasLabelsLayer && this.map.setFilter(labelsLayerName, ['==', 'popup', taggedFeatureText]) + } + } + + highlightFeatures(layer, ids) { + // Filter the features matching the ids in the related highlighted layer + if (!layer) { + console.debug('TODO: remove layer from highlightedLayers') + return + } + let highlightedLayer = this.highlightedLayers[layer['id']] + let idsString = new Set(Array.from(ids || []).map(id => id.toString())) + + let allFeatures = layer['source']['data']['features'] + allFeatures.forEach( + feature => feature['properties']['_selected'] = idsString.has(feature['id'] || feature['properties']['id']) + ) + + // XXX: remove typings (maplibre 2.x) + let hlayer = this.map.getSource(highlightedLayer.id) + if (hlayer) { + hlayer.setData({ + type: 'FeatureCollection', + features: allFeatures + }) + } + else { + console.log(highlightedLayer) + } + } + + getAndAddTagsLayer(tagLayerNode: LayerNode) { + this.infoDataService.getTaggedLayers([tagLayerNode], true).subscribe( + (taggedLayers: TaggedLayer[]) => Object.values(taggedLayers).forEach( + taggedLayer => this.addTagsLayer(taggedLayer) + ) + ) + } + + addLabelsLayer(layerNode: LayerNode) { + let layerName = layerNode.store + '-labels' + let layer = this.layers[layerNode.store] + let source = layer['source']['data'] + let features = source['features'] + let labelsFeatures = features.map( + feature => { + return { + 'id': feature['id'], + 'type': 'Feature', + 'properties': { + 'id': feature['id'], + 'label': feature['properties']['label'] || feature['properties']['popup'] + }, + 'geometry': feature['geometry'] + } + } + ) + //this.map.addSource(layerName, { + // 'type': 'geojson', + // 'data': { + // 'type': 'FeatureCollection', + // 'features': labelsFeatures, + // } + //}) + let labelsLayer = { + 'id': layerName, + 'type': 'symbol', + 'minzoom': 13, + 'source': { + 'type': 'geojson', + 'data': { + 'type': 'FeatureCollection', + 'features': labelsFeatures, + } + }, + 'layout': { + 'text-field': ['get', 'label'], + 'text-line-height': 1, + 'text-padding': 0, + 'text-anchor': 'bottom', + 'text-offset': [0, 0], + 'text-allow-overlap': false, + 'text-font': ['Noto Sans Regular'], + 'text-size': { + stops: [[13, 9], [20, 18]] + }, + 'symbol-placement': layerNode.type == 'line' ? 'line' : 'point', + }, + 'paint': { + 'text-translate-anchor': 'viewport', + 'text-color': '#222266', + 'text-halo-color': 'white', + 'text-halo-width': 1, + 'text-halo-blur': 0, + } + } + this.ngZone.runOutsideAngular( + () => this.map.addLayer(labelsLayer) + ) + } + + addTagsLayer(taggedLayer: TaggedLayer) { + let layerName = taggedLayer.store + '-tags' + if (!!this.map.getLayer(layerName)) { + this.removeTaggedLayer(taggedLayer.store) + } + // Filter only features really in the layer + let taggedFeatureIds = taggedLayer.features.map(ff => ff.id) + let features = this.layers[taggedLayer.store].source.data.features.filter( + (f: object) => + taggedFeatureIds.findIndex( + fff => fff == f['id'] || fff == f['properties']['id'] + ) !== -1 + ) + let taggedLayerFeatures = taggedLayer.features.filter( + (f: TaggedFeature) => features.findIndex( + (ff: object) => ff['id'] === f.id || ff['properties']['id'] === f.id) != -1 + ) + let tagsLayer = { + id: layerName, + type: 'symbol', + minzoom: 13, + source: { + type: "geojson", + data: { + type: 'FeatureCollection', + features: taggedLayerFeatures.map( + feature => { + return { + type: 'Feature', + properties: { + id: feature.id, + tag: feature.tags.map(tag => tag.key + ': ' + tag.value).join(', ') + }, + geometry: { + type: "Point", + coordinates: [feature.lon, feature.lat] + } + } + } + ) + } + }, + layout: { + 'text-field': ['get', 'tag'], + 'text-line-height': 1, + 'text-padding': 0, + 'text-anchor': 'bottom', + 'text-offset': [0, -1], + 'text-allow-overlap': false, + 'text-font': ['Noto Sans Regular'], + 'text-size': { + stops: [[13, 9], [20, 18]] + } + }, + paint: { + 'text-translate-anchor': 'viewport', + 'text-color': '#662222', + 'text-halo-color': 'white', + 'text-halo-width': 1, + 'text-halo-blur': 0, + } + } + this.ngZone.runOutsideAngular( + () => { + this.map.addLayer(tagsLayer) + } + ) + } + + addLabelsLayers(layers: LayerNode[]) { + // XXX: taggedLayers in MapControlComponent behaves like an object + Object.values(layers).forEach( + labelsLayer => this.addLabelsLayer(labelsLayer) + ) + } + + addTagsLayers(taggedLayers: TaggedLayer[]) { + // XXX: taggedLayers in MapControlComponent behaves like an object + Object.values(taggedLayers).forEach( + taggedLayer => this.addTagsLayer(taggedLayer) + ) + } + + removeLabelsLayers() { + Object.keys(this.layerDefs).forEach( + layerId => this.removeLabelsLayer(layerId) + ) + } + + removeTaggedLayers() { + Object.keys(this.layerDefs).forEach( + layerId => this.removeTaggedLayer(layerId) + ) + } + + removeLabelsLayer(layerId: string) { + this.removeLayersByIds([layerId + '-labels']) + } + + removeTaggedLayer(layerId: string) { + this.removeLayersByIds([layerId + '-tags']) + } + + protected removeLayersByIds(layerIds: string[]) { + layerIds.forEach( + layerId => { + if (!!this.map.getLayer(layerId)) + this.map.removeLayer(layerId) + if (!!this.map.getSource(layerId)) + this.map.removeSource(layerId) + } + ) + } + + filterByStatus(status: string[], layer?: string, layerNode?: LayerNode) { + for (let layerName of layer ? [layer] : Object.keys(this.layers)) { + let layerNode = this.layerDefs[layerName] + if (!layerNode.custom && !layerNode.live) { + this.map.setFilter(layerName, ['in', 'status', ...status]) + } + } + } + + /* + toggleInfoDrawer(): void { + this.mapControlService.toggleInfo() + } + */ + + toggleControlDrawer(value?:boolean): void { + this.mapControlService.toggleControls(value) + } + + onClick(evt: MapMouseEvent): void { + if (!(evt.point && this.map)) { + return + } + let features = this.map.queryRenderedFeatures(evt.point, {layers:Object.keys(this.layers)}) + let feature = features[0] + if (feature) { + let layer = (this.layerDefs)[(feature).layer.id] + let store: string = layer.live && feature['properties']['store'] ? + feature['properties']['store'] : + layer.store + this.mapControlService.featureClicked.next( + new Feature(store, feature['properties']['id'] || feature.id) + ) + } + else { + this.mapControlService.featureClicked.next(undefined) + } + } + + onMove(evt: MapMouseEvent): void { + this.mouseLngLat.nativeElement.innerHTML = evt.lngLat.lng.toFixed(7) + ', ' + evt.lngLat.lat.toFixed(7) + } + + onLeave(evt: MapMouseEvent): void { + this.mouseLngLat.nativeElement.innerHTML = null + } + + onMoveOnLayer(evt: MapMouseEvent): void { + let feature = (evt).features[0] + var rfeature = this.map.queryRenderedFeatures(evt.point)[0] + if (rfeature.id !== this.popupOnFeature) { + this.popupOnFeature = rfeature.id + this.featureInfo.nativeElement.innerHTML = feature.properties.popup + } + } + + onEnter(evt: MapMouseEvent): void { + let feature = (evt).features[0] + this.popupOnFeature = feature.id + let info = feature.properties.popup + this.featureInfo.nativeElement.innerHTML = info + } + + onLeaveOnLayer(evt: MapMouseEvent): void { + this.popupOnFeature = null + this.featureInfo.nativeElement.innerHTML = null + } + + zoomToFeatures(features?): void { + // Zoom to the given features or all the visible ones + const fitBoundsOptions = { + padding: 40, + maxZoom: 17, + } + if (!features) { + // Zoom to visible features + // Collect all the features + features = [] + for (let layerName in this.layers) { + let filter = this.map.getFilter(layerName) + // Eventually re-fit with the filter + if (filter && filter[0]=='in' && filter[1]=='id') { + // NOTE: this.map.querySourceLayer works only for features in the viewport, so + // the source data is used + // Assuming that filter is in the form ['in', 'id', ...] + let ids = (filter).splice(2) + features.push(...this.layers[layerName].source.data.features.filter(f=>ids.indexOf(f.id)!=-1)) + } + else { + features.push(...this.layers[layerName].source.data.features) + } + } + } + + // XXX: bug in turf: https://github.com/Turfjs/turf/issues/1428 + let bb = bbox.default({ + type: 'FeatureCollection', + features: features + }) + if (!bb.some(b => b == Infinity)) { + this.map.fitBounds([[bb[0], bb[1]], [bb[2], bb[3]]], fitBoundsOptions) + } + } +} diff --git a/src/app/map/gisaf-mapbox/gisaf-ruler.directive.ts b/src/app/map/gisaf-mapbox/gisaf-ruler.directive.ts new file mode 100644 index 0000000..1440ec9 --- /dev/null +++ b/src/app/map/gisaf-mapbox/gisaf-ruler.directive.ts @@ -0,0 +1,283 @@ +import { ElementRef, Input, ViewChild, Directive, HostListener } from '@angular/core' + +import { Subscription } from 'rxjs' + +import { MatButton } from '@angular/material/button' + +import { Position } from 'geojson' +import distance from '@turf/distance' +import { Units } from '@turf/helpers' +//import { GeoJSONSource } from 'maplibre-gl' +import { MapService } from '@maplibre/ngx-maplibre-gl' +import { POINT_CONVERSION_HYBRID } from 'constants' + + +const LAYER_LINE = 'gisaf-ruler-line' +const LAYER_SYMBOL = 'gisaf-ruler-symbol' +const LAYER_DISTANCE = 'gisaf-ruler-dist' +const LAYER_MARKER = 'gisaf-ruler-marker' +const SOURCE_LINE = 'gisaf-ruler-line-source' +const SOURCE_SYMBOL = 'gisaf-ruler-symbol-source' + +@Directive({ + selector: '[gisafRuler]' +}) +export class GisafRulerDirective { + segments: Position[][] = [] + startingPoint: Position + labels: string[] + distances: number[] + // XXX: remove typings (maplibre 2.x) + //lineSource: GeoJSONSource + //symbolSource: GeoJSONSource + lineSource: any + symbolSource: any + active: boolean = false + @Input() color: string = '#4264fb' + @Input() units: Units = 'kilometers' + @Input() font: string[] = ['Noto Sans Regular'] + @Input() fontSize: number = 14 + @Input() markerSize: number = 3 + @Input() lineWidth: number = 1 + @Input() secondaryColor: string = 'white' + @Input() fontHalo: number = 2 + @ViewChild(MatButton) button: MatButton + clickSubscription: Subscription + lineDrawn: boolean + + constructor( + public elementRef: ElementRef, + private mapService: MapService + ) {} + + @HostListener('click') + onClick() { + this.active ? this.stop() : this.start() + } + + start() { + this.active = true + this.elementRef.nativeElement.classList.add('-active') + this.segments = [] + this.labels = [] + this.distances = [] + this.lineDrawn = false + this.startingPoint = undefined + this.addLayers() + this.mapService.mapCreated$.subscribe( + () => { + this.clickSubscription = this.mapService.mapEvents.mapClick.subscribe( + evt => this.onMapClick(evt) + ) + } + ) + } + + stop() { + this.active = false + this.elementRef.nativeElement.classList.remove('-active') + this.clickSubscription.unsubscribe() + this.removeLayers() + } + + /* + updateLabels() { + let sum = 0 + this.labels = this.segments.map((coordinate, index) => { + if (index === 0) return this.labelFormat(0) + sum += distance(this.segments[index - 1], coordinate, {units: this.units}) + return this.labelFormat(sum) + }) + } + */ + + /* + updateDistances() { + this.distances = [] + this.segments.map((coordinate, index) => { + if (index === 0) return + this.distances.push( + distance(this.segments[index - 1], coordinate, {units: this.units}) + ) + }) + } + */ + + labelFormat(n) { + return n == 0 ? '0' : n < 1 ? `${(n * 1000).toFixed(2)} m`: `${n.toFixed(3)} km` + } + + onMapClick(evt) { + const newCoordinate = [evt.lngLat.lng, evt.lngLat.lat] + + if (this.lineDrawn) { + if (evt.originalEvent.ctrlKey) { + this.segments.push([this.startingPoint, newCoordinate]) + } + else { + this.startingPoint = newCoordinate + this.lineDrawn = false + } + } + else { + if (this.startingPoint) { + this.segments.push([this.startingPoint, newCoordinate]) + this.lineDrawn = true + } + else { + this.startingPoint = newCoordinate + } + } + + //else { + // if (!this.startingPoint || this.multiLineMode) { + // this.startingPoint = newCoordinate + // } + // else { + // this.segments.push([this.startingPoint, newCoordinate]) + // this.startingPoint = undefined + // } + // this.multiLineMode = false + //} + + //this.updateLabels() + //this.updateDistances() + + this.lineSource.setData(this.getLineStringFeatures()) + this.symbolSource.setData(this.getPointFeatureCollection()) + } + + addLayers() { + const map = this.mapService.mapInstance + map.addSource(SOURCE_LINE, { + type: 'geojson', + data: this.getLineStringFeatures() + } + ) + + map.addSource(SOURCE_SYMBOL, { + type: 'geojson', + data: this.getPointFeatureCollection() + }) + + map.addLayer({ + id: LAYER_LINE, + type: 'line', + source: SOURCE_LINE, + paint: { + 'line-color': this.color, + 'line-width': this.lineWidth, + 'line-dasharray': [2, 2] + }, + }) + + /* + map.addLayer({ + id: LAYER_SYMBOL, + type: 'symbol', + source: SOURCE_SYMBOL, + layout: { + 'text-field': '{text}', + 'text-font': this.font, + 'text-anchor': 'top', + 'text-size': this.fontSize, + 'text-offset': [0, 0.8], + 'text-allow-overlap': true, + }, + paint: { + 'text-color': this.color, + //'text-halo-color': this.secondaryColor, + //'text-halo-width': this.fontHalo, + }, + }) + */ + + map.addLayer({ + id: LAYER_DISTANCE, + type: 'symbol', + source: SOURCE_LINE, + layout: { + 'text-field': ['get', 'dist'], + 'text-font': this.font, + //'text-anchor': 'top', + 'text-size': this.fontSize, + //'text-offset': [0, 0.8], + 'text-allow-overlap': true, + 'symbol-placement': 'line-center' + }, + paint: { + 'text-color': this.color, + 'text-halo-color': this.secondaryColor, + 'text-halo-width': this.fontHalo, + }, + }) + + map.addLayer({ + id: LAYER_MARKER, + type: 'circle', + source: SOURCE_SYMBOL, + paint: { + 'circle-radius': this.markerSize, + 'circle-color': this.color, + }, + }) + + //this.lineSource = map.getSource(SOURCE_LINE) + //this.symbolSource = map.getSource(SOURCE_SYMBOL) + this.lineSource = map.getSource(SOURCE_LINE) + this.symbolSource = map.getSource(SOURCE_SYMBOL) + } + + removeLayers() { + const map = this.mapService.mapInstance + map.removeLayer(LAYER_LINE) + //map.removeLayer(LAYER_SYMBOL) + map.removeLayer(LAYER_DISTANCE) + map.removeLayer(LAYER_MARKER) + map.removeSource(SOURCE_LINE) + map.removeSource(SOURCE_SYMBOL) + } + + getLineStringFeatures(): GeoJSON.FeatureCollection { + return { + type: 'FeatureCollection', + features: this.segments.map( + segment => ({ + type: 'Feature', + properties: { + dist: this.labelFormat(distance(segment[0], segment[1])) + }, + geometry: { + type: 'LineString', + coordinates: segment, + } + }) + ) + } + } + + getPointFeatureCollection(): GeoJSON.FeatureCollection { + let points: Position[] = [] + this.segments.forEach( + s => { + points.push(s[0], s[1]) + } + ) + if (!!this.startingPoint) { + points.push(this.startingPoint) + } + return { + type: 'FeatureCollection', + features: points.map( + p => ({ + type: 'Feature', + properties: {}, + geometry: { + type: 'Point', + coordinates: p, + } + }) + ) + } + } +} diff --git a/src/app/map/map-control.service.ts b/src/app/map/map-control.service.ts new file mode 100644 index 0000000..ed56233 --- /dev/null +++ b/src/app/map/map-control.service.ts @@ -0,0 +1,163 @@ +import { Injectable } from '@angular/core' +import { Subject, BehaviorSubject, forkJoin } from 'rxjs' + +import { ConfigService } from '../config.service' +import { LayerNode } from './models' +import { Store, BaseMap } from './map-data.service' +import { TaggedLayer, Feature, FeatureWithField } from '../info/info-data.service' + + +@Injectable({ + providedIn: 'root', +}) +export class MapControlService { + constructor( + public configService: ConfigService, + ){} + public selectedLayers: LayerNode[] = [] + + // Subjects + private _hasControls = new BehaviorSubject(true) + private _toggleInfo = new BehaviorSubject(false) + private _layerAdd = new Subject() + private _baseMapLayerAdd = new Subject() + private _layerRemove = new Subject() + private _baseMapLayerRemove = new Subject() + private _filter = new BehaviorSubject<[string, TaggedLayer[], string]>(['', [], '']) + private _zoomToFeatures = new Subject() + private _resize = new Subject() + + public baseStyleOpacity = new BehaviorSubject(1.0) + public baseStyleOpacitySlider = new Subject() + public featureClicked = new Subject() + public showFeature = new BehaviorSubject(undefined) + public selection = new BehaviorSubject({}) + public tempSelection = new BehaviorSubject({}) + public search = new Subject() + public baseMapLayers: BehaviorSubject> = new BehaviorSubject(new Set()) + public status = new BehaviorSubject(this.configService.conf.value.map['defaultStatus']) + public hasLabels = new BehaviorSubject(false) + public hasTags = new BehaviorSubject(false) + public layerLoaded = new Subject() + public baseStyleName = new BehaviorSubject(this.configService.conf.value.map['style']) + public addBaseMap = new Subject() + + public mapLoaded = new BehaviorSubject(false) + public layerTreeLoaded = new BehaviorSubject(false) + + // Trigger for layerTree to update my selectedLayers + public updateSelection = new Subject() + //private simplify = new Subject() + + // Observables + // FIXME: Comments!!! This messaging system between components is going to be messy otherwise... + hasControls$ = this._hasControls.asObservable() + toggleInfo$ = this._toggleInfo.asObservable() + baseStyleName$ = this.baseStyleName.asObservable() + baseStyleOpacity$ = this.baseStyleOpacity.asObservable() + baseStyleOpacitySlider$ = this.baseStyleOpacitySlider.asObservable() + baseMapLayers$ = this.baseMapLayers.asObservable() + layerAdd$ = this._layerAdd.asObservable() + layerAddById$ = this._baseMapLayerAdd.asObservable() + layerRemove$ = this._layerRemove.asObservable() + layerRemoveById$ = this._baseMapLayerRemove.asObservable() + layerLoaded$ = this.layerLoaded.asObservable() + filter$ = this._filter.asObservable() + search$ = this.search.asObservable() + zoomToFeatures$ = this._zoomToFeatures.asObservable() + resize$ = this._resize.asObservable() + status$ = this.status.asObservable() + hasLabels$ = this.hasLabels.asObservable() + hasTags$ = this.hasTags.asObservable() + featureClicked$ = this.featureClicked.asObservable() + showFeature$ = this.showFeature.asObservable() + selection$ = this.selection.asObservable() + updateSelection$ = this.updateSelection.asObservable() + tempSelection$ = this.tempSelection.asObservable() + addBaseMap$ = this.addBaseMap.asObservable() + //simplify$ = this.simplify.asObservable() + + // Events related to loading the map + mapLoaded$ = this.mapLoaded.asObservable() + layerTreeLoaded$ = this.layerTreeLoaded.asObservable() + mapReady$ = forkJoin([ + this.mapLoaded$, + this.layerTreeLoaded$, + ]) + + // Service commands + resize() { + this._resize.next(true) + } + + toggleControls(flag: boolean) { + if (flag === undefined) { + flag = !this._hasControls.getValue() + } + this._hasControls.next(flag) + this.resize() + } + + toggleInfo(flag?: boolean) { + if (flag === undefined) { + flag = !this._toggleInfo.getValue() + } + this._toggleInfo.next(flag) + } + + toggleLabels(flag?: boolean) { + if (flag === undefined) { + flag = !this.hasLabels.getValue() + } + this.hasLabels.next(flag) + } + + toggleTags(flag?: boolean) { + if (flag === undefined) { + flag = !this.hasTags.getValue() + } + this.hasTags.next(flag) + } + + addBaseMapLayers(baseMapLayers: Store[]) { + for (let item of baseMapLayers) { + this._baseMapLayerAdd.next(item) + } + } + + removeBaseMapLayers(baseMapLayers: Store[]) { + for (let item of baseMapLayers) { + this._baseMapLayerRemove.next(item) + } + } + + addBaseMapLayerById(layerId: Store) { + let values = this.baseMapLayers.getValue() + values.add(layerId) + this.baseMapLayers.next(values) + } + + addLayer(layerNode: LayerNode, simplify?: number) { + this._layerAdd.next(layerNode) + } + + removeLayer(layer: LayerNode) { + this._layerRemove.next(layer) + } + + filter(searchText: string, taggedLayers?: TaggedLayer[], taggedFeatureText?: string) { + this._filter.next([searchText, taggedLayers, taggedFeatureText]) + } + + zoomToFeatures() { + this._zoomToFeatures.next(true) + } + + selectFeatures(features: Object) { + this.selection.next(features) + } + + selectFeaturesTemp(features: Object) { + this.tempSelection.next(features) + } +} diff --git a/src/app/map/map-data.service.ts b/src/app/map/map-data.service.ts new file mode 100644 index 0000000..bc32bc2 --- /dev/null +++ b/src/app/map/map-data.service.ts @@ -0,0 +1,349 @@ +import { Injectable } from '@angular/core' +import { Observable, forkJoin, BehaviorSubject } from 'rxjs' +import { map } from 'rxjs/operators' + +import { Apollo, gql } from 'apollo-angular' + +import { StyleSpecification } from 'maplibre-gl' + +import { TreeData, PrimaryGroupNode, LayerNode } from './models' +import { MapControlService } from './map-control.service' +import { MapService, MapInitData } from '../openapi' + +// XXX: unused +const baseStyleListQuery = gql` +query base_style_list { + base_style_list { + name + } +} +` + +const baseStyleQuery = gql` +query base_style( + $name: String! +) { + base_style(name: $name) { + name + style +} +} +` + +const baseMapQuery = gql` +query baseMap { + baseMap { + name + stores { + name + } + } +} +` + +const createBaseMapQuery = gql` +mutation createBaseMap( + $baseMapName: String! + $stores: [String]! +) { + createBaseMap( + baseMapName: $baseMapName, + stores: $stores, + ) { + baseMap { + name + stores { + name + } + } + } +} +` + +const geomGroupQuery = gql` +query geomGroup { + geomGroup { + name + title + description + } +} +` + +const storeQuery = gql` +query stores { + stores { + name + store + rawSurveyStore + style + zIndex + count + type + gisType + description + custom + group + icon + symbol + live + tagPlugins + viewableRole + } +} +` + +const mapInitDataQuery = gql` +query mapInitData { + mapInitData { + baseMaps { + name + stores { + name + } + } + baseStyles { + name + } + groups { + name + title + description + } + stores { + name + store + rawSurveyStore + style + zIndex + count + type + gisType + description + custom + group + icon + symbol + live + tagPlugins + viewableRole + } + } +} +` + +const gisTypeSymbolMap = { + Point: '\ue32b', + Line: '\ue32c', + Polygon: '\ue32d', +} + +export class BaseStyle { + constructor( + public name: string, + public style?: StyleSpecification, + ) {} +} + +export class Store { + constructor( + public name: string, + ) {} +} + +export class BaseMap { + constructor( + public name: string, + public stores: Store[], + ) {} + + pprint() { + return this.stores.map(store => store.name).join(', ') + } +} + +// export class MapInitData { +// constructor( +// public baseStyles: BaseStyle[] = [], +// public baseMaps: BaseMap[] = [], +// public groups: PrimaryGroupNode[] = [], +// public stores: LayerNode[] = [], +// ) {} +// } + +@Injectable() +export class MapDataService { + constructor( + // private apollo: Apollo, + protected mapControlService: MapControlService, + public mapService: MapService, + ) { + // Get the data on init, as it is (most probably) immutable + this.getMapInitData().subscribe( + data => { + this.mapInitDataLoaded.next(true) + this.mapInitDataLoaded.complete() + } + ) + } + + public mapInitDataLoaded = new BehaviorSubject(false) + mapInitDataLoaded$ = this.mapInitDataLoaded.asObservable() + + mapInitData: MapInitData + + getMapInitData(): Observable { + return this.mapService.getInitDataApiMapInitDataGet().pipe(map( + data => this.mapInitData = data + )) + // return this.apollo.query({ + // query: mapInitDataQuery, + // ).pipe(map( + // mid => { + // this.mapInitData = mid + // const baseMaps = mid.baseMaps.map( + // bm => new BaseMap( + // bm.name, + // bm.stores.map( + // (store: object) => new Store(store['name']) + // ) + // ) + // ) + // const baseStyles = mid.baseStyles.map( + // baseStyle => new BaseStyle(baseStyle.name) + // ) + // const groups = mid.groups.map( + // gg => new PrimaryGroupNode( + // gg.name, + // gg.title, + // gg.description + // ) + // ) + // const stores = mid.stores.map( + // layer => new LayerNode( + // layer['name'], + // layer['group'], + // layer['icon'], + // layer['symbol'] || gisTypeSymbolMap[layer['gisType']], + // layer['store'], + // layer['rawSurveyStore'], + // layer['type'], + // layer['gisType'], + // layer.style, + // layer['zIndex'], + // layer['count'], + // layer['description'], + // layer['live'], + // layer['custom'], + // layer['tagPlugins'], + // layer['viewableRole'] + // ) + // ) + // return new MapInitData( + // baseStyles, + // baseMaps, + // groups, + // stores, + // ) + // } + // )) + } + + // getBaseMaps(): Observable { + // return this.apollo.query({ + // query: baseMapQuery, + // }).pipe(map( + // res => { + // let bms: object = res['data']['baseMap'] + // return bms['map']( + // (bm: object) => new BaseMap( + // bm['name'], + // bm['stores'].map( + // (store: object) => new Store(store['name']) + // ) + // ) + // ) + // } + // )) + // } + + public createBaseMap(baseMapName: string, stores: string[]): Observable { + return this.apollo.mutate({ + mutation: createBaseMapQuery, + variables: { + baseMapName: baseMapName, + stores: stores + } + }).pipe(map( + res => { + let bm: object = res['data']['createBaseMap']['baseMap'] + return new BaseMap( + bm['name'], + bm['stores'].map((store: object) => new Store(store['name'])) + ) + } + )) + } + + // XXX: unused + // getBaseStyleList(): Observable { + // return this.apollo.query({query: baseStyleListQuery}).pipe(map( + // data => data['data']['base_style_list'].map( + // (baseStyle: string) => new BaseStyle(baseStyle['name']) + // ) + // )) + // } + + getBaseStyle(styleName: string): Observable { + return this.apollo.query({ + query: baseStyleQuery, + variables: { + name: styleName + } + }).pipe(map( + data => new BaseStyle(data['data']['base_style']['name'], + JSON.parse(data['data']['base_style']['style'])) + )) + } + + // getStores(): Observable { + // return this.apollo.query({ + // query: storeQuery, + // }).pipe(map( + // res => res['data']['stores'].map( + // (layer: Object) => new LayerNode( + // layer['name'], + // layer['group'], + // layer['icon'], + // layer['symbol'] || gisTypeSymbolMap[layer['gisType']], + // layer['store'], + // layer['rawSurveyStore'], + // layer['type'], + // layer['gisType'], + // layer['style'], + // layer['zIndex'], + // layer['count'], + // layer['description'], + // layer['live'], + // layer['custom'], + // layer['tagPlugins'], + // layer['viewableRole'] + // ) + // ) + // )) + // } + + // getPrimaryGroups(): Observable { + // return this.apollo.query({ + // query: geomGroupQuery, + // }).pipe(map( + // res => res['data']['geomGroup'] && res['data']['geomGroup'].map( + // (gg: Object) => new PrimaryGroupNode( + // gg['name'], + // gg['title'], + // gg['description'] + // ) + // ) + // )) + // } +} \ No newline at end of file diff --git a/src/app/map/map-routing.module.ts b/src/app/map/map-routing.module.ts new file mode 100644 index 0000000..9c000f0 --- /dev/null +++ b/src/app/map/map-routing.module.ts @@ -0,0 +1,40 @@ +import { NgModule } from '@angular/core' +import { Routes, RouterModule } from '@angular/router' + +import { MapComponent } from './map.component' +import { BaseMapComponent } from './base-map/base-map.component' +import { TreeLayerComponent } from './tree-layer/tree-layer.component' + +const routes: Routes = [ + { + path: '', + component: MapComponent, + children: [ + { + path: 'info', + loadChildren: () => import('../info/info.module').then(m => m.InfoModule), + }, + { + path: ':baseMap', + outlet: 'baseMap', + component: BaseMapComponent, + }, + { + path: '', + component: BaseMapComponent, + outlet: 'baseMap', + }, + { + path: '', + component: TreeLayerComponent, + outlet: 'treeLayer', + }, + ], + } +] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MapRoutingModule { } \ No newline at end of file diff --git a/src/app/map/map.component.html b/src/app/map/map.component.html new file mode 100644 index 0000000..43b844b --- /dev/null +++ b/src/app/map/map.component.html @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/app/map/map.component.scss b/src/app/map/map.component.scss new file mode 100644 index 0000000..eea1949 --- /dev/null +++ b/src/app/map/map.component.scss @@ -0,0 +1,43 @@ +:host { + width: 100%; + height: 100%; + display: block; + .mat-drawer-container { + width: 100%; + height: 100%; + } +} + +#controlsDrawer { + width: 15.5em; +} + +#controlsDrawer>.mat-drawer-inner-container { + overflow-x: hidden ! important; +} + +#controlsDrawer .mat-mdc-slide-toggle { + padding-bottom: 1em; +} + +.param .mat-form-field { + width: 10em; +} + +.param .mat-mdc-slider { + width: 10em; +} + +map-controls mat-checkbox { + display: block; +} + +map .red { + color: red +} + +@media print { + nav { + display: none; + } +} diff --git a/src/app/map/map.component.spec.ts b/src/app/map/map.component.spec.ts new file mode 100644 index 0000000..d250c3f --- /dev/null +++ b/src/app/map/map.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { MapComponent } from './map.component'; + +describe('MapComponent', () => { + let component: MapComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ MapComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MapComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/map/map.component.ts b/src/app/map/map.component.ts new file mode 100644 index 0000000..0f66a32 --- /dev/null +++ b/src/app/map/map.component.ts @@ -0,0 +1,48 @@ +import { Component, ViewChild, OnInit, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' +import { ActivatedRoute } from '@angular/router' + +import { InfoComponent } from '../info/info.component' +import { GisafMapboxComponent } from './gisaf-mapbox/gisaf-mapbox.component' +import { MapControlService } from './map-control.service' +import { MapDataService } from './map-data.service' + + +@Component({ + selector: 'gisaf-map', + templateUrl: './map.component.html', + styleUrls: ['./map.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [ + MapControlService, + MapDataService, + ], +}) +export class MapComponent implements OnInit { + @ViewChild('controlsDrawer', { static: true }) controlsDrawer: any + @ViewChild(InfoComponent, { static: true }) infoComponent: InfoComponent + @ViewChild(GisafMapboxComponent, { static: true }) mapComponent: GisafMapboxComponent + + constructor( + public mapControlService: MapControlService, + public mapDataService: MapDataService, + private cdr: ChangeDetectorRef, + private activatedRoute: ActivatedRoute + ) {} + + ngOnInit() { + this.activatedRoute.data.subscribe( + (config) => { + console.log(config) + } + ) + this.mapControlService.hasControls$.subscribe( + flag => { + this.controlsDrawer.toggle(flag).then( + res => this.mapControlService.resize() + ) + this.cdr.markForCheck() + } + ) + } +} diff --git a/src/app/map/map.module.ts b/src/app/map/map.module.ts new file mode 100644 index 0000000..9c4eba0 --- /dev/null +++ b/src/app/map/map.module.ts @@ -0,0 +1,106 @@ +import { NgModule } from '@angular/core' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { CommonModule } from '@angular/common' + +import { CdkTreeModule } from '@angular/cdk/tree' +import { ClipboardModule } from '@angular/cdk/clipboard' + +import { MatButtonModule } from '@angular/material/button' +import { MatCardModule } from '@angular/material/card' +import { MatCheckboxModule } from '@angular/material/checkbox' +import { MatChipsModule } from '@angular/material/chips' +import { MatDialogModule } from '@angular/material/dialog' +import { MatDividerModule } from '@angular/material/divider' +import { MatExpansionModule } from '@angular/material/expansion' +import { MatFormFieldModule } from '@angular/material/form-field' +import { MatIconModule } from '@angular/material/icon' +import { MatInputModule } from '@angular/material/input' +import { MatMenuModule } from '@angular/material/menu' +import { MatProgressBarModule } from '@angular/material/progress-bar' +import { MatSelectModule } from '@angular/material/select' +import { MatSidenavModule } from '@angular/material/sidenav' +import { MatSlideToggleModule } from '@angular/material/slide-toggle' +import { MatSliderModule } from '@angular/material/slider' +import { MatSnackBarModule } from '@angular/material/snack-bar' +import { MatTreeModule } from '@angular/material/tree' +import { MatTooltipModule } from '@angular/material/tooltip' + +import { FlexLayoutModule } from 'ngx-flexible-layout' + +import { NgxMapLibreGLModule } from '@maplibre/ngx-maplibre-gl' + +import { PipesModule } from '../pipes.module' + +import { InfoModule } from '../info/info.module' +import { DataService } from '../_services/data.service' +import { WebsocketService } from '../_services/websocket.service' + +import { MapComponent } from './map.component' +import { BaseMapComponent } from './base-map/base-map.component' +import { GisafMapboxComponent } from './gisaf-mapbox/gisaf-mapbox.component' +import { MapControlsComponent } from './controls/map-controls.component' +import { TreeLayerComponent } from './tree-layer/tree-layer.component' +import { TreeLayerItemComponent } from './tree-layer-item/tree-layer-item.component' + +import { MapRoutingModule } from './map-routing.module' +import { CreateBaseMapDialogComponent } from './controls/create-base-map-dialog' +import { GisafControlComponent } from './gisaf-mapbox/gisaf-control.component' +import { GisafRulerDirective } from './gisaf-mapbox/gisaf-ruler.directive' + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + + CdkTreeModule, + ClipboardModule, + + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatChipsModule, + MatDialogModule, + MatDividerModule, + MatExpansionModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatMenuModule, + MatProgressBarModule, + MatSelectModule, + MatSidenavModule, + MatSlideToggleModule, + MatSliderModule, + MatSnackBarModule, + MatTreeModule, + MatTooltipModule, + + FlexLayoutModule, + + PipesModule, + + NgxMapLibreGLModule, + + InfoModule, + + MapRoutingModule, + ], + declarations: [ + BaseMapComponent, + CreateBaseMapDialogComponent, + GisafMapboxComponent, + GisafControlComponent, + GisafRulerDirective, + MapComponent, + MapControlsComponent, + TreeLayerComponent, + TreeLayerItemComponent, + ], + providers: [ + DataService, + WebsocketService, + ], +}) + +export class MapModule {} diff --git a/src/app/map/models.ts b/src/app/map/models.ts new file mode 100644 index 0000000..1c8cca1 --- /dev/null +++ b/src/app/map/models.ts @@ -0,0 +1,101 @@ +import { Subscription } from 'rxjs' + +export class Node { + isExpandable: boolean = true + icon: string + symbol: string + store: string + gisType: string = '' + count: Number = 0 + tagPlugins: string[] = [] + // XXX: treeElement might be a list of TreeLayerItemComponent + // XXX: circular dependency? + treeElement: any //TreeLayerItemComponent + + constructor ( + public name: string, + public title: string = '', + public description: string = '', + public children: Node[] = [] + ) {} + + hasChildren() { + return true + } + isSelectable() { + return true + } +} + +export class PrimaryGroupNode extends Node { + isSelectable() { + return false + } + + downloadGpkg() { + window.open('/download/layers/gpkg/' + this.children.map(child => child.store).join(',')) + } +} + +export class LayerNode extends Node { + isExpandable: boolean = false + data: any + hasPopups: boolean = false + mapSubscription: Subscription + + constructor( + public name: string, + public group: string, + public icon: string, + public symbol: string, + public store: string, + public rawSurveyStore: string, + public type: string, + public gisType: string, + public style: object, + public zIndex: Number, + public count: Number = 0, + public description: string = '', + public live: boolean = false, + public custom: boolean = false, + public tagPlugins: string[] = [], + public viewableRole: string, + ) { + super(name) + } + + getUrl() { + return 'gj/'+this.store + } + + hasChildren() { + return false + } + + downloadShapefile() { + window.open('/download/shapefile/' + this.store) + } + + downloadGpkg() { + window.open('/download/layers/gpkg/' + this.store) + } + + downloadDXF(reproject: Boolean=false) { + window.open('/download/layers/dxf/' + this.store + '?reproject=' + reproject) + } + + downloadRawData() { + window.open('/download/rawdata/' + this.rawSurveyStore) + } + + cancelDownload() { + this.mapSubscription.unsubscribe() + } +} + +export class TreeData { + constructor ( + public primaryGroups: PrimaryGroupNode[], + public layerNodes: LayerNode[] + ) {} +} \ No newline at end of file diff --git a/src/app/map/tree-layer-item/tree-layer-item.component.html b/src/app/map/tree-layer-item/tree-layer-item.component.html new file mode 100644 index 0000000..024b58d --- /dev/null +++ b/src/app/map/tree-layer-item/tree-layer-item.component.html @@ -0,0 +1,33 @@ +
    + +
    +
    +
    {{node.title || node.name}}
    +
    +
    + + +
    + + {{ node.title || node.name }} + + + more_vert + +
    +
    \ No newline at end of file diff --git a/src/app/map/tree-layer-item/tree-layer-item.component.scss b/src/app/map/tree-layer-item/tree-layer-item.component.scss new file mode 100644 index 0000000..66ec70b --- /dev/null +++ b/src/app/map/tree-layer-item/tree-layer-item.component.scss @@ -0,0 +1,47 @@ +:host { + width: 100%; +} + +.layer .mat-mdc-checkbox { + height: 1.6em; +} + +:host::ng-deep.mdc-form-field { + height: inherit; + >label { + white-space: nowrap; + display: flex; + padding-left: 0; + } +} + +:host::ng-deep.mat-mdc-checkbox-touch-target { + height: inherit; +} + +.layer-group>span{ + padding-top: 0.5em; + height: 1.5em; + cursor: pointer; + font-weight: 900; + font-size: 112%; +} + +.mat-mdc-checkbox::ng-deep .gisaf-intext { + width: 0.7em; + font-size: 220%; + vertical-align: top; +} + +.hasPlugins { + color: inherit; +} + +.group-menu { + width: inherit; + font-size: inherit; +} + +.mat-icon { + height: initial; +} \ No newline at end of file diff --git a/src/app/map/tree-layer-item/tree-layer-item.component.ts b/src/app/map/tree-layer-item/tree-layer-item.component.ts new file mode 100644 index 0000000..786ce2d --- /dev/null +++ b/src/app/map/tree-layer-item/tree-layer-item.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit, Input, Output, EventEmitter, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' + +import { AuthenticationService } from '../../_services/authentication.service' +import { Node, LayerNode } from '../models' +import { MapControlService } from '../map-control.service' + +@Component({ + selector: 'gisaf-tree-layer-item', + templateUrl: './tree-layer-item.component.html', + styleUrls: ['./tree-layer-item.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush +}) +export class TreeLayerItemComponent implements OnInit { + @Input() node: LayerNode | Node + @Input() checked: boolean = false + @Input() layerNodeMenu: any + @Input() layerGroupNodeMenu: any + @Output() layerItemSelectionToggle: EventEmitter = new EventEmitter() + @Output() toggleNode: EventEmitter = new EventEmitter() + indeterminate = false + + constructor( + protected mapControlService: MapControlService, + private cdr: ChangeDetectorRef, + private authenticationService: AuthenticationService, + ) {} + + ngOnInit() { + this.node.treeElement = this + if (this.checked) { + //this.showLayer.emit(this) + // XXX: is it right? + this.mapControlService.addLayer(this.node) + } + } + + isHidden(): boolean { + let node = this.node + if (!node.viewableRole) { + return false + } + else { + return !this.authenticationService.isAuthorized([node.viewableRole]) + } + } + + toggleLayer(event): void { + this.layerItemSelectionToggle.emit(this.node) + if (this.node instanceof LayerNode) { + this.mapControlService.updateSelection.next(true) + if (event.checked) { + this.indeterminate = true + this.mapControlService.addLayer(this.node) + } + else { + this.mapControlService.removeLayer(this.node) + } + } + } +} diff --git a/src/app/map/tree-layer/tree-layer.component.css b/src/app/map/tree-layer/tree-layer.component.css new file mode 100644 index 0000000..f31dbee --- /dev/null +++ b/src/app/map/tree-layer/tree-layer.component.css @@ -0,0 +1,31 @@ +.mat-tree-node { + padding: 0; + min-height: inherit; +} + +.mat-mdc-icon-button { + height: 1em; + width: 1em; + line-height: inherit; +} + +.mat-mdc-icon-button.mat-mdc-button-base { + padding: 0; +} + +::ng-deep.mat-mdc-icon-button .mat-mdc-button-touch-target { + height: inherit; + width: inherit; +} + +.map-tree-node-nested { + padding-left: 0; +} + +.map-invisible { + display: none; +} + +.loadingIndicator { + padding: 0.5em; +} \ No newline at end of file diff --git a/src/app/map/tree-layer/tree-layer.component.html b/src/app/map/tree-layer/tree-layer.component.html new file mode 100644 index 0000000..fe0d143 --- /dev/null +++ b/src/app/map/tree-layer/tree-layer.component.html @@ -0,0 +1,83 @@ +
    + Layers +
    + +
    + +
    + + + +
    + + + +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + diff --git a/src/app/map/tree-layer/tree-layer.component.ts b/src/app/map/tree-layer/tree-layer.component.ts new file mode 100644 index 0000000..7150fc4 --- /dev/null +++ b/src/app/map/tree-layer/tree-layer.component.ts @@ -0,0 +1,279 @@ +import { Component, OnInit, ChangeDetectorRef, ChangeDetectionStrategy, + Output, EventEmitter } from '@angular/core' +import { Injectable } from '@angular/core' +import { ActivatedRoute, Params, Router } from '@angular/router' + +import { SelectionModel } from '@angular/cdk/collections' +import { NestedTreeControl } from '@angular/cdk/tree' +import { MatTreeNestedDataSource } from '@angular/material/tree' +import { MatSnackBar } from '@angular/material/snack-bar' + +import { BehaviorSubject, Observable, of as observableOf } from 'rxjs' + +import { ConfigService } from '../../config.service' +import { Node, PrimaryGroupNode, LayerNode, TreeData } from '../models' +import { MapControlService } from '../map-control.service' +import { MapDataService, Store } from '../map-data.service' +import { Feature, FeatureWithField } from '../../info/info-data.service' + + +@Injectable() +export class LayerDatabase { + dataChange: BehaviorSubject = new BehaviorSubject([]) + + setData(data: PrimaryGroupNode[]) { + // Notify the change. + this.dataChange.next(data) + } + + getLayers(group: Node): Node[] { + //return this.dataChange.getValue().find(l => l.name == group).children + return [] + } +} + +@Component({ + selector: 'gisaf-tree-layer', + templateUrl: './tree-layer.component.html', + styleUrls: ['./tree-layer.component.css'], + providers: [LayerDatabase], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TreeLayerComponent implements OnInit { + treeControl: NestedTreeControl + checklistSelection = new SelectionModel(true /* multiple */) + nestedDataSource: MatTreeNestedDataSource + @Output() showLayer: EventEmitter = new EventEmitter() + @Output() hideLayer: EventEmitter = new EventEmitter() + loading = true + error = false + data$: any // XXX: should be Observable, but ts compile error + + constructor( + public configService: ConfigService, + protected route: ActivatedRoute, + protected router: Router, + private database: LayerDatabase, + protected mapControlService: MapControlService, + public mapDataService: MapDataService, + public snackBar: MatSnackBar, + private cdr: ChangeDetectorRef, + ) { + this.treeControl = new NestedTreeControl(this.getChildren) + this.treeControl.isExpandable = (node => false) + this.nestedDataSource = new MatTreeNestedDataSource() + database.dataChange.subscribe(data => { + this.nestedDataSource.data = data + }) + } + + ngOnInit() { + this.route.queryParams.subscribe((params: Params) => { + if ('stores' in params) { + let stores = params['stores'].split(',') + for (let store in stores) { + this.mapControlService.addBaseMapLayerById(new Store(store)) + } + } + }) + + this.mapControlService.layerAddById$.subscribe( + (store: Store) => { + let layerNode = this._getNodeByStore(store) + if (!layerNode) { + console.log('No such layer, cannot add it', store) + return + } + this.checklistSelection.select(layerNode) + this.mapControlService.addLayer(layerNode) + this.cdr.markForCheck() + } + ) + + this.mapControlService.updateSelection$.subscribe( + _ => { + this.mapControlService.selectedLayers = this.checklistSelection.selected + } + ) + + this.mapControlService.layerRemoveById$.subscribe( + (store: Store) => { + let layerNode = this._getNodeByStore(store) + if (!layerNode) { + console.log('No such layer, cannot remove it', store) + return + } + this.checklistSelection.deselect(layerNode) + this.mapControlService.removeLayer(layerNode.treeElement.node) + this.cdr.markForCheck() + // Bug in checklistSelection? Need to unset checked manually: + layerNode.treeElement.checked = false + layerNode.treeElement.cdr.markForCheck() + } + ) + this.mapControlService.showFeature$.subscribe( + (feature: FeatureWithField) => { + if (!feature) { + return + } + let layerNode: LayerNode = this._getNodeByStore(new Store(feature.store)) + if (!layerNode) { + this.snackBar.open('Unknown layer ' + feature.store, 'OK', { + duration: 3000 + }) + return + } + this.checklistSelection.select(layerNode) + this.mapControlService.addLayer(layerNode) + this.cdr.markForCheck() + } + ) + + this.mapDataService.mapInitDataLoaded$.subscribe( + _ => { + _ && this.makeData() + } + ) + + // XXX: code snippets: + // Get names of selected layers: this.checklistSelection.selected.map(s => s.name) + } + + protected makeData(): void { + // Recompose the hierarchical data + + // Build a mapping object for faster assignment + // XXX: Typescript doesn't provide Object.fromEntries, otherwise it should be: + //let pgs = Object.fromEntries(treeData.primaryGroups.map(pg=>[pg.name, pg])) + let pgs = {} + + this.mapDataService.mapInitData.groups.forEach( + pg => pgs[pg.name] = pg + ) + + this.mapDataService.mapInitData.stores.forEach( + node => { + let group: PrimaryGroupNode = pgs[node.group] + if (!group) { + console.warn('No group (' + node.group + ') for layer node ' + node.store) + return + } + group.children.push(node) + } + ) + this.database.setData(this.mapDataService.mapInitData.groups) + this.loading = false + this.mapControlService.layerTreeLoaded.complete() + this.cdr.markForCheck() + } + + protected _getNodeByStore(store: Store): LayerNode { + // Get the LayerNode with the store + // Assumes that the tree's depth is 2 + return (this.nestedDataSource.data.map( + pg => pg.children.find(node => node.store==store.name + )).find(node => !!node)) + } + + /* + protected _getNodeById(store: Store): LayerNode { + console.log('FIXME: _getNodeById', store) + return new LayerNode() + const group = this.nestedDataSource.data.find(l => l.name == layer.group) + const descendents = this.treeControl.getDescendants(group) + const layerNode = descendents.find(l => l.name == layer.name) + return layerNode + } + */ + + isNodeActive(node): boolean { + // Used in the initialization, from the route - otherwise, + // the status of the checkbox is managed by Angular + // FIXME: LayerNode in the activeLayerIds don't have group set + // This should be: + //return !!this.activeLayerIds.find(l=>l.group == node.group && l.name == node.name) + /* + if (!!this.activeLayerIds.find(l=>l.name == node.name)) { + console.log(node) + } + return !!this.activeLayerIds.find(l=>l.name == node.name) + */ + return false + } + + getChildren = (node: Node): Observable => { + if (node.hasChildren()) { + if ((node.children).length > 0) { + // Already loaded: always the case with proper graphql query + return observableOf(node.children) + } + else { + // Dynamically load, unused with proper graphql query + return observableOf(this.database.getLayers(node).map( + children => { + //node.children.next(children) + return children + } + )) + } + } + else { + return observableOf([]) + } + } + + downloadLayer(node: LayerNode): void { + node.downloadShapefile() + } + + downloadDXF(node: LayerNode, reproject: Boolean=false): void { + node.downloadDXF(reproject) + } + + downloadGpkg(node: LayerNode) { + node.downloadGpkg() + } + + downloadRawData(node: LayerNode): void { + node.downloadRawData() + } + + /** Whether all the descendants of the node are selected */ + descendantsAllSelected(node: Node): boolean { + const descendants = this.treeControl.getDescendants(node) + if (!descendants.length) { + return this.checklistSelection.isSelected(node) + } + const selected = this.checklistSelection.isSelected(node) + const allSelected = descendants.every(child => this.checklistSelection.isSelected(child)) + if (!selected && allSelected) { + this.checklistSelection.select(node) + this.cdr.markForCheck() + } + return allSelected + } + + /** Whether part of the descendants are selected */ + descendantsPartiallySelected(node: Node): boolean { + const descendants = this.treeControl.getDescendants(node) + if (!descendants.length) { + return false + } + const result = descendants.some(child => this.checklistSelection.isSelected(child)) + return result && !this.descendantsAllSelected(node) + } + + /** Toggle the to-do item selection. Select/deselect all the descendants node */ + layerItemSelectionToggle(node: Node): void { + this.checklistSelection.toggle(node) + const descendants = this.treeControl.getDescendants(node) + this.checklistSelection.isSelected(node) + ? this.checklistSelection.select(...descendants, node) + : this.checklistSelection.deselect(...descendants, node) + this.cdr.markForCheck() + } + + goToAdmin(node: LayerNode) { + this.router.navigate(['/admin', node.name]) + } +} diff --git a/src/app/measures/measures-list/measures-home.component.ts b/src/app/measures/measures-list/measures-home.component.ts new file mode 100644 index 0000000..c058e11 --- /dev/null +++ b/src/app/measures/measures-list/measures-home.component.ts @@ -0,0 +1,20 @@ +import { Component, OnInit, ViewChild, ElementRef } from '@angular/core' +import { ActivatedRoute, Router, ParamMap } from '@angular/router' +import { ConfigService } from '../../config.service' + +@Component({ + selector: 'gisaf-measures-home', + template: '

    Select a data store

    ', +}) +export class MeasuresHomeComponent implements OnInit { + constructor( + public configService: ConfigService, + private router: Router + ) {} + ngOnInit() { + const defaultStore = this.configService.conf['measures']['defaultStore'] + if (defaultStore) { + this.router.navigate(['/measures', defaultStore]) + } + } +} \ No newline at end of file diff --git a/src/app/measures/measures-list/measures-list-resolver.service.ts b/src/app/measures/measures-list/measures-list-resolver.service.ts new file mode 100644 index 0000000..17ff3b6 --- /dev/null +++ b/src/app/measures/measures-list/measures-list-resolver.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core' +import { Router, Resolve, RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' +import { Observable, of, EMPTY, forkJoin } from 'rxjs' +import { map, mergeMap, take, first } from 'rxjs/operators' + +import { DataService, MeasuresItem } from '../../_services/data.service' + +@Injectable() +export class MeasuresListResolver implements Resolve { + constructor( + protected dataService: DataService, + private router: Router + ) {} + + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.dataService.getList(route.paramMap.get('store')) + } +} diff --git a/src/app/measures/measures-list/measures-list.component.html b/src/app/measures/measures-list/measures-list.component.html new file mode 100644 index 0000000..970e0a7 --- /dev/null +++ b/src/app/measures/measures-list/measures-list.component.html @@ -0,0 +1,24 @@ +
    +
    + + Pick one {{ store }} + + + + + + {{ item.name }} + + +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/app/measures/measures-list/measures-list.component.scss b/src/app/measures/measures-list/measures-list.component.scss new file mode 100644 index 0000000..4a42296 --- /dev/null +++ b/src/app/measures/measures-list/measures-list.component.scss @@ -0,0 +1,3 @@ +.mat-mdc-form-field { + width: 100%; +} \ No newline at end of file diff --git a/src/app/measures/measures-list/measures-list.component.ts b/src/app/measures/measures-list/measures-list.component.ts new file mode 100644 index 0000000..26a2c20 --- /dev/null +++ b/src/app/measures/measures-list/measures-list.component.ts @@ -0,0 +1,177 @@ +import { Component, OnInit, ViewChild, ElementRef } from '@angular/core' +import { UntypedFormControl } from '@angular/forms' +import { ActivatedRoute, Router, ParamMap } from '@angular/router' + +import { Observable, of } from 'rxjs' +import { map, startWith, switchMap } from 'rxjs/operators' + +import { MeasuresItem, DataService } from '../../_services/data.service' +import { ConfigService } from '../../config.service' + +@Component({ + selector: 'gisaf-measures-list', + templateUrl: './measures-list.component.html', + styleUrls: ['./measures-list.component.scss'], +}) +export class MeasuresListComponent implements OnInit { + @ViewChild('ipt', { static: true }) ipt: ElementRef + //routerItems: Object[] = [] + measuresItems: MeasuresItem[] = [] + + id: string + store: string // = conf['measures']['defaultStore'] + + filteredOptions: Observable + myControl: UntypedFormControl = new UntypedFormControl() + + constructor( + public configService: ConfigService, + private dataService: DataService, + private route: ActivatedRoute, + private router: Router, + ) {} + + ngOnInit() { + this.route.paramMap.pipe( + switchMap( + (params: ParamMap) => { + let store = params.get('store') + if (store) { + this.store = store + return this.dataService.getList(store) + } + else { + this.router.navigate(['/measures', this.configService.conf['measures']['defaultStore']]) + return of([]) + } + } + ) + ).subscribe({ + next: measuresItems => { + this.measuresItems = measuresItems + // Refresh the dropdown + this.myControl.reset() + }, + error: err => { + console.log(err) + } + }) + + this.filteredOptions = this.myControl.valueChanges.pipe( + startWith(''), + //map(val => this.filter(val)), + map( + measuresItem => { + if (measuresItem) { + if (typeof measuresItem === 'object') { + this.navigate(measuresItem['id']) + return measuresItem['name'] + } + return measuresItem + } + } + ), + map( + name => { + if (!name || this.measuresItems.filter(ri => ri.name === name).length) { + return this.measuresItems.slice() + } + if (typeof name === 'string') { + return this.filter(name) + } + } + ) + ) + } + //this.id = params['id'] + +/* + this.dataService.getList(this.store).subscribe( + data => { + this.routerItems = data.map(item => { + let id = item['$uri'].substr(item['$uri'].lastIndexOf('/') + 1) + return { name: item['caption'] || id, id: id } + }) + if (this.id) { + let name_list = this.routerItems.filter(i => i['id'] === this.id) + if (name_list.length === 1) { + var name: any = name_list[0] + } + else { + var name: any = { name: '' } + } + //let name = name_list.length === 1 : name_list[0]['name'] ? '' + this.myControl.setValue(name) + } + this.filteredOptions = this.myControl.valueChanges.pipe( + startWith(''), + //map(val => this.filter(val)), + map( + typeId => { + if (typeId) { + if (typeof typeId === 'object') { + this.navigate(typeId['id']) + return typeId['name'] + } + return typeId + } + } + ), + map( + name => { + if (!name || this.routerItems.filter(ri => ri['name'] === name).length) { + return this.routerItems.slice() + } + if (typeof name === 'string') { + return this.filter(name) + } + } + ) + ) + } + ) + */ + + filter(val: string): MeasuresItem[] { + let filter = val.toLowerCase() + return this.measuresItems.filter(option => { + return option.name.toLowerCase().indexOf(filter) != -1 + }) + } + + displayFn(item: any): string { + return item ? item.name : item + } + + navigate(selectedId): void { + // Hack for nagivating with this class from a subclass, where + // the route is store/id + this.router.navigate( + [ + '/measures', this.store, selectedId + //'/measures/' + this.store, + /* + { + outlets: { + info: [ + this.store, + +selectedId, + ] + } + } + */ + ], + ).then(_ => { + this.ipt.nativeElement.blur() + }) + /* + if (this.route.url['value'].length === 2) { + this.router.navigate(['../' + selectedId], { relativeTo: this.route }) + + } + else { + this.router.navigate([selectedId], { relativeTo: this.route }) + } + */ + } +} diff --git a/src/app/measures/measures-routing.module.ts b/src/app/measures/measures-routing.module.ts new file mode 100644 index 0000000..8bc0d0f --- /dev/null +++ b/src/app/measures/measures-routing.module.ts @@ -0,0 +1,37 @@ +import { NgModule } from '@angular/core' +import { Routes, RouterModule } from '@angular/router' + +import { InfoComponent } from '../info/info.component' +import { MeasuresComponent } from './measures.component' +import { MeasuresHomeComponent } from './measures-list/measures-home.component' +import { MeasuresListComponent } from './measures-list/measures-list.component' + +const routes: Routes = [ + { + path: '', + component: MeasuresComponent, + children: [ + { + path: ':store', + component: MeasuresListComponent, + children: [ + { + path: ':id', + component: InfoComponent, + } + ] + }, + { + path: '', + pathMatch: 'full', + component: MeasuresHomeComponent, + } + ] + } +] + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], +}) +export class MeasuresRoutingModule { } diff --git a/src/app/measures/measures.component.html b/src/app/measures/measures.component.html new file mode 100644 index 0000000..baf0a41 --- /dev/null +++ b/src/app/measures/measures.component.html @@ -0,0 +1,35 @@ + + + + + + + +
    + +
    +
    +
    + + + \ No newline at end of file diff --git a/src/app/measures/measures.component.scss b/src/app/measures/measures.component.scss new file mode 100644 index 0000000..cf71df3 --- /dev/null +++ b/src/app/measures/measures.component.scss @@ -0,0 +1,19 @@ +#measuresMainDrawer>mat-drawer { + width: 12em; +} + +.measure-item { + width: 100%; +} + +mat-drawer-content { + overflow: hidden; +} + +.mat-mdc-list-item { + width: 100%; + display: block; + .mdc-button { + width: 100%; + } +} \ No newline at end of file diff --git a/src/app/measures/measures.component.spec.ts b/src/app/measures/measures.component.spec.ts new file mode 100644 index 0000000..8eb9dc1 --- /dev/null +++ b/src/app/measures/measures.component.spec.ts @@ -0,0 +1,28 @@ +/* tslint:disable:no-unused-variable */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { DebugElement } from '@angular/core'; + +import { MeasuresComponent } from './measures.component'; + +describe('MeasuresComponent', () => { + let component: MeasuresComponent; + let fixture: ComponentFixture; + + beforeEach(waitForAsync(() => { + TestBed.configureTestingModule({ + declarations: [ MeasuresComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(MeasuresComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/measures/measures.component.ts b/src/app/measures/measures.component.ts new file mode 100644 index 0000000..447217e --- /dev/null +++ b/src/app/measures/measures.component.ts @@ -0,0 +1,45 @@ +import { Component, OnInit, + ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' +import { ActivatedRoute, Router, ParamMap } from '@angular/router' + +import { map, startWith, switchMap } from 'rxjs/operators' +import { Observable, of } from 'rxjs' + +import { DataService } from '../_services/data.service' +import { ConfigService } from '../config.service' + +@Component({ + selector: 'gisaf-measures', + templateUrl: './measures.component.html', + styleUrls: ['./measures.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MeasuresComponent implements OnInit { + stores: Array = [] + + constructor( + public configService: ConfigService, + private _dataService: DataService, + protected route: ActivatedRoute, + protected router: Router, + private cdr: ChangeDetectorRef, + ) {} + + ngOnInit() { + this._dataService.getResources().subscribe( + data => { + this.stores = data + this.cdr.markForCheck() + } + ) + + /* + this.route.paramMap.subscribe( + (params: ParamMap) => { + // FIXME: the route is lost + this.router.navigate(['/measures', this.conf['measures']['defaultStore']]) + } + ) + */ + } +} diff --git a/src/app/measures/measures.module.ts b/src/app/measures/measures.module.ts new file mode 100644 index 0000000..056d0b7 --- /dev/null +++ b/src/app/measures/measures.module.ts @@ -0,0 +1,72 @@ +import { NgModule } from '@angular/core' +import { CommonModule } from '@angular/common' +import { FormsModule, ReactiveFormsModule } from '@angular/forms' +import { MatAutocompleteModule } from '@angular/material/autocomplete' +import { MatButtonModule } from '@angular/material/button' +import { MatCardModule } from '@angular/material/card' +import { MatCheckboxModule } from '@angular/material/checkbox' +import { MatNativeDateModule } from '@angular/material/core' +import { MatDatepickerModule } from '@angular/material/datepicker' +import { MatExpansionModule } from '@angular/material/expansion' +import { MatIconModule } from '@angular/material/icon' +import { MatInputModule } from '@angular/material/input' +import { MatListModule } from '@angular/material/list' +import { MatMenuModule } from '@angular/material/menu' +import { MatSelectModule } from '@angular/material/select' +import { MatSidenavModule } from '@angular/material/sidenav' +import { MatToolbarModule } from '@angular/material/toolbar' +import { MatTooltipModule } from '@angular/material/tooltip' + +import { FlexLayoutModule } from 'ngx-flexible-layout' + +import { DataService } from '../_services/data.service' +import { InfoModule } from '../info/info.module' + +import { MeasuresComponent } from './measures.component' +import { MeasuresListComponent } from './measures-list/measures-list.component' +import { MeasuresHomeComponent } from './measures-list/measures-home.component' + +import { MeasuresRoutingModule } from './measures-routing.module' +import { MeasuresListResolver } from './measures-list/measures-list-resolver.service' + + +@NgModule({ + imports: [ + CommonModule, + FormsModule, + ReactiveFormsModule, + + MatAutocompleteModule, + MatButtonModule, + MatCardModule, + MatCheckboxModule, + MatDatepickerModule, + MatExpansionModule, + MatIconModule, + MatInputModule, + MatListModule, + MatMenuModule, + MatNativeDateModule, + MatSelectModule, + MatSidenavModule, + MatToolbarModule, + MatTooltipModule, + + FlexLayoutModule, + + InfoModule, + + MeasuresRoutingModule, + ], + declarations: [ + MeasuresComponent, + MeasuresListComponent, + MeasuresHomeComponent, + ], + providers: [ + DataService, + MeasuresListResolver, + ], +}) + +export class MeasuresModule {} diff --git a/src/app/openapi/core/ApiError.ts b/src/app/openapi/core/ApiError.ts new file mode 100644 index 0000000..d6b8fcc --- /dev/null +++ b/src/app/openapi/core/ApiError.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; + +export class ApiError extends Error { + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: any; + public readonly request: ApiRequestOptions; + + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); + + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} diff --git a/src/app/openapi/core/ApiRequestOptions.ts b/src/app/openapi/core/ApiRequestOptions.ts new file mode 100644 index 0000000..c19adcc --- /dev/null +++ b/src/app/openapi/core/ApiRequestOptions.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiRequestOptions = { + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; +}; diff --git a/src/app/openapi/core/ApiResult.ts b/src/app/openapi/core/ApiResult.ts new file mode 100644 index 0000000..ad8fef2 --- /dev/null +++ b/src/app/openapi/core/ApiResult.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ApiResult = { + readonly url: string; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly body: any; +}; diff --git a/src/app/openapi/core/CancelablePromise.ts b/src/app/openapi/core/CancelablePromise.ts new file mode 100644 index 0000000..eb02246 --- /dev/null +++ b/src/app/openapi/core/CancelablePromise.ts @@ -0,0 +1,131 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export class CancelError extends Error { + + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } + + public get isCancelled(): boolean { + return true; + } +} + +export interface OnCancel { + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; + + (cancelHandler: () => void): void; +} + +export class CancelablePromise implements Promise { + #isResolved: boolean; + #isRejected: boolean; + #isCancelled: boolean; + readonly #cancelHandlers: (() => void)[]; + readonly #promise: Promise; + #resolve?: (value: T | PromiseLike) => void; + #reject?: (reason?: any) => void; + + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: any) => void, + onCancel: OnCancel + ) => void + ) { + this.#isResolved = false; + this.#isRejected = false; + this.#isCancelled = false; + this.#cancelHandlers = []; + this.#promise = new Promise((resolve, reject) => { + this.#resolve = resolve; + this.#reject = reject; + + const onResolve = (value: T | PromiseLike): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isResolved = true; + if (this.#resolve) this.#resolve(value); + }; + + const onReject = (reason?: any): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isRejected = true; + if (this.#reject) this.#reject(reason); + }; + + const onCancel = (cancelHandler: () => void): void => { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#cancelHandlers.push(cancelHandler); + }; + + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this.#isResolved, + }); + + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this.#isRejected, + }); + + Object.defineProperty(onCancel, 'isCancelled', { + get: (): boolean => this.#isCancelled, + }); + + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } + + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } + + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: any) => TResult2 | PromiseLike) | null + ): Promise { + return this.#promise.then(onFulfilled, onRejected); + } + + public catch( + onRejected?: ((reason: any) => TResult | PromiseLike) | null + ): Promise { + return this.#promise.catch(onRejected); + } + + public finally(onFinally?: (() => void) | null): Promise { + return this.#promise.finally(onFinally); + } + + public cancel(): void { + if (this.#isResolved || this.#isRejected || this.#isCancelled) { + return; + } + this.#isCancelled = true; + if (this.#cancelHandlers.length) { + try { + for (const cancelHandler of this.#cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.#cancelHandlers.length = 0; + if (this.#reject) this.#reject(new CancelError('Request aborted')); + } + + public get isCancelled(): boolean { + return this.#isCancelled; + } +} diff --git a/src/app/openapi/core/OpenAPI.ts b/src/app/openapi/core/OpenAPI.ts new file mode 100644 index 0000000..a6dd2bf --- /dev/null +++ b/src/app/openapi/core/OpenAPI.ts @@ -0,0 +1,32 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ApiRequestOptions } from './ApiRequestOptions'; + +type Resolver = (options: ApiRequestOptions) => Promise; +type Headers = Record; + +export type OpenAPIConfig = { + BASE: string; + VERSION: string; + WITH_CREDENTIALS: boolean; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + TOKEN?: string | Resolver | undefined; + USERNAME?: string | Resolver | undefined; + PASSWORD?: string | Resolver | undefined; + HEADERS?: Headers | Resolver | undefined; + ENCODE_PATH?: ((path: string) => string) | undefined; +}; + +export const OpenAPI: OpenAPIConfig = { + BASE: '', + VERSION: '2023.4.dev34+g5dacc90.d20240212', + WITH_CREDENTIALS: false, + CREDENTIALS: 'include', + TOKEN: undefined, + USERNAME: undefined, + PASSWORD: undefined, + HEADERS: undefined, + ENCODE_PATH: undefined, +}; diff --git a/src/app/openapi/core/request.ts b/src/app/openapi/core/request.ts new file mode 100644 index 0000000..b1fcfc0 --- /dev/null +++ b/src/app/openapi/core/request.ts @@ -0,0 +1,317 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import type { HttpResponse, HttpErrorResponse } from '@angular/common/http'; +import { forkJoin, of, throwError } from 'rxjs'; +import { catchError, map, switchMap } from 'rxjs/operators'; +import type { Observable } from 'rxjs'; + +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import type { OpenAPIConfig } from './OpenAPI'; + +export const isDefined = (value: T | null | undefined): value is Exclude => { + return value !== undefined && value !== null; +}; + +export const isString = (value: any): value is string => { + return typeof value === 'string'; +}; + +export const isStringWithValue = (value: any): value is string => { + return isString(value) && value !== ''; +}; + +export const isBlob = (value: any): value is Blob => { + return ( + typeof value === 'object' && + typeof value.type === 'string' && + typeof value.stream === 'function' && + typeof value.arrayBuffer === 'function' && + typeof value.constructor === 'function' && + typeof value.constructor.name === 'string' && + /^(Blob|File)$/.test(value.constructor.name) && + /^(Blob|File)$/.test(value[Symbol.toStringTag]) + ); +}; + +export const isFormData = (value: any): value is FormData => { + return value instanceof FormData; +}; + +export const base64 = (str: string): string => { + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } +}; + +export const getQueryString = (params: Record): string => { + const qs: string[] = []; + + const append = (key: string, value: any) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; + + const process = (key: string, value: any) => { + if (isDefined(value)) { + if (Array.isArray(value)) { + value.forEach(v => { + process(key, v); + }); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => { + process(`${key}[${k}]`, v); + }); + } else { + append(key, value); + } + } + }; + + Object.entries(params).forEach(([key, value]) => { + process(key, value); + }); + + if (qs.length > 0) { + return `?${qs.join('&')}`; + } + + return ''; +}; + +const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { + const encoder = config.ENCODE_PATH || encodeURI; + + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); + + const url = `${config.BASE}${path}`; + if (options.query) { + return `${url}${getQueryString(options.query)}`; + } + return url; +}; + +export const getFormData = (options: ApiRequestOptions): FormData | undefined => { + if (options.formData) { + const formData = new FormData(); + + const process = (key: string, value: any) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; + + Object.entries(options.formData) + .filter(([_, value]) => isDefined(value)) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); + + return formData; + } + return undefined; +}; + +type Resolver = (options: ApiRequestOptions) => Promise; + +export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { + if (typeof resolver === 'function') { + return (resolver as Resolver)(options); + } + return resolver; +}; + +export const getHeaders = (config: OpenAPIConfig, options: ApiRequestOptions): Observable => { + return forkJoin({ + token: resolve(options, config.TOKEN), + username: resolve(options, config.USERNAME), + password: resolve(options, config.PASSWORD), + additionalHeaders: resolve(options, config.HEADERS), + }).pipe( + map(({ token, username, password, additionalHeaders }) => { + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([_, value]) => isDefined(value)) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); + + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } + + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } + + if (options.body) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } + + return new HttpHeaders(headers); + }), + ); +}; + +export const getRequestBody = (options: ApiRequestOptions): any => { + if (options.body) { + if (options.mediaType?.includes('/json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; +}; + +export const sendRequest = ( + config: OpenAPIConfig, + options: ApiRequestOptions, + http: HttpClient, + url: string, + body: any, + formData: FormData | undefined, + headers: HttpHeaders +): Observable> => { + return http.request(options.method, url, { + headers, + body: body ?? formData, + withCredentials: config.WITH_CREDENTIALS, + observe: 'response', + }); +}; + +export const getResponseHeader = (response: HttpResponse, responseHeader?: string): string | undefined => { + if (responseHeader) { + const value = response.headers.get(responseHeader); + if (isString(value)) { + return value; + } + } + return undefined; +}; + +export const getResponseBody = (response: HttpResponse): T | undefined => { + if (response.status !== 204 && response.body !== null) { + return response.body; + } + return undefined; +}; + +export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { + const errors: Record = { + 400: 'Bad Request', + 401: 'Unauthorized', + 403: 'Forbidden', + 404: 'Not Found', + 500: 'Internal Server Error', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + ...options.errors, + } + + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } + + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); + + throw new ApiError(options, result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ); + } +}; + +/** + * Request method + * @param config The OpenAPI configuration object + * @param http The Angular HTTP client + * @param options The request options from the service + * @returns Observable + * @throws ApiError + */ +export const request = (config: OpenAPIConfig, http: HttpClient, options: ApiRequestOptions): Observable => { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + + return getHeaders(config, options).pipe( + switchMap(headers => { + return sendRequest(config, options, http, url, formData, body, headers); + }), + map(response => { + const responseBody = getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); + return { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + } as ApiResult; + }), + catchError((error: HttpErrorResponse) => { + if (!error.status) { + return throwError(error); + } + return of({ + url, + ok: error.ok, + status: error.status, + statusText: error.statusText, + body: error.error ?? error.statusText, + } as ApiResult); + }), + map(result => { + catchErrorCodes(options, result); + return result.body as T; + }), + catchError((error: ApiError) => { + return throwError(error); + }), + ); +}; diff --git a/src/app/openapi/index.ts b/src/app/openapi/index.ts new file mode 100644 index 0000000..8e9b598 --- /dev/null +++ b/src/app/openapi/index.ts @@ -0,0 +1,57 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export { ApiError } from './core/ApiError'; +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI } from './core/OpenAPI'; +export type { OpenAPIConfig } from './core/OpenAPI'; + +export type { AdminBasket } from './models/AdminBasket'; +export type { Attachment } from './models/Attachment'; +export type { BaseMap } from './models/BaseMap'; +export type { BaseStyle } from './models/BaseStyle'; +export type { BasketDefault } from './models/BasketDefault'; +export type { Body_login_for_access_token_api_token_post } from './models/Body_login_for_access_token_api_token_post'; +export type { BootstrapData } from './models/BootstrapData'; +export type { CategoryGroup } from './models/CategoryGroup'; +export type { CategoryRead } from './models/CategoryRead'; +export type { DashboadPageSectionType } from './models/DashboadPageSectionType'; +export type { DashboardGroup } from './models/DashboardGroup'; +export type { DashboardHome } from './models/DashboardHome'; +export type { DashboardPage_ } from './models/DashboardPage_'; +export type { DataProvider } from './models/DataProvider'; +export type { Equipment } from './models/Equipment'; +export type { FeatureInfo } from './models/FeatureInfo'; +export type { FileImport } from './models/FileImport'; +export type { Geo } from './models/Geo'; +export type { HTTPValidationError } from './models/HTTPValidationError'; +export type { InfoCategory } from './models/InfoCategory'; +export type { InfoItem } from './models/InfoItem'; +export type { Map } from './models/Map'; +export type { MapInitData } from './models/MapInitData'; +export type { Measures } from './models/Measures'; +export type { PlotBaseLine } from './models/PlotBaseLine'; +export type { PlotBgShape } from './models/PlotBgShape'; +export type { PlotParams } from './models/PlotParams'; +export type { Project } from './models/Project'; +export type { RawSurvey } from './models/RawSurvey'; +export type { RoleRead } from './models/RoleRead'; +export type { RoleReadNoUsers } from './models/RoleReadNoUsers'; +export type { SpatialSysRef } from './models/SpatialSysRef'; +export type { Store } from './models/Store'; +export type { StoreNameOnly } from './models/StoreNameOnly'; +export type { SurveyMeta } from './models/SurveyMeta'; +export type { Surveyor } from './models/Surveyor'; +export type { TileServer } from './models/TileServer'; +export type { Token } from './models/Token'; +export type { UserRead } from './models/UserRead'; +export type { UserReadNoRoles } from './models/UserReadNoRoles'; +export type { UserRoleLink } from './models/UserRoleLink'; +export type { ValidationError } from './models/ValidationError'; + +export { AdminService } from './services/AdminService'; +export { ApiService } from './services/ApiService'; +export { DashboardService } from './services/DashboardService'; +export { GeoapiService } from './services/GeoapiService'; +export { MapService } from './services/MapService'; diff --git a/src/app/openapi/models/AdminBasket.ts b/src/app/openapi/models/AdminBasket.ts new file mode 100644 index 0000000..4566765 --- /dev/null +++ b/src/app/openapi/models/AdminBasket.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { FileImport } from './FileImport'; +export type AdminBasket = { + name: string; + files: Array; + columns: Array; + uploadFields: Array; + projects?: Array; +}; + diff --git a/src/app/openapi/models/Attachment.ts b/src/app/openapi/models/Attachment.ts new file mode 100644 index 0000000..6a1b54c --- /dev/null +++ b/src/app/openapi/models/Attachment.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Attachment = { + name: string; + path: string; +}; + diff --git a/src/app/openapi/models/BaseMap.ts b/src/app/openapi/models/BaseMap.ts new file mode 100644 index 0000000..028876a --- /dev/null +++ b/src/app/openapi/models/BaseMap.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BaseMap = { + id?: (number | null); + name: string; +}; + diff --git a/src/app/openapi/models/BaseStyle.ts b/src/app/openapi/models/BaseStyle.ts new file mode 100644 index 0000000..834ce44 --- /dev/null +++ b/src/app/openapi/models/BaseStyle.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BaseStyle = { + id?: (number | null); + name: string; + style: (Record | null); + mbtiles: string; + static_tiles_url: string; + enabled?: boolean; +}; + diff --git a/src/app/openapi/models/BasketDefault.ts b/src/app/openapi/models/BasketDefault.ts new file mode 100644 index 0000000..f3d6708 --- /dev/null +++ b/src/app/openapi/models/BasketDefault.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type BasketDefault = { + surveyor?: string; + equipment?: string; + project?: string; + status?: string; + store?: (string | null); +}; + diff --git a/src/app/openapi/models/Body_login_for_access_token_api_token_post.ts b/src/app/openapi/models/Body_login_for_access_token_api_token_post.ts new file mode 100644 index 0000000..9827843 --- /dev/null +++ b/src/app/openapi/models/Body_login_for_access_token_api_token_post.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Body_login_for_access_token_api_token_post = { + grant_type?: (string | null); + username: string; + password: string; + scope?: string; + client_id?: (string | null); + client_secret?: (string | null); +}; + diff --git a/src/app/openapi/models/BootstrapData.ts b/src/app/openapi/models/BootstrapData.ts new file mode 100644 index 0000000..d033cee --- /dev/null +++ b/src/app/openapi/models/BootstrapData.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { Geo } from './Geo'; +import type { Map } from './Map'; +import type { Measures } from './Measures'; +import type { UserRead } from './UserRead'; +export type BootstrapData = { + version?: string; + title?: string; + windowTitle?: string; + map?: Map; + geo?: Geo; + measures?: Measures; + redirect?: string; + user?: (UserRead | null); +}; + diff --git a/src/app/openapi/models/CategoryGroup.ts b/src/app/openapi/models/CategoryGroup.ts new file mode 100644 index 0000000..1a8ee5b --- /dev/null +++ b/src/app/openapi/models/CategoryGroup.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type CategoryGroup = { + name?: (string | null); + major: boolean; + long_name: string; +}; + diff --git a/src/app/openapi/models/CategoryRead.ts b/src/app/openapi/models/CategoryRead.ts new file mode 100644 index 0000000..8f417cb --- /dev/null +++ b/src/app/openapi/models/CategoryRead.ts @@ -0,0 +1,40 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type CategoryRead = { + name: string; + description: (string | null); + group: string; + minor_group_1?: string; + minor_group_2?: string; + status: string; + custom: (boolean | null); + auto_import?: boolean; + gis_type?: string; + long_name: (string | null); + style: (string | null); + symbol: (string | null); + mapbox_type_custom: (string | null); + mapbox_paint: (Record | null); + mapbox_layout: (Record | null); + viewable_role: (string | null); + extra: (Record | null); + /** + * ISO compliant layer name (see ISO 13567) + * :return: str + */ + readonly layer_name: string; + /** + * Table name + * :return: + */ + readonly table_name: string; + /** + * Table name + * :return: + */ + readonly raw_survey_table_name: string; + readonly mapbox_type: string; +}; + diff --git a/src/app/openapi/models/DashboadPageSectionType.ts b/src/app/openapi/models/DashboadPageSectionType.ts new file mode 100644 index 0000000..52d1ff8 --- /dev/null +++ b/src/app/openapi/models/DashboadPageSectionType.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DashboadPageSectionType = { + name: string; + plot: string; +}; + diff --git a/src/app/openapi/models/DashboardGroup.ts b/src/app/openapi/models/DashboardGroup.ts new file mode 100644 index 0000000..33e802e --- /dev/null +++ b/src/app/openapi/models/DashboardGroup.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { DashboardPage_ } from './DashboardPage_'; +export type DashboardGroup = { + name: string; + pages: Array; +}; + diff --git a/src/app/openapi/models/DashboardHome.ts b/src/app/openapi/models/DashboardHome.ts new file mode 100644 index 0000000..5df3801 --- /dev/null +++ b/src/app/openapi/models/DashboardHome.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DashboardHome = { + title: string; + content: string; + footer: string; +}; + diff --git a/src/app/openapi/models/DashboardPage_.ts b/src/app/openapi/models/DashboardPage_.ts new file mode 100644 index 0000000..5946586 --- /dev/null +++ b/src/app/openapi/models/DashboardPage_.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { DashboadPageSectionType } from './DashboadPageSectionType'; +export type DashboardPage_ = { + name: string; + group: string; + description: string; + time?: (string | null); + html?: (string | null); + attachment?: (string | null); + dfData?: (string | null); + plotData?: (string | null); + notebook?: (string | null); + expandedPanes?: (Array | null); + sections?: (Array | null); +}; + diff --git a/src/app/openapi/models/DataProvider.ts b/src/app/openapi/models/DataProvider.ts new file mode 100644 index 0000000..b00446f --- /dev/null +++ b/src/app/openapi/models/DataProvider.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DataProvider = { + name: string; + values: Array; +}; + diff --git a/src/app/openapi/models/Equipment.ts b/src/app/openapi/models/Equipment.ts new file mode 100644 index 0000000..557cd7c --- /dev/null +++ b/src/app/openapi/models/Equipment.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Equipment = { + id?: (number | null); + name: string; +}; + diff --git a/src/app/openapi/models/FeatureInfo.ts b/src/app/openapi/models/FeatureInfo.ts new file mode 100644 index 0000000..95d3260 --- /dev/null +++ b/src/app/openapi/models/FeatureInfo.ts @@ -0,0 +1,23 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { Attachment } from './Attachment'; +import type { InfoCategory } from './InfoCategory'; +import type { InfoItem } from './InfoItem'; +import type { PlotParams } from './PlotParams'; +export type FeatureInfo = { + id: string; + itemName: string; + geoInfoItems?: Array; + surveyInfoItems?: Array; + infoItems?: Array; + categorizedInfoItems?: Array; + tags?: Array; + graph?: (string | null); + plotParams?: (PlotParams | null); + files?: Array; + images?: Array; + externalRecordUrl?: (string | null); +}; + diff --git a/src/app/openapi/models/FileImport.ts b/src/app/openapi/models/FileImport.ts new file mode 100644 index 0000000..b14de23 --- /dev/null +++ b/src/app/openapi/models/FileImport.ts @@ -0,0 +1,25 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +/** + * Files to import or imported in the DB. + * Give either url or path. + */ +export type FileImport = { + id?: (number | null); + url: string; + path: string; + dir: string; + name: string; + md5: string; + time: string; + comment: string; + status: string; + store: string; + basket: string; + project_id: number; + surveyor_id: number; + equipment_id: number; +}; + diff --git a/src/app/openapi/models/Geo.ts b/src/app/openapi/models/Geo.ts new file mode 100644 index 0000000..fab74de --- /dev/null +++ b/src/app/openapi/models/Geo.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { RawSurvey } from './RawSurvey'; +export type Geo = { + raw_survey?: RawSurvey; + simplify_geom_factor?: number; + simplify_preserve_topology?: boolean; + srid?: number; + srid_for_proj?: number; +}; + diff --git a/src/app/openapi/models/HTTPValidationError.ts b/src/app/openapi/models/HTTPValidationError.ts new file mode 100644 index 0000000..892e425 --- /dev/null +++ b/src/app/openapi/models/HTTPValidationError.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ValidationError } from './ValidationError'; +export type HTTPValidationError = { + detail?: Array; +}; + diff --git a/src/app/openapi/models/InfoCategory.ts b/src/app/openapi/models/InfoCategory.ts new file mode 100644 index 0000000..3e5a6d3 --- /dev/null +++ b/src/app/openapi/models/InfoCategory.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { InfoItem } from './InfoItem'; +export type InfoCategory = { + name: string; + infoItems: Array; +}; + diff --git a/src/app/openapi/models/InfoItem.ts b/src/app/openapi/models/InfoItem.ts new file mode 100644 index 0000000..dcf0cdb --- /dev/null +++ b/src/app/openapi/models/InfoItem.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type InfoItem = { + key: string; + value: (string | number); +}; + diff --git a/src/app/openapi/models/Map.ts b/src/app/openapi/models/Map.ts new file mode 100644 index 0000000..d212c0b --- /dev/null +++ b/src/app/openapi/models/Map.ts @@ -0,0 +1,20 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { TileServer } from './TileServer'; +export type Map = { + tileServer?: TileServer; + zoom?: number; + pitch?: number; + lat?: number; + lng?: number; + bearing?: number; + style?: string; + opacity?: number; + attribution?: string; + status?: Array; + defaultStatus?: Array; + tagKeys?: Array; +}; + diff --git a/src/app/openapi/models/MapInitData.ts b/src/app/openapi/models/MapInitData.ts new file mode 100644 index 0000000..6c9bc92 --- /dev/null +++ b/src/app/openapi/models/MapInitData.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BaseMap } from './BaseMap'; +import type { BaseStyle } from './BaseStyle'; +import type { CategoryGroup } from './CategoryGroup'; +import type { Store } from './Store'; +export type MapInitData = { + baseStyles?: Array; + baseMaps?: Array; + groups?: Array; + stores?: Array; +}; + diff --git a/src/app/openapi/models/Measures.ts b/src/app/openapi/models/Measures.ts new file mode 100644 index 0000000..ef29887 --- /dev/null +++ b/src/app/openapi/models/Measures.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Measures = { + defaultStore?: (string | null); +}; + diff --git a/src/app/openapi/models/PlotBaseLine.ts b/src/app/openapi/models/PlotBaseLine.ts new file mode 100644 index 0000000..fd06164 --- /dev/null +++ b/src/app/openapi/models/PlotBaseLine.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type PlotBaseLine = { + name: string; + value: number; + color: string; +}; + diff --git a/src/app/openapi/models/PlotBgShape.ts b/src/app/openapi/models/PlotBgShape.ts new file mode 100644 index 0000000..c1737d0 --- /dev/null +++ b/src/app/openapi/models/PlotBgShape.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type PlotBgShape = { + name: string; + valueTop: number; + valueBottom: number; + color: string; +}; + diff --git a/src/app/openapi/models/PlotParams.ts b/src/app/openapi/models/PlotParams.ts new file mode 100644 index 0000000..66bfe07 --- /dev/null +++ b/src/app/openapi/models/PlotParams.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { PlotBaseLine } from './PlotBaseLine'; +import type { PlotBgShape } from './PlotBgShape'; +export type PlotParams = { + baseLines: Array; + bgShape: Array; + barBase: number; +}; + diff --git a/src/app/openapi/models/Project.ts b/src/app/openapi/models/Project.ts new file mode 100644 index 0000000..e24bf39 --- /dev/null +++ b/src/app/openapi/models/Project.ts @@ -0,0 +1,16 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Project = { + id?: (number | null); + name: string; + contact_person: string; + site: string; + date_approved: string; + start_date_planned: string; + start_date_effective: string; + end_date_planned: string; + end_date_effective: string; +}; + diff --git a/src/app/openapi/models/RawSurvey.ts b/src/app/openapi/models/RawSurvey.ts new file mode 100644 index 0000000..53249f3 --- /dev/null +++ b/src/app/openapi/models/RawSurvey.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { SpatialSysRef } from './SpatialSysRef'; +export type RawSurvey = { + spatial_sys_ref?: SpatialSysRef; + srid?: number; +}; + diff --git a/src/app/openapi/models/RoleRead.ts b/src/app/openapi/models/RoleRead.ts new file mode 100644 index 0000000..9df5469 --- /dev/null +++ b/src/app/openapi/models/RoleRead.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { UserReadNoRoles } from './UserReadNoRoles'; +export type RoleRead = { + name: string; + id: number; + users?: Array; +}; + diff --git a/src/app/openapi/models/RoleReadNoUsers.ts b/src/app/openapi/models/RoleReadNoUsers.ts new file mode 100644 index 0000000..a038eee --- /dev/null +++ b/src/app/openapi/models/RoleReadNoUsers.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type RoleReadNoUsers = { + name: string; + id: number; +}; + diff --git a/src/app/openapi/models/SpatialSysRef.ts b/src/app/openapi/models/SpatialSysRef.ts new file mode 100644 index 0000000..adb9dab --- /dev/null +++ b/src/app/openapi/models/SpatialSysRef.ts @@ -0,0 +1,18 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type SpatialSysRef = { + author?: string; + ellps?: string; + 'k'?: number; + lat_0?: number; + lon_0?: number; + no_defs?: boolean; + proj?: string; + towgs84?: string; + units?: string; + x_0?: number; + y_0?: number; +}; + diff --git a/src/app/openapi/models/Store.ts b/src/app/openapi/models/Store.ts new file mode 100644 index 0000000..29695b5 --- /dev/null +++ b/src/app/openapi/models/Store.ts @@ -0,0 +1,28 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Store = { + name: string; + auto_import: boolean; + count?: (number | null); + custom: boolean; + description: string; + group: string; + in_menu: boolean; + is_db: boolean; + is_line_work: boolean; + is_live: boolean; + long_name: (string | null); + minor_group_1: (string | null); + minor_group_2: (string | null); + gis_type: string; + status: string; + store: string; + style: (string | null); + symbol: (string | null); + title: string; + viewable_role: (string | null); + z_index: number; +}; + diff --git a/src/app/openapi/models/StoreNameOnly.ts b/src/app/openapi/models/StoreNameOnly.ts new file mode 100644 index 0000000..c24296c --- /dev/null +++ b/src/app/openapi/models/StoreNameOnly.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type StoreNameOnly = { + name: string; +}; + diff --git a/src/app/openapi/models/SurveyMeta.ts b/src/app/openapi/models/SurveyMeta.ts new file mode 100644 index 0000000..b741f3b --- /dev/null +++ b/src/app/openapi/models/SurveyMeta.ts @@ -0,0 +1,19 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { BasketDefault } from './BasketDefault'; +import type { Equipment } from './Equipment'; +import type { Project } from './Project'; +import type { StoreNameOnly } from './StoreNameOnly'; +import type { Surveyor } from './Surveyor'; +export type SurveyMeta = { + projects: Array; + surveyors: Array; + equipments: Array; + statuses: Array; + stores_misc: Array; + stores_line_work: Array; + default: BasketDefault; +}; + diff --git a/src/app/openapi/models/Surveyor.ts b/src/app/openapi/models/Surveyor.ts new file mode 100644 index 0000000..6668237 --- /dev/null +++ b/src/app/openapi/models/Surveyor.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Surveyor = { + id?: (number | null); + name: string; +}; + diff --git a/src/app/openapi/models/TileServer.ts b/src/app/openapi/models/TileServer.ts new file mode 100644 index 0000000..f82569f --- /dev/null +++ b/src/app/openapi/models/TileServer.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type TileServer = { + baseDir?: string; + useRequestUrl?: boolean; + spriteBaseDir?: string; + spriteUrl?: string; + spriteBaseUrl?: string; + openMapTilesKey?: (string | null); +}; + diff --git a/src/app/openapi/models/Token.ts b/src/app/openapi/models/Token.ts new file mode 100644 index 0000000..ec896be --- /dev/null +++ b/src/app/openapi/models/Token.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Token = { + access_token: string; + token_type: string; +}; + diff --git a/src/app/openapi/models/UserRead.ts b/src/app/openapi/models/UserRead.ts new file mode 100644 index 0000000..26fdf59 --- /dev/null +++ b/src/app/openapi/models/UserRead.ts @@ -0,0 +1,13 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { RoleReadNoUsers } from './RoleReadNoUsers'; +export type UserRead = { + username: string; + email: (string | null); + disabled?: (boolean | null); + id: number; + roles?: Array; +}; + diff --git a/src/app/openapi/models/UserReadNoRoles.ts b/src/app/openapi/models/UserReadNoRoles.ts new file mode 100644 index 0000000..1663284 --- /dev/null +++ b/src/app/openapi/models/UserReadNoRoles.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type UserReadNoRoles = { + username: string; + email: (string | null); + disabled?: (boolean | null); + id: number; +}; + diff --git a/src/app/openapi/models/UserRoleLink.ts b/src/app/openapi/models/UserRoleLink.ts new file mode 100644 index 0000000..595e65f --- /dev/null +++ b/src/app/openapi/models/UserRoleLink.ts @@ -0,0 +1,9 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type UserRoleLink = { + user_id?: (number | null); + role_id?: (number | null); +}; + diff --git a/src/app/openapi/models/ValidationError.ts b/src/app/openapi/models/ValidationError.ts new file mode 100644 index 0000000..f2ff49a --- /dev/null +++ b/src/app/openapi/models/ValidationError.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type ValidationError = { + loc: Array<(string | number)>; + msg: string; + type: string; +}; + diff --git a/src/app/openapi/services/AdminService.ts b/src/app/openapi/services/AdminService.ts new file mode 100644 index 0000000..d4d3dc8 --- /dev/null +++ b/src/app/openapi/services/AdminService.ts @@ -0,0 +1,52 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; +import type { AdminBasket } from '../models/AdminBasket'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +@Injectable({ + providedIn: 'root', +}) +export class AdminService { + constructor(public readonly http: HttpClient) {} + /** + * Get Baskets + * @returns any Successful Response + * @throws ApiError + */ + public getBasketsApiAdminBasketGet(): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/admin/basket', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Basket + * @returns AdminBasket Successful Response + * @throws ApiError + */ + public getBasketApiAdminBasketNameGet({ + name, + }: { + name: string, + }): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/admin/basket/{name}', + path: { + 'name': name, + }, + errors: { + 404: `Not found`, + 422: `Validation Error`, + }, + }); + } +} diff --git a/src/app/openapi/services/ApiService.ts b/src/app/openapi/services/ApiService.ts new file mode 100644 index 0000000..4284de5 --- /dev/null +++ b/src/app/openapi/services/ApiService.ts @@ -0,0 +1,216 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; +import type { Body_login_for_access_token_api_token_post } from '../models/Body_login_for_access_token_api_token_post'; +import type { BootstrapData } from '../models/BootstrapData'; +import type { CategoryRead } from '../models/CategoryRead'; +import type { DataProvider } from '../models/DataProvider'; +import type { FeatureInfo } from '../models/FeatureInfo'; +import type { Project } from '../models/Project'; +import type { RoleRead } from '../models/RoleRead'; +import type { Store } from '../models/Store'; +import type { SurveyMeta } from '../models/SurveyMeta'; +import type { Token } from '../models/Token'; +import type { UserRead } from '../models/UserRead'; +import type { UserRoleLink } from '../models/UserRoleLink'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +@Injectable({ + providedIn: 'root', +}) +export class ApiService { + constructor(public readonly http: HttpClient) {} + /** + * Bootstrap + * @returns BootstrapData Successful Response + * @throws ApiError + */ + public bootstrapApiBootstrapGet(): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/bootstrap', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Login For Access Token + * @returns Token Successful Response + * @throws ApiError + */ + public loginForAccessTokenApiTokenPost({ + formData, + }: { + formData: Body_login_for_access_token_api_token_post, + }): Observable { + return __request(OpenAPI, this.http, { + method: 'POST', + url: '/api/token', + formData: formData, + mediaType: 'application/x-www-form-urlencoded', + errors: { + 404: `Not found`, + 422: `Validation Error`, + }, + }); + } + /** + * Get Users + * @returns UserRead Successful Response + * @throws ApiError + */ + public getUsersApiUsersGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/users', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Roles + * @returns RoleRead Successful Response + * @throws ApiError + */ + public getRolesApiRolesGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/roles', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Acls + * New: ACLs returned as UserRoleLink + * @returns UserRoleLink Successful Response + * @throws ApiError + */ + public getAclsApiAclsGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/acls', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Categories + * @returns CategoryRead Successful Response + * @throws ApiError + */ + public getCategoriesApiCategoriesGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/categories', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Categories P + * @returns CategoryRead Successful Response + * @throws ApiError + */ + public getCategoriesPApiCategoriesPandasGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/categories_pandas', + errors: { + 404: `Not found`, + }, + }); + } + /** + * List Data Providers + * Return a list of data providers, for use with the api (graphs, etc) + * :return: + * @returns DataProvider Successful Response + * @throws ApiError + */ + public listDataProvidersApiDataProvidersGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/data-providers', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Stores + * @returns Store Successful Response + * @throws ApiError + */ + public getStoresApiStoresGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/stores', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Projects + * @returns Project Successful Response + * @throws ApiError + */ + public getProjectsApiProjectsGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/projects', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Survey Meta + * @returns SurveyMeta Successful Response + * @throws ApiError + */ + public getSurveyMetaApiSurveyMetaGet(): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/survey_meta', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Feature Info + * @returns FeatureInfo Successful Response + * @throws ApiError + */ + public getFeatureInfoApiFeatureInfoStoreIdGet({ + store, + id, + }: { + store: string, + id: string, + }): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/feature-info/{store}/{id}', + path: { + 'store': store, + 'id': id, + }, + errors: { + 404: `Not found`, + 422: `Validation Error`, + }, + }); + } +} diff --git a/src/app/openapi/services/DashboardService.ts b/src/app/openapi/services/DashboardService.ts new file mode 100644 index 0000000..f7f61d7 --- /dev/null +++ b/src/app/openapi/services/DashboardService.ts @@ -0,0 +1,71 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; +import type { DashboardGroup } from '../models/DashboardGroup'; +import type { DashboardHome } from '../models/DashboardHome'; +import type { DashboardPage_ } from '../models/DashboardPage_'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +@Injectable({ + providedIn: 'root', +}) +export class DashboardService { + constructor(public readonly http: HttpClient) {} + /** + * Get Groups + * @returns DashboardGroup Successful Response + * @throws ApiError + */ + public getGroupsApiDashboardGroupsGet(): Observable> { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/dashboard/groups', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Home + * @returns DashboardHome Successful Response + * @throws ApiError + */ + public getHomeApiDashboardHomeGet(): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/dashboard/home', + errors: { + 404: `Not found`, + }, + }); + } + /** + * Get Dashboard Page + * @returns DashboardPage_ Successful Response + * @throws ApiError + */ + public getDashboardPageApiDashboardPageGroupNameGet({ + group, + name, + }: { + group: string, + name: string, + }): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/dashboard/page/{group}/{name}', + path: { + 'group': group, + 'name': name, + }, + errors: { + 404: `Not found`, + 422: `Validation Error`, + }, + }); + } +} diff --git a/src/app/openapi/services/GeoapiService.ts b/src/app/openapi/services/GeoapiService.ts new file mode 100644 index 0000000..c6c33fd --- /dev/null +++ b/src/app/openapi/services/GeoapiService.ts @@ -0,0 +1,51 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +@Injectable({ + providedIn: 'root', +}) +export class GeoapiService { + constructor(public readonly http: HttpClient) {} + /** + * Get Geojson + * Some REST stores coded manually (route prefixed with "gj": geojson). + * :param store_name: name of the model + * :return: json + * @returns any Successful Response + * @throws ApiError + */ + public getGeojsonApiGjStoreNameGet({ + storeName, + ifNoneMatch, + simplify, + preserveTopology, + }: { + storeName: any, + ifNoneMatch?: (string | null), + simplify?: (number | null), + preserveTopology?: (boolean | null), + }): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/gj/{store_name}', + path: { + 'store_name': storeName, + }, + headers: { + 'If-None-Match': ifNoneMatch, + 'simplify': simplify, + 'preserveTopology': preserveTopology, + }, + errors: { + 404: `Not found`, + 422: `Validation Error`, + }, + }); + } +} diff --git a/src/app/openapi/services/MapService.ts b/src/app/openapi/services/MapService.ts new file mode 100644 index 0000000..b160d3e --- /dev/null +++ b/src/app/openapi/services/MapService.ts @@ -0,0 +1,49 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import type { Observable } from 'rxjs'; +import type { BaseStyle } from '../models/BaseStyle'; +import type { MapInitData } from '../models/MapInitData'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; +@Injectable({ + providedIn: 'root', +}) +export class MapService { + constructor(public readonly http: HttpClient) {} + /** + * Get Init Data + * @returns MapInitData Successful Response + * @throws ApiError + */ + public getInitDataApiMapInitDataGet(): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/map/init-data', + }); + } + /** + * Get Base Style + * @returns BaseStyle Successful Response + * @throws ApiError + */ + public getBaseStyleApiMapBaseStyleNameGet({ + name, + }: { + name: string, + }): Observable { + return __request(OpenAPI, this.http, { + method: 'GET', + url: '/api/map/base_style/{name}', + path: { + 'name': name, + }, + errors: { + 422: `Validation Error`, + }, + }); + } +} diff --git a/src/app/pageNotFound.component.ts b/src/app/pageNotFound.component.ts new file mode 100644 index 0000000..e8e76a0 --- /dev/null +++ b/src/app/pageNotFound.component.ts @@ -0,0 +1,6 @@ +import { Component } from '@angular/core' + +@Component({ + template: '

    Page not found :(

    ' +}) +export class PageNotFoundComponent {} diff --git a/src/app/pipes.module.ts b/src/app/pipes.module.ts new file mode 100644 index 0000000..6c75d35 --- /dev/null +++ b/src/app/pipes.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core' + +import { KeysPipe, ValuesPipe, SafeHtmlPipe, OrderByPipe } from './pipes' + +@NgModule({ + imports: [ + // dep modules + ], + declarations: [ + KeysPipe, + ValuesPipe, + SafeHtmlPipe, + OrderByPipe + ], + exports: [ + KeysPipe, + ValuesPipe, + SafeHtmlPipe, + OrderByPipe + ] +}) +export class PipesModule {} diff --git a/src/app/pipes.ts b/src/app/pipes.ts new file mode 100644 index 0000000..879bdfc --- /dev/null +++ b/src/app/pipes.ts @@ -0,0 +1,51 @@ +import { Pipe, PipeTransform } from '@angular/core' +import { DomSanitizer } from '@angular/platform-browser' + +@Pipe({name: 'keys'}) +export class KeysPipe implements PipeTransform { + transform(value): any { + let keys = [] + for (let key in value) { + keys.push(key) + } + return keys + } +} + +@Pipe({name: 'values'}) +export class ValuesPipe implements PipeTransform { + transform(value): any { + let items = [] + for (let key in value) { + items.push(value[key]) + } + return items + } +} + +@Pipe({name: 'safeHtml'}) +export class SafeHtmlPipe implements PipeTransform { + constructor(private sanitized: DomSanitizer) {} + transform(value) { + return this.sanitized.bypassSecurityTrustHtml(value) + } +} + +@Pipe({name: 'orderBy'}) +export class OrderByPipe implements PipeTransform { + transform(array: any[], field: string): any { + if (!Array.isArray(array)) { + return; + } + array.sort((a: any, b: any) => { + if (a[field] < b[field]) { + return -1; + } else if (a[field] > b[field]) { + return 1; + } else { + return 0; + } + }); + return array; + } +} \ No newline at end of file diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/assets/fonts/.gitignore b/src/assets/fonts/.gitignore new file mode 100644 index 0000000..2d35bbc --- /dev/null +++ b/src/assets/fonts/.gitignore @@ -0,0 +1,5 @@ +GisafSymbols Mac.ttf +GisafSymbols.html +GisafSymbols.eot +GisafSymbols.svg + diff --git a/src/assets/fonts/GisafSymbols.ttf b/src/assets/fonts/GisafSymbols.ttf new file mode 100644 index 0000000..333835c Binary files /dev/null and b/src/assets/fonts/GisafSymbols.ttf differ diff --git a/src/assets/fonts/gisafSymbols.bf b/src/assets/fonts/gisafSymbols.bf new file mode 100644 index 0000000..81de10a --- /dev/null +++ b/src/assets/fonts/gisafSymbols.bf @@ -0,0 +1,1888 @@ + + +3.16 + + +GisafSymbols +GisafSymbols +Regular +false +false +GisafSymbols +GisafSymbols +Version 1.0 +Font for Gisaf symbols +SIL Open Font License + + +SIL Open Font License + + +http://scripts.sil.org/OFL +400 +1024 + + +Philippe May + + +-10 +3.5 +false +false + + + 84 + 70.26179 + 56 + 0 + -20 + -27 + 10 + + + + + + + + +GisafSymbols + +true +true +false +false +true +true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/fonts/glyphs/GisafSymbols/0-255.pbf b/src/assets/fonts/glyphs/GisafSymbols/0-255.pbf new file mode 100644 index 0000000..cbbb843 Binary files /dev/null and b/src/assets/fonts/glyphs/GisafSymbols/0-255.pbf differ diff --git a/src/assets/fonts/glyphs/GisafSymbols/1024-1279.pbf b/src/assets/fonts/glyphs/GisafSymbols/1024-1279.pbf new file mode 100644 index 0000000..7355786 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/1024-1279.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 1024-1279 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/10240-10495.pbf b/src/assets/fonts/glyphs/GisafSymbols/10240-10495.pbf new file mode 100644 index 0000000..a7ed909 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/10240-10495.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 10240-10495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/10496-10751.pbf b/src/assets/fonts/glyphs/GisafSymbols/10496-10751.pbf new file mode 100644 index 0000000..b1d02b7 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/10496-10751.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 10496-10751 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/10752-11007.pbf b/src/assets/fonts/glyphs/GisafSymbols/10752-11007.pbf new file mode 100644 index 0000000..d77a130 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/10752-11007.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 10752-11007 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/11008-11263.pbf b/src/assets/fonts/glyphs/GisafSymbols/11008-11263.pbf new file mode 100644 index 0000000..db1e75c --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/11008-11263.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 11008-11263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/11264-11519.pbf b/src/assets/fonts/glyphs/GisafSymbols/11264-11519.pbf new file mode 100644 index 0000000..e210fd2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/11264-11519.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 11264-11519 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/11520-11775.pbf b/src/assets/fonts/glyphs/GisafSymbols/11520-11775.pbf new file mode 100644 index 0000000..f07c4cb --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/11520-11775.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 11520-11775 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/11776-12031.pbf b/src/assets/fonts/glyphs/GisafSymbols/11776-12031.pbf new file mode 100644 index 0000000..0d85bf5 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/11776-12031.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 11776-12031 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/12032-12287.pbf b/src/assets/fonts/glyphs/GisafSymbols/12032-12287.pbf new file mode 100644 index 0000000..e99a3cc --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/12032-12287.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 12032-12287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/12288-12543.pbf b/src/assets/fonts/glyphs/GisafSymbols/12288-12543.pbf new file mode 100644 index 0000000..56b540e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/12288-12543.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 12288-12543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/12544-12799.pbf b/src/assets/fonts/glyphs/GisafSymbols/12544-12799.pbf new file mode 100644 index 0000000..a24dacd --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/12544-12799.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 12544-12799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/1280-1535.pbf b/src/assets/fonts/glyphs/GisafSymbols/1280-1535.pbf new file mode 100644 index 0000000..dd027ec --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/1280-1535.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 1280-1535 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/12800-13055.pbf b/src/assets/fonts/glyphs/GisafSymbols/12800-13055.pbf new file mode 100644 index 0000000..a2c70dc --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/12800-13055.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 12800-13055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/13056-13311.pbf b/src/assets/fonts/glyphs/GisafSymbols/13056-13311.pbf new file mode 100644 index 0000000..aeced0a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/13056-13311.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 13056-13311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/13312-13567.pbf b/src/assets/fonts/glyphs/GisafSymbols/13312-13567.pbf new file mode 100644 index 0000000..7a0d8c6 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/13312-13567.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 13312-13567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/13568-13823.pbf b/src/assets/fonts/glyphs/GisafSymbols/13568-13823.pbf new file mode 100644 index 0000000..40929e3 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/13568-13823.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 13568-13823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/13824-14079.pbf b/src/assets/fonts/glyphs/GisafSymbols/13824-14079.pbf new file mode 100644 index 0000000..a2000ac --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/13824-14079.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 13824-14079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/14080-14335.pbf b/src/assets/fonts/glyphs/GisafSymbols/14080-14335.pbf new file mode 100644 index 0000000..c86006a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/14080-14335.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 14080-14335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/14336-14591.pbf b/src/assets/fonts/glyphs/GisafSymbols/14336-14591.pbf new file mode 100644 index 0000000..4de6470 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/14336-14591.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 14336-14591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/14592-14847.pbf b/src/assets/fonts/glyphs/GisafSymbols/14592-14847.pbf new file mode 100644 index 0000000..a31b220 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/14592-14847.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 14592-14847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/14848-15103.pbf b/src/assets/fonts/glyphs/GisafSymbols/14848-15103.pbf new file mode 100644 index 0000000..37f3b81 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/14848-15103.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 14848-15103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/15104-15359.pbf b/src/assets/fonts/glyphs/GisafSymbols/15104-15359.pbf new file mode 100644 index 0000000..2f52875 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/15104-15359.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 15104-15359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/1536-1791.pbf b/src/assets/fonts/glyphs/GisafSymbols/1536-1791.pbf new file mode 100644 index 0000000..5e490f0 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/1536-1791.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 1536-1791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/15360-15615.pbf b/src/assets/fonts/glyphs/GisafSymbols/15360-15615.pbf new file mode 100644 index 0000000..9bd3495 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/15360-15615.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 15360-15615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/15616-15871.pbf b/src/assets/fonts/glyphs/GisafSymbols/15616-15871.pbf new file mode 100644 index 0000000..b5e4a07 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/15616-15871.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 15616-15871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/15872-16127.pbf b/src/assets/fonts/glyphs/GisafSymbols/15872-16127.pbf new file mode 100644 index 0000000..13d1a0b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/15872-16127.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 15872-16127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/16128-16383.pbf b/src/assets/fonts/glyphs/GisafSymbols/16128-16383.pbf new file mode 100644 index 0000000..da440c0 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/16128-16383.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 16128-16383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/16384-16639.pbf b/src/assets/fonts/glyphs/GisafSymbols/16384-16639.pbf new file mode 100644 index 0000000..1b303f5 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/16384-16639.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 16384-16639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/16640-16895.pbf b/src/assets/fonts/glyphs/GisafSymbols/16640-16895.pbf new file mode 100644 index 0000000..329c374 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/16640-16895.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 16640-16895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/16896-17151.pbf b/src/assets/fonts/glyphs/GisafSymbols/16896-17151.pbf new file mode 100644 index 0000000..2450eb3 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/16896-17151.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 16896-17151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/17152-17407.pbf b/src/assets/fonts/glyphs/GisafSymbols/17152-17407.pbf new file mode 100644 index 0000000..85c84e9 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/17152-17407.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 17152-17407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/17408-17663.pbf b/src/assets/fonts/glyphs/GisafSymbols/17408-17663.pbf new file mode 100644 index 0000000..06f8281 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/17408-17663.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 17408-17663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/17664-17919.pbf b/src/assets/fonts/glyphs/GisafSymbols/17664-17919.pbf new file mode 100644 index 0000000..f124e31 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/17664-17919.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 17664-17919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/1792-2047.pbf b/src/assets/fonts/glyphs/GisafSymbols/1792-2047.pbf new file mode 100644 index 0000000..98eb8b1 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/1792-2047.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 1792-2047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/17920-18175.pbf b/src/assets/fonts/glyphs/GisafSymbols/17920-18175.pbf new file mode 100644 index 0000000..1a0539a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/17920-18175.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 17920-18175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/18176-18431.pbf b/src/assets/fonts/glyphs/GisafSymbols/18176-18431.pbf new file mode 100644 index 0000000..2d0520e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/18176-18431.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 18176-18431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/18432-18687.pbf b/src/assets/fonts/glyphs/GisafSymbols/18432-18687.pbf new file mode 100644 index 0000000..45c7959 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/18432-18687.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 18432-18687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/18688-18943.pbf b/src/assets/fonts/glyphs/GisafSymbols/18688-18943.pbf new file mode 100644 index 0000000..d5774a2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/18688-18943.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 18688-18943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/18944-19199.pbf b/src/assets/fonts/glyphs/GisafSymbols/18944-19199.pbf new file mode 100644 index 0000000..db70435 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/18944-19199.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 18944-19199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/19200-19455.pbf b/src/assets/fonts/glyphs/GisafSymbols/19200-19455.pbf new file mode 100644 index 0000000..acd5c78 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/19200-19455.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 19200-19455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/19456-19711.pbf b/src/assets/fonts/glyphs/GisafSymbols/19456-19711.pbf new file mode 100644 index 0000000..f21d552 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/19456-19711.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 19456-19711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/19712-19967.pbf b/src/assets/fonts/glyphs/GisafSymbols/19712-19967.pbf new file mode 100644 index 0000000..d4a57c1 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/19712-19967.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 19712-19967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/19968-20223.pbf b/src/assets/fonts/glyphs/GisafSymbols/19968-20223.pbf new file mode 100644 index 0000000..5783d1d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/19968-20223.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 19968-20223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/20224-20479.pbf b/src/assets/fonts/glyphs/GisafSymbols/20224-20479.pbf new file mode 100644 index 0000000..2a86210 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/20224-20479.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 20224-20479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/2048-2303.pbf b/src/assets/fonts/glyphs/GisafSymbols/2048-2303.pbf new file mode 100644 index 0000000..8520830 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/2048-2303.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 2048-2303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/20480-20735.pbf b/src/assets/fonts/glyphs/GisafSymbols/20480-20735.pbf new file mode 100644 index 0000000..55b439f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/20480-20735.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 20480-20735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/20736-20991.pbf b/src/assets/fonts/glyphs/GisafSymbols/20736-20991.pbf new file mode 100644 index 0000000..204111e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/20736-20991.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 20736-20991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/20992-21247.pbf b/src/assets/fonts/glyphs/GisafSymbols/20992-21247.pbf new file mode 100644 index 0000000..5897a9d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/20992-21247.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 20992-21247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/21248-21503.pbf b/src/assets/fonts/glyphs/GisafSymbols/21248-21503.pbf new file mode 100644 index 0000000..9de2d0c --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/21248-21503.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 21248-21503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/21504-21759.pbf b/src/assets/fonts/glyphs/GisafSymbols/21504-21759.pbf new file mode 100644 index 0000000..10c9acb --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/21504-21759.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 21504-21759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/21760-22015.pbf b/src/assets/fonts/glyphs/GisafSymbols/21760-22015.pbf new file mode 100644 index 0000000..5f37417 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/21760-22015.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 21760-22015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/22016-22271.pbf b/src/assets/fonts/glyphs/GisafSymbols/22016-22271.pbf new file mode 100644 index 0000000..4ac62d2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/22016-22271.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 22016-22271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/22272-22527.pbf b/src/assets/fonts/glyphs/GisafSymbols/22272-22527.pbf new file mode 100644 index 0000000..f6628f2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/22272-22527.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 22272-22527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/22528-22783.pbf b/src/assets/fonts/glyphs/GisafSymbols/22528-22783.pbf new file mode 100644 index 0000000..bf44feb --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/22528-22783.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 22528-22783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/22784-23039.pbf b/src/assets/fonts/glyphs/GisafSymbols/22784-23039.pbf new file mode 100644 index 0000000..c42b414 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/22784-23039.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 22784-23039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/2304-2559.pbf b/src/assets/fonts/glyphs/GisafSymbols/2304-2559.pbf new file mode 100644 index 0000000..2362bee --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/2304-2559.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 2304-2559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/23040-23295.pbf b/src/assets/fonts/glyphs/GisafSymbols/23040-23295.pbf new file mode 100644 index 0000000..55eff7d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/23040-23295.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 23040-23295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/23296-23551.pbf b/src/assets/fonts/glyphs/GisafSymbols/23296-23551.pbf new file mode 100644 index 0000000..c4375e1 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/23296-23551.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 23296-23551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/23552-23807.pbf b/src/assets/fonts/glyphs/GisafSymbols/23552-23807.pbf new file mode 100644 index 0000000..6429b44 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/23552-23807.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 23552-23807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/23808-24063.pbf b/src/assets/fonts/glyphs/GisafSymbols/23808-24063.pbf new file mode 100644 index 0000000..fe0c675 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/23808-24063.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 23808-24063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/24064-24319.pbf b/src/assets/fonts/glyphs/GisafSymbols/24064-24319.pbf new file mode 100644 index 0000000..f463867 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/24064-24319.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 24064-24319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/24320-24575.pbf b/src/assets/fonts/glyphs/GisafSymbols/24320-24575.pbf new file mode 100644 index 0000000..e357836 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/24320-24575.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 24320-24575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/24576-24831.pbf b/src/assets/fonts/glyphs/GisafSymbols/24576-24831.pbf new file mode 100644 index 0000000..8d5f5c7 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/24576-24831.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 24576-24831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/24832-25087.pbf b/src/assets/fonts/glyphs/GisafSymbols/24832-25087.pbf new file mode 100644 index 0000000..0d9f4ee --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/24832-25087.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 24832-25087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/25088-25343.pbf b/src/assets/fonts/glyphs/GisafSymbols/25088-25343.pbf new file mode 100644 index 0000000..87c90c9 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/25088-25343.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 25088-25343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/25344-25599.pbf b/src/assets/fonts/glyphs/GisafSymbols/25344-25599.pbf new file mode 100644 index 0000000..a62af5b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/25344-25599.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 25344-25599 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/256-511.pbf b/src/assets/fonts/glyphs/GisafSymbols/256-511.pbf new file mode 100644 index 0000000..3827b1d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/256-511.pbf @@ -0,0 +1,3 @@ + + +GisafSymbols Regular256-511 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/2560-2815.pbf b/src/assets/fonts/glyphs/GisafSymbols/2560-2815.pbf new file mode 100644 index 0000000..10e929f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/2560-2815.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 2560-2815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/25600-25855.pbf b/src/assets/fonts/glyphs/GisafSymbols/25600-25855.pbf new file mode 100644 index 0000000..ec98c47 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/25600-25855.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 25600-25855 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/25856-26111.pbf b/src/assets/fonts/glyphs/GisafSymbols/25856-26111.pbf new file mode 100644 index 0000000..951bd0f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/25856-26111.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 25856-26111 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/26112-26367.pbf b/src/assets/fonts/glyphs/GisafSymbols/26112-26367.pbf new file mode 100644 index 0000000..34c7b6c --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/26112-26367.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 26112-26367 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/26368-26623.pbf b/src/assets/fonts/glyphs/GisafSymbols/26368-26623.pbf new file mode 100644 index 0000000..2b2bb0e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/26368-26623.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 26368-26623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/26624-26879.pbf b/src/assets/fonts/glyphs/GisafSymbols/26624-26879.pbf new file mode 100644 index 0000000..7cc3d77 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/26624-26879.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 26624-26879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/26880-27135.pbf b/src/assets/fonts/glyphs/GisafSymbols/26880-27135.pbf new file mode 100644 index 0000000..0a81005 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/26880-27135.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 26880-27135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/27136-27391.pbf b/src/assets/fonts/glyphs/GisafSymbols/27136-27391.pbf new file mode 100644 index 0000000..b332743 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/27136-27391.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 27136-27391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/27392-27647.pbf b/src/assets/fonts/glyphs/GisafSymbols/27392-27647.pbf new file mode 100644 index 0000000..313e1ae --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/27392-27647.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 27392-27647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/27648-27903.pbf b/src/assets/fonts/glyphs/GisafSymbols/27648-27903.pbf new file mode 100644 index 0000000..a449cd3 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/27648-27903.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 27648-27903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/27904-28159.pbf b/src/assets/fonts/glyphs/GisafSymbols/27904-28159.pbf new file mode 100644 index 0000000..4e5bcb4 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/27904-28159.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 27904-28159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/2816-3071.pbf b/src/assets/fonts/glyphs/GisafSymbols/2816-3071.pbf new file mode 100644 index 0000000..68bda0e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/2816-3071.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 2816-3071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/28160-28415.pbf b/src/assets/fonts/glyphs/GisafSymbols/28160-28415.pbf new file mode 100644 index 0000000..aa3ae7f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/28160-28415.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 28160-28415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/28416-28671.pbf b/src/assets/fonts/glyphs/GisafSymbols/28416-28671.pbf new file mode 100644 index 0000000..1c017fe --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/28416-28671.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 28416-28671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/28672-28927.pbf b/src/assets/fonts/glyphs/GisafSymbols/28672-28927.pbf new file mode 100644 index 0000000..b3e01b3 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/28672-28927.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 28672-28927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/28928-29183.pbf b/src/assets/fonts/glyphs/GisafSymbols/28928-29183.pbf new file mode 100644 index 0000000..8b42025 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/28928-29183.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 28928-29183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/29184-29439.pbf b/src/assets/fonts/glyphs/GisafSymbols/29184-29439.pbf new file mode 100644 index 0000000..2565beb --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/29184-29439.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 29184-29439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/29440-29695.pbf b/src/assets/fonts/glyphs/GisafSymbols/29440-29695.pbf new file mode 100644 index 0000000..986afaa --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/29440-29695.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 29440-29695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/29696-29951.pbf b/src/assets/fonts/glyphs/GisafSymbols/29696-29951.pbf new file mode 100644 index 0000000..c218e67 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/29696-29951.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 29696-29951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/29952-30207.pbf b/src/assets/fonts/glyphs/GisafSymbols/29952-30207.pbf new file mode 100644 index 0000000..b184a32 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/29952-30207.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 29952-30207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/30208-30463.pbf b/src/assets/fonts/glyphs/GisafSymbols/30208-30463.pbf new file mode 100644 index 0000000..3669894 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/30208-30463.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 30208-30463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/30464-30719.pbf b/src/assets/fonts/glyphs/GisafSymbols/30464-30719.pbf new file mode 100644 index 0000000..a152e91 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/30464-30719.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 30464-30719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/3072-3327.pbf b/src/assets/fonts/glyphs/GisafSymbols/3072-3327.pbf new file mode 100644 index 0000000..1b2c97f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/3072-3327.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 3072-3327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/30720-30975.pbf b/src/assets/fonts/glyphs/GisafSymbols/30720-30975.pbf new file mode 100644 index 0000000..156b7a7 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/30720-30975.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 30720-30975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/30976-31231.pbf b/src/assets/fonts/glyphs/GisafSymbols/30976-31231.pbf new file mode 100644 index 0000000..0bfcf92 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/30976-31231.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 30976-31231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/31232-31487.pbf b/src/assets/fonts/glyphs/GisafSymbols/31232-31487.pbf new file mode 100644 index 0000000..3496457 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/31232-31487.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 31232-31487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/31488-31743.pbf b/src/assets/fonts/glyphs/GisafSymbols/31488-31743.pbf new file mode 100644 index 0000000..d982669 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/31488-31743.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 31488-31743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/31744-31999.pbf b/src/assets/fonts/glyphs/GisafSymbols/31744-31999.pbf new file mode 100644 index 0000000..6fb8432 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/31744-31999.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 31744-31999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/32000-32255.pbf b/src/assets/fonts/glyphs/GisafSymbols/32000-32255.pbf new file mode 100644 index 0000000..56b653d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/32000-32255.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 32000-32255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/32256-32511.pbf b/src/assets/fonts/glyphs/GisafSymbols/32256-32511.pbf new file mode 100644 index 0000000..01549eb --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/32256-32511.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 32256-32511 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/32512-32767.pbf b/src/assets/fonts/glyphs/GisafSymbols/32512-32767.pbf new file mode 100644 index 0000000..81327ea --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/32512-32767.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 32512-32767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/32768-33023.pbf b/src/assets/fonts/glyphs/GisafSymbols/32768-33023.pbf new file mode 100644 index 0000000..53f73a7 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/32768-33023.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 32768-33023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/33024-33279.pbf b/src/assets/fonts/glyphs/GisafSymbols/33024-33279.pbf new file mode 100644 index 0000000..e210096 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/33024-33279.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 33024-33279 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/3328-3583.pbf b/src/assets/fonts/glyphs/GisafSymbols/3328-3583.pbf new file mode 100644 index 0000000..6081579 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/3328-3583.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 3328-3583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/33280-33535.pbf b/src/assets/fonts/glyphs/GisafSymbols/33280-33535.pbf new file mode 100644 index 0000000..c781026 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/33280-33535.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 33280-33535 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/33536-33791.pbf b/src/assets/fonts/glyphs/GisafSymbols/33536-33791.pbf new file mode 100644 index 0000000..9d2f586 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/33536-33791.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 33536-33791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/33792-34047.pbf b/src/assets/fonts/glyphs/GisafSymbols/33792-34047.pbf new file mode 100644 index 0000000..796fa9a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/33792-34047.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 33792-34047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/34048-34303.pbf b/src/assets/fonts/glyphs/GisafSymbols/34048-34303.pbf new file mode 100644 index 0000000..5f6157a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/34048-34303.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 34048-34303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/34304-34559.pbf b/src/assets/fonts/glyphs/GisafSymbols/34304-34559.pbf new file mode 100644 index 0000000..884b600 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/34304-34559.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 34304-34559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/34560-34815.pbf b/src/assets/fonts/glyphs/GisafSymbols/34560-34815.pbf new file mode 100644 index 0000000..0f7a4c0 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/34560-34815.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 34560-34815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/34816-35071.pbf b/src/assets/fonts/glyphs/GisafSymbols/34816-35071.pbf new file mode 100644 index 0000000..008284f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/34816-35071.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 34816-35071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/35072-35327.pbf b/src/assets/fonts/glyphs/GisafSymbols/35072-35327.pbf new file mode 100644 index 0000000..98c4c42 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/35072-35327.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 35072-35327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/35328-35583.pbf b/src/assets/fonts/glyphs/GisafSymbols/35328-35583.pbf new file mode 100644 index 0000000..8833d0e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/35328-35583.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 35328-35583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/35584-35839.pbf b/src/assets/fonts/glyphs/GisafSymbols/35584-35839.pbf new file mode 100644 index 0000000..8c5b883 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/35584-35839.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 35584-35839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/3584-3839.pbf b/src/assets/fonts/glyphs/GisafSymbols/3584-3839.pbf new file mode 100644 index 0000000..e690f07 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/3584-3839.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 3584-3839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/35840-36095.pbf b/src/assets/fonts/glyphs/GisafSymbols/35840-36095.pbf new file mode 100644 index 0000000..2e6e059 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/35840-36095.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 35840-36095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/36096-36351.pbf b/src/assets/fonts/glyphs/GisafSymbols/36096-36351.pbf new file mode 100644 index 0000000..ca5cd6e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/36096-36351.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 36096-36351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/36352-36607.pbf b/src/assets/fonts/glyphs/GisafSymbols/36352-36607.pbf new file mode 100644 index 0000000..7bb468e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/36352-36607.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 36352-36607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/36608-36863.pbf b/src/assets/fonts/glyphs/GisafSymbols/36608-36863.pbf new file mode 100644 index 0000000..4d0421c --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/36608-36863.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 36608-36863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/36864-37119.pbf b/src/assets/fonts/glyphs/GisafSymbols/36864-37119.pbf new file mode 100644 index 0000000..cc0dcd3 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/36864-37119.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 36864-37119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/37120-37375.pbf b/src/assets/fonts/glyphs/GisafSymbols/37120-37375.pbf new file mode 100644 index 0000000..03b6780 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/37120-37375.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 37120-37375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/37376-37631.pbf b/src/assets/fonts/glyphs/GisafSymbols/37376-37631.pbf new file mode 100644 index 0000000..65f5c22 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/37376-37631.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 37376-37631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/37632-37887.pbf b/src/assets/fonts/glyphs/GisafSymbols/37632-37887.pbf new file mode 100644 index 0000000..f82b8ee --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/37632-37887.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 37632-37887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/37888-38143.pbf b/src/assets/fonts/glyphs/GisafSymbols/37888-38143.pbf new file mode 100644 index 0000000..18bfe71 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/37888-38143.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 37888-38143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/38144-38399.pbf b/src/assets/fonts/glyphs/GisafSymbols/38144-38399.pbf new file mode 100644 index 0000000..1202381 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/38144-38399.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 38144-38399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/3840-4095.pbf b/src/assets/fonts/glyphs/GisafSymbols/3840-4095.pbf new file mode 100644 index 0000000..c52946c --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/3840-4095.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 3840-4095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/38400-38655.pbf b/src/assets/fonts/glyphs/GisafSymbols/38400-38655.pbf new file mode 100644 index 0000000..d6d0989 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/38400-38655.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 38400-38655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/38656-38911.pbf b/src/assets/fonts/glyphs/GisafSymbols/38656-38911.pbf new file mode 100644 index 0000000..55032ee --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/38656-38911.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 38656-38911 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/38912-39167.pbf b/src/assets/fonts/glyphs/GisafSymbols/38912-39167.pbf new file mode 100644 index 0000000..b70e6b2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/38912-39167.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 38912-39167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/39168-39423.pbf b/src/assets/fonts/glyphs/GisafSymbols/39168-39423.pbf new file mode 100644 index 0000000..01ba7e2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/39168-39423.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 39168-39423 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/39424-39679.pbf b/src/assets/fonts/glyphs/GisafSymbols/39424-39679.pbf new file mode 100644 index 0000000..2e683e9 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/39424-39679.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 39424-39679 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/39680-39935.pbf b/src/assets/fonts/glyphs/GisafSymbols/39680-39935.pbf new file mode 100644 index 0000000..615b8a8 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/39680-39935.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 39680-39935 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/39936-40191.pbf b/src/assets/fonts/glyphs/GisafSymbols/39936-40191.pbf new file mode 100644 index 0000000..6f1dd87 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/39936-40191.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 39936-40191 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/40192-40447.pbf b/src/assets/fonts/glyphs/GisafSymbols/40192-40447.pbf new file mode 100644 index 0000000..0dec40b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/40192-40447.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 40192-40447 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/40448-40703.pbf b/src/assets/fonts/glyphs/GisafSymbols/40448-40703.pbf new file mode 100644 index 0000000..d2d6ffd --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/40448-40703.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 40448-40703 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/40704-40959.pbf b/src/assets/fonts/glyphs/GisafSymbols/40704-40959.pbf new file mode 100644 index 0000000..1cc54a6 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/40704-40959.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 40704-40959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/4096-4351.pbf b/src/assets/fonts/glyphs/GisafSymbols/4096-4351.pbf new file mode 100644 index 0000000..175598e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/4096-4351.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 4096-4351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/40960-41215.pbf b/src/assets/fonts/glyphs/GisafSymbols/40960-41215.pbf new file mode 100644 index 0000000..3043e8c --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/40960-41215.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 40960-41215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/41216-41471.pbf b/src/assets/fonts/glyphs/GisafSymbols/41216-41471.pbf new file mode 100644 index 0000000..ebce30b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/41216-41471.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 41216-41471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/41472-41727.pbf b/src/assets/fonts/glyphs/GisafSymbols/41472-41727.pbf new file mode 100644 index 0000000..ff7dbd7 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/41472-41727.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 41472-41727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/41728-41983.pbf b/src/assets/fonts/glyphs/GisafSymbols/41728-41983.pbf new file mode 100644 index 0000000..e73542b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/41728-41983.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 41728-41983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/41984-42239.pbf b/src/assets/fonts/glyphs/GisafSymbols/41984-42239.pbf new file mode 100644 index 0000000..e2dad1f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/41984-42239.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 41984-42239 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/42240-42495.pbf b/src/assets/fonts/glyphs/GisafSymbols/42240-42495.pbf new file mode 100644 index 0000000..aed0154 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/42240-42495.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 42240-42495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/42496-42751.pbf b/src/assets/fonts/glyphs/GisafSymbols/42496-42751.pbf new file mode 100644 index 0000000..4ff4904 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/42496-42751.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 42496-42751 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/42752-43007.pbf b/src/assets/fonts/glyphs/GisafSymbols/42752-43007.pbf new file mode 100644 index 0000000..2ef42b7 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/42752-43007.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 42752-43007 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/43008-43263.pbf b/src/assets/fonts/glyphs/GisafSymbols/43008-43263.pbf new file mode 100644 index 0000000..2f2c670 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/43008-43263.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 43008-43263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/43264-43519.pbf b/src/assets/fonts/glyphs/GisafSymbols/43264-43519.pbf new file mode 100644 index 0000000..3795685 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/43264-43519.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 43264-43519 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/4352-4607.pbf b/src/assets/fonts/glyphs/GisafSymbols/4352-4607.pbf new file mode 100644 index 0000000..a730224 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/4352-4607.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 4352-4607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/43520-43775.pbf b/src/assets/fonts/glyphs/GisafSymbols/43520-43775.pbf new file mode 100644 index 0000000..2b2f3ec --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/43520-43775.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 43520-43775 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/43776-44031.pbf b/src/assets/fonts/glyphs/GisafSymbols/43776-44031.pbf new file mode 100644 index 0000000..5e99010 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/43776-44031.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 43776-44031 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/44032-44287.pbf b/src/assets/fonts/glyphs/GisafSymbols/44032-44287.pbf new file mode 100644 index 0000000..3ab7186 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/44032-44287.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 44032-44287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/44288-44543.pbf b/src/assets/fonts/glyphs/GisafSymbols/44288-44543.pbf new file mode 100644 index 0000000..d3b9a12 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/44288-44543.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 44288-44543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/44544-44799.pbf b/src/assets/fonts/glyphs/GisafSymbols/44544-44799.pbf new file mode 100644 index 0000000..fe5a05b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/44544-44799.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 44544-44799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/44800-45055.pbf b/src/assets/fonts/glyphs/GisafSymbols/44800-45055.pbf new file mode 100644 index 0000000..aafff28 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/44800-45055.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 44800-45055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/45056-45311.pbf b/src/assets/fonts/glyphs/GisafSymbols/45056-45311.pbf new file mode 100644 index 0000000..1790bf4 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/45056-45311.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 45056-45311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/45312-45567.pbf b/src/assets/fonts/glyphs/GisafSymbols/45312-45567.pbf new file mode 100644 index 0000000..9f6070b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/45312-45567.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 45312-45567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/45568-45823.pbf b/src/assets/fonts/glyphs/GisafSymbols/45568-45823.pbf new file mode 100644 index 0000000..933ee3e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/45568-45823.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 45568-45823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/45824-46079.pbf b/src/assets/fonts/glyphs/GisafSymbols/45824-46079.pbf new file mode 100644 index 0000000..559e2b4 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/45824-46079.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 45824-46079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/4608-4863.pbf b/src/assets/fonts/glyphs/GisafSymbols/4608-4863.pbf new file mode 100644 index 0000000..e81f72a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/4608-4863.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 4608-4863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/46080-46335.pbf b/src/assets/fonts/glyphs/GisafSymbols/46080-46335.pbf new file mode 100644 index 0000000..9a8071d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/46080-46335.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 46080-46335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/46336-46591.pbf b/src/assets/fonts/glyphs/GisafSymbols/46336-46591.pbf new file mode 100644 index 0000000..066f531 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/46336-46591.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 46336-46591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/46592-46847.pbf b/src/assets/fonts/glyphs/GisafSymbols/46592-46847.pbf new file mode 100644 index 0000000..eebabc3 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/46592-46847.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 46592-46847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/46848-47103.pbf b/src/assets/fonts/glyphs/GisafSymbols/46848-47103.pbf new file mode 100644 index 0000000..96ab270 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/46848-47103.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 46848-47103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/47104-47359.pbf b/src/assets/fonts/glyphs/GisafSymbols/47104-47359.pbf new file mode 100644 index 0000000..0ab9cc1 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/47104-47359.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 47104-47359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/47360-47615.pbf b/src/assets/fonts/glyphs/GisafSymbols/47360-47615.pbf new file mode 100644 index 0000000..4e3a56b --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/47360-47615.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 47360-47615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/47616-47871.pbf b/src/assets/fonts/glyphs/GisafSymbols/47616-47871.pbf new file mode 100644 index 0000000..3319a98 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/47616-47871.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 47616-47871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/47872-48127.pbf b/src/assets/fonts/glyphs/GisafSymbols/47872-48127.pbf new file mode 100644 index 0000000..80aa9e2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/47872-48127.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 47872-48127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/48128-48383.pbf b/src/assets/fonts/glyphs/GisafSymbols/48128-48383.pbf new file mode 100644 index 0000000..0500648 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/48128-48383.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 48128-48383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/48384-48639.pbf b/src/assets/fonts/glyphs/GisafSymbols/48384-48639.pbf new file mode 100644 index 0000000..30b9973 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/48384-48639.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 48384-48639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/4864-5119.pbf b/src/assets/fonts/glyphs/GisafSymbols/4864-5119.pbf new file mode 100644 index 0000000..ddca6ab --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/4864-5119.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 4864-5119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/48640-48895.pbf b/src/assets/fonts/glyphs/GisafSymbols/48640-48895.pbf new file mode 100644 index 0000000..2f40c94 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/48640-48895.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 48640-48895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/48896-49151.pbf b/src/assets/fonts/glyphs/GisafSymbols/48896-49151.pbf new file mode 100644 index 0000000..20e95a1 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/48896-49151.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 48896-49151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/49152-49407.pbf b/src/assets/fonts/glyphs/GisafSymbols/49152-49407.pbf new file mode 100644 index 0000000..6a6ac9d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/49152-49407.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 49152-49407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/49408-49663.pbf b/src/assets/fonts/glyphs/GisafSymbols/49408-49663.pbf new file mode 100644 index 0000000..2b01166 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/49408-49663.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 49408-49663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/49664-49919.pbf b/src/assets/fonts/glyphs/GisafSymbols/49664-49919.pbf new file mode 100644 index 0000000..c0f7928 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/49664-49919.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 49664-49919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/49920-50175.pbf b/src/assets/fonts/glyphs/GisafSymbols/49920-50175.pbf new file mode 100644 index 0000000..4655317 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/49920-50175.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 49920-50175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/50176-50431.pbf b/src/assets/fonts/glyphs/GisafSymbols/50176-50431.pbf new file mode 100644 index 0000000..b1b49ac --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/50176-50431.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 50176-50431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/50432-50687.pbf b/src/assets/fonts/glyphs/GisafSymbols/50432-50687.pbf new file mode 100644 index 0000000..dd7ba3e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/50432-50687.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 50432-50687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/50688-50943.pbf b/src/assets/fonts/glyphs/GisafSymbols/50688-50943.pbf new file mode 100644 index 0000000..c97c5a4 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/50688-50943.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 50688-50943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/50944-51199.pbf b/src/assets/fonts/glyphs/GisafSymbols/50944-51199.pbf new file mode 100644 index 0000000..de22bf5 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/50944-51199.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 50944-51199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/512-767.pbf b/src/assets/fonts/glyphs/GisafSymbols/512-767.pbf new file mode 100644 index 0000000..8d0a751 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/512-767.pbf @@ -0,0 +1,3 @@ + + +GisafSymbols Regular512-767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/5120-5375.pbf b/src/assets/fonts/glyphs/GisafSymbols/5120-5375.pbf new file mode 100644 index 0000000..e402adf --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/5120-5375.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 5120-5375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/51200-51455.pbf b/src/assets/fonts/glyphs/GisafSymbols/51200-51455.pbf new file mode 100644 index 0000000..4b545fc --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/51200-51455.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 51200-51455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/51456-51711.pbf b/src/assets/fonts/glyphs/GisafSymbols/51456-51711.pbf new file mode 100644 index 0000000..e0ab677 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/51456-51711.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 51456-51711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/51712-51967.pbf b/src/assets/fonts/glyphs/GisafSymbols/51712-51967.pbf new file mode 100644 index 0000000..d19aa36 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/51712-51967.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 51712-51967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/51968-52223.pbf b/src/assets/fonts/glyphs/GisafSymbols/51968-52223.pbf new file mode 100644 index 0000000..af86c7f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/51968-52223.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 51968-52223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/52224-52479.pbf b/src/assets/fonts/glyphs/GisafSymbols/52224-52479.pbf new file mode 100644 index 0000000..6a6d974 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/52224-52479.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 52224-52479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/52480-52735.pbf b/src/assets/fonts/glyphs/GisafSymbols/52480-52735.pbf new file mode 100644 index 0000000..69a988f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/52480-52735.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 52480-52735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/52736-52991.pbf b/src/assets/fonts/glyphs/GisafSymbols/52736-52991.pbf new file mode 100644 index 0000000..bec1f3a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/52736-52991.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 52736-52991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/52992-53247.pbf b/src/assets/fonts/glyphs/GisafSymbols/52992-53247.pbf new file mode 100644 index 0000000..81052f5 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/52992-53247.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 52992-53247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/53248-53503.pbf b/src/assets/fonts/glyphs/GisafSymbols/53248-53503.pbf new file mode 100644 index 0000000..1b04e1a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/53248-53503.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 53248-53503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/53504-53759.pbf b/src/assets/fonts/glyphs/GisafSymbols/53504-53759.pbf new file mode 100644 index 0000000..65b781a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/53504-53759.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 53504-53759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/5376-5631.pbf b/src/assets/fonts/glyphs/GisafSymbols/5376-5631.pbf new file mode 100644 index 0000000..ee62b6d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/5376-5631.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 5376-5631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/53760-54015.pbf b/src/assets/fonts/glyphs/GisafSymbols/53760-54015.pbf new file mode 100644 index 0000000..57c7897 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/53760-54015.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 53760-54015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/54016-54271.pbf b/src/assets/fonts/glyphs/GisafSymbols/54016-54271.pbf new file mode 100644 index 0000000..70fce34 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/54016-54271.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 54016-54271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/54272-54527.pbf b/src/assets/fonts/glyphs/GisafSymbols/54272-54527.pbf new file mode 100644 index 0000000..10bdf1d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/54272-54527.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 54272-54527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/54528-54783.pbf b/src/assets/fonts/glyphs/GisafSymbols/54528-54783.pbf new file mode 100644 index 0000000..34aee4a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/54528-54783.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 54528-54783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/54784-55039.pbf b/src/assets/fonts/glyphs/GisafSymbols/54784-55039.pbf new file mode 100644 index 0000000..ba6dc1e --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/54784-55039.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 54784-55039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/55040-55295.pbf b/src/assets/fonts/glyphs/GisafSymbols/55040-55295.pbf new file mode 100644 index 0000000..dc21520 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/55040-55295.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 55040-55295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/55296-55551.pbf b/src/assets/fonts/glyphs/GisafSymbols/55296-55551.pbf new file mode 100644 index 0000000..c7a2d78 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/55296-55551.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 55296-55551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/55552-55807.pbf b/src/assets/fonts/glyphs/GisafSymbols/55552-55807.pbf new file mode 100644 index 0000000..abe3ad8 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/55552-55807.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 55552-55807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/55808-56063.pbf b/src/assets/fonts/glyphs/GisafSymbols/55808-56063.pbf new file mode 100644 index 0000000..4526851 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/55808-56063.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 55808-56063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/56064-56319.pbf b/src/assets/fonts/glyphs/GisafSymbols/56064-56319.pbf new file mode 100644 index 0000000..9559ad7 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/56064-56319.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 56064-56319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/5632-5887.pbf b/src/assets/fonts/glyphs/GisafSymbols/5632-5887.pbf new file mode 100644 index 0000000..3bf0710 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/5632-5887.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 5632-5887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/56320-56575.pbf b/src/assets/fonts/glyphs/GisafSymbols/56320-56575.pbf new file mode 100644 index 0000000..c072d48 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/56320-56575.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 56320-56575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/56576-56831.pbf b/src/assets/fonts/glyphs/GisafSymbols/56576-56831.pbf new file mode 100644 index 0000000..3d18178 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/56576-56831.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 56576-56831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/56832-57087.pbf b/src/assets/fonts/glyphs/GisafSymbols/56832-57087.pbf new file mode 100644 index 0000000..6e1d490 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/56832-57087.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 56832-57087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/57088-57343.pbf b/src/assets/fonts/glyphs/GisafSymbols/57088-57343.pbf new file mode 100644 index 0000000..16322ad --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/57088-57343.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 57088-57343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/57344-57599.pbf b/src/assets/fonts/glyphs/GisafSymbols/57344-57599.pbf new file mode 100644 index 0000000..dfa46d8 Binary files /dev/null and b/src/assets/fonts/glyphs/GisafSymbols/57344-57599.pbf differ diff --git a/src/assets/fonts/glyphs/GisafSymbols/57600-57855.pbf b/src/assets/fonts/glyphs/GisafSymbols/57600-57855.pbf new file mode 100644 index 0000000..d7b9b63 Binary files /dev/null and b/src/assets/fonts/glyphs/GisafSymbols/57600-57855.pbf differ diff --git a/src/assets/fonts/glyphs/GisafSymbols/57856-58111.pbf b/src/assets/fonts/glyphs/GisafSymbols/57856-58111.pbf new file mode 100644 index 0000000..9b03ad3 Binary files /dev/null and b/src/assets/fonts/glyphs/GisafSymbols/57856-58111.pbf differ diff --git a/src/assets/fonts/glyphs/GisafSymbols/58112-58367.pbf b/src/assets/fonts/glyphs/GisafSymbols/58112-58367.pbf new file mode 100644 index 0000000..fb7c358 Binary files /dev/null and b/src/assets/fonts/glyphs/GisafSymbols/58112-58367.pbf differ diff --git a/src/assets/fonts/glyphs/GisafSymbols/58368-58623.pbf b/src/assets/fonts/glyphs/GisafSymbols/58368-58623.pbf new file mode 100644 index 0000000..f9cb5ba --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/58368-58623.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 58368-58623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/58624-58879.pbf b/src/assets/fonts/glyphs/GisafSymbols/58624-58879.pbf new file mode 100644 index 0000000..16c5ee1 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/58624-58879.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 58624-58879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/5888-6143.pbf b/src/assets/fonts/glyphs/GisafSymbols/5888-6143.pbf new file mode 100644 index 0000000..6d74262 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/5888-6143.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 5888-6143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/58880-59135.pbf b/src/assets/fonts/glyphs/GisafSymbols/58880-59135.pbf new file mode 100644 index 0000000..13e2ddc --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/58880-59135.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 58880-59135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/59136-59391.pbf b/src/assets/fonts/glyphs/GisafSymbols/59136-59391.pbf new file mode 100644 index 0000000..311659a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/59136-59391.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 59136-59391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/59392-59647.pbf b/src/assets/fonts/glyphs/GisafSymbols/59392-59647.pbf new file mode 100644 index 0000000..b1bb291 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/59392-59647.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 59392-59647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/59648-59903.pbf b/src/assets/fonts/glyphs/GisafSymbols/59648-59903.pbf new file mode 100644 index 0000000..5c941a9 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/59648-59903.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 59648-59903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/59904-60159.pbf b/src/assets/fonts/glyphs/GisafSymbols/59904-60159.pbf new file mode 100644 index 0000000..30953ee --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/59904-60159.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 59904-60159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/60160-60415.pbf b/src/assets/fonts/glyphs/GisafSymbols/60160-60415.pbf new file mode 100644 index 0000000..3af2206 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/60160-60415.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 60160-60415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/60416-60671.pbf b/src/assets/fonts/glyphs/GisafSymbols/60416-60671.pbf new file mode 100644 index 0000000..a4ad3d8 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/60416-60671.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 60416-60671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/60672-60927.pbf b/src/assets/fonts/glyphs/GisafSymbols/60672-60927.pbf new file mode 100644 index 0000000..edde614 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/60672-60927.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 60672-60927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/60928-61183.pbf b/src/assets/fonts/glyphs/GisafSymbols/60928-61183.pbf new file mode 100644 index 0000000..55f38ec --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/60928-61183.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 60928-61183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/61184-61439.pbf b/src/assets/fonts/glyphs/GisafSymbols/61184-61439.pbf new file mode 100644 index 0000000..373c068 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/61184-61439.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 61184-61439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/6144-6399.pbf b/src/assets/fonts/glyphs/GisafSymbols/6144-6399.pbf new file mode 100644 index 0000000..85a78e5 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/6144-6399.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 6144-6399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/61440-61695.pbf b/src/assets/fonts/glyphs/GisafSymbols/61440-61695.pbf new file mode 100644 index 0000000..1384b73 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/61440-61695.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 61440-61695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/61696-61951.pbf b/src/assets/fonts/glyphs/GisafSymbols/61696-61951.pbf new file mode 100644 index 0000000..60fcd45 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/61696-61951.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 61696-61951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/61952-62207.pbf b/src/assets/fonts/glyphs/GisafSymbols/61952-62207.pbf new file mode 100644 index 0000000..139e527 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/61952-62207.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 61952-62207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/62208-62463.pbf b/src/assets/fonts/glyphs/GisafSymbols/62208-62463.pbf new file mode 100644 index 0000000..27a61d9 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/62208-62463.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 62208-62463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/62464-62719.pbf b/src/assets/fonts/glyphs/GisafSymbols/62464-62719.pbf new file mode 100644 index 0000000..bb9c730 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/62464-62719.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 62464-62719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/62720-62975.pbf b/src/assets/fonts/glyphs/GisafSymbols/62720-62975.pbf new file mode 100644 index 0000000..c29460d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/62720-62975.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 62720-62975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/62976-63231.pbf b/src/assets/fonts/glyphs/GisafSymbols/62976-63231.pbf new file mode 100644 index 0000000..4cc054f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/62976-63231.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 62976-63231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/63232-63487.pbf b/src/assets/fonts/glyphs/GisafSymbols/63232-63487.pbf new file mode 100644 index 0000000..6628416 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/63232-63487.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 63232-63487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/63488-63743.pbf b/src/assets/fonts/glyphs/GisafSymbols/63488-63743.pbf new file mode 100644 index 0000000..e756ba0 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/63488-63743.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 63488-63743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/63744-63999.pbf b/src/assets/fonts/glyphs/GisafSymbols/63744-63999.pbf new file mode 100644 index 0000000..d63a16d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/63744-63999.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 63744-63999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/6400-6655.pbf b/src/assets/fonts/glyphs/GisafSymbols/6400-6655.pbf new file mode 100644 index 0000000..fac8e85 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/6400-6655.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 6400-6655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/64000-64255.pbf b/src/assets/fonts/glyphs/GisafSymbols/64000-64255.pbf new file mode 100644 index 0000000..e657433 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/64000-64255.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 64000-64255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/64256-64511.pbf b/src/assets/fonts/glyphs/GisafSymbols/64256-64511.pbf new file mode 100644 index 0000000..f41675a --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/64256-64511.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 64256-64511 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/64512-64767.pbf b/src/assets/fonts/glyphs/GisafSymbols/64512-64767.pbf new file mode 100644 index 0000000..43af2a1 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/64512-64767.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 64512-64767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/64768-65023.pbf b/src/assets/fonts/glyphs/GisafSymbols/64768-65023.pbf new file mode 100644 index 0000000..994d00f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/64768-65023.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 64768-65023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/65024-65279.pbf b/src/assets/fonts/glyphs/GisafSymbols/65024-65279.pbf new file mode 100644 index 0000000..da1e9bb --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/65024-65279.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 65024-65279 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/65280-65535.pbf b/src/assets/fonts/glyphs/GisafSymbols/65280-65535.pbf new file mode 100644 index 0000000..274400f --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/65280-65535.pbf @@ -0,0 +1,3 @@ + +# +GisafSymbols Regular 65280-65535 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/6656-6911.pbf b/src/assets/fonts/glyphs/GisafSymbols/6656-6911.pbf new file mode 100644 index 0000000..b4aa626 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/6656-6911.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 6656-6911 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/6912-7167.pbf b/src/assets/fonts/glyphs/GisafSymbols/6912-7167.pbf new file mode 100644 index 0000000..f306de4 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/6912-7167.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 6912-7167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/7168-7423.pbf b/src/assets/fonts/glyphs/GisafSymbols/7168-7423.pbf new file mode 100644 index 0000000..954cf31 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/7168-7423.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 7168-7423 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/7424-7679.pbf b/src/assets/fonts/glyphs/GisafSymbols/7424-7679.pbf new file mode 100644 index 0000000..50a5597 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/7424-7679.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 7424-7679 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/768-1023.pbf b/src/assets/fonts/glyphs/GisafSymbols/768-1023.pbf new file mode 100644 index 0000000..416b085 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/768-1023.pbf @@ -0,0 +1,3 @@ + + +GisafSymbols Regular768-1023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/7680-7935.pbf b/src/assets/fonts/glyphs/GisafSymbols/7680-7935.pbf new file mode 100644 index 0000000..d818bf4 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/7680-7935.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 7680-7935 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/7936-8191.pbf b/src/assets/fonts/glyphs/GisafSymbols/7936-8191.pbf new file mode 100644 index 0000000..7040790 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/7936-8191.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 7936-8191 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/8192-8447.pbf b/src/assets/fonts/glyphs/GisafSymbols/8192-8447.pbf new file mode 100644 index 0000000..3c08e9d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/8192-8447.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 8192-8447 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/8448-8703.pbf b/src/assets/fonts/glyphs/GisafSymbols/8448-8703.pbf new file mode 100644 index 0000000..f6c68d5 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/8448-8703.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 8448-8703 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/8704-8959.pbf b/src/assets/fonts/glyphs/GisafSymbols/8704-8959.pbf new file mode 100644 index 0000000..5e0afa2 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/8704-8959.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 8704-8959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/8960-9215.pbf b/src/assets/fonts/glyphs/GisafSymbols/8960-9215.pbf new file mode 100644 index 0000000..f141c90 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/8960-9215.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 8960-9215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/9216-9471.pbf b/src/assets/fonts/glyphs/GisafSymbols/9216-9471.pbf new file mode 100644 index 0000000..3c11d87 --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/9216-9471.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 9216-9471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/9472-9727.pbf b/src/assets/fonts/glyphs/GisafSymbols/9472-9727.pbf new file mode 100644 index 0000000..6c0c25d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/9472-9727.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 9472-9727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/9728-9983.pbf b/src/assets/fonts/glyphs/GisafSymbols/9728-9983.pbf new file mode 100644 index 0000000..472736c --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/9728-9983.pbf @@ -0,0 +1,3 @@ + +! +GisafSymbols Regular 9728-9983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/GisafSymbols/9984-10239.pbf b/src/assets/fonts/glyphs/GisafSymbols/9984-10239.pbf new file mode 100644 index 0000000..37ac87d --- /dev/null +++ b/src/assets/fonts/glyphs/GisafSymbols/9984-10239.pbf @@ -0,0 +1,4 @@ + +" +GisafSymbols Regular +9984-10239 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/0-255.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/0-255.pbf new file mode 100644 index 0000000..449deea Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/0-255.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/1024-1279.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/1024-1279.pbf new file mode 100644 index 0000000..0f9110d Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/1024-1279.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/10240-10495.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/10240-10495.pbf new file mode 100644 index 0000000..6d814e9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/10240-10495.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 10240-10495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/10496-10751.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/10496-10751.pbf new file mode 100644 index 0000000..137018d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/10496-10751.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 10496-10751 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/10752-11007.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/10752-11007.pbf new file mode 100644 index 0000000..2203a84 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/10752-11007.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 10752-11007 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/11008-11263.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/11008-11263.pbf new file mode 100644 index 0000000..7be7a67 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/11008-11263.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 11008-11263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/11264-11519.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/11264-11519.pbf new file mode 100644 index 0000000..2a0a167 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/11264-11519.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/11520-11775.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/11520-11775.pbf new file mode 100644 index 0000000..2537cbb Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/11520-11775.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/11776-12031.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/11776-12031.pbf new file mode 100644 index 0000000..9fd68f6 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/11776-12031.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/12032-12287.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/12032-12287.pbf new file mode 100644 index 0000000..c102a30 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/12032-12287.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 12032-12287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/12288-12543.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/12288-12543.pbf new file mode 100644 index 0000000..4f8d440 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/12288-12543.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 12288-12543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/12544-12799.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/12544-12799.pbf new file mode 100644 index 0000000..557807e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/12544-12799.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 12544-12799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/1280-1535.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/1280-1535.pbf new file mode 100644 index 0000000..67e9d82 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/1280-1535.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/12800-13055.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/12800-13055.pbf new file mode 100644 index 0000000..51e624b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/12800-13055.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 12800-13055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/13056-13311.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/13056-13311.pbf new file mode 100644 index 0000000..f9a8b5e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/13056-13311.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 13056-13311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/13312-13567.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/13312-13567.pbf new file mode 100644 index 0000000..d16fc60 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/13312-13567.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 13312-13567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/13568-13823.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/13568-13823.pbf new file mode 100644 index 0000000..489446e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/13568-13823.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 13568-13823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/13824-14079.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/13824-14079.pbf new file mode 100644 index 0000000..cbc322d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/13824-14079.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 13824-14079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/14080-14335.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/14080-14335.pbf new file mode 100644 index 0000000..a798fbc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/14080-14335.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 14080-14335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/14336-14591.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/14336-14591.pbf new file mode 100644 index 0000000..bc8f462 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/14336-14591.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 14336-14591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/14592-14847.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/14592-14847.pbf new file mode 100644 index 0000000..0f3fb3a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/14592-14847.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 14592-14847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/14848-15103.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/14848-15103.pbf new file mode 100644 index 0000000..b5802c5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/14848-15103.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 14848-15103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/15104-15359.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/15104-15359.pbf new file mode 100644 index 0000000..e6aaef8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/15104-15359.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 15104-15359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/1536-1791.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/1536-1791.pbf new file mode 100644 index 0000000..3088024 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/1536-1791.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 1536-1791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/15360-15615.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/15360-15615.pbf new file mode 100644 index 0000000..7040e42 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/15360-15615.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 15360-15615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/15616-15871.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/15616-15871.pbf new file mode 100644 index 0000000..d32123e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/15616-15871.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 15616-15871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/15872-16127.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/15872-16127.pbf new file mode 100644 index 0000000..27055cb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/15872-16127.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 15872-16127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/16128-16383.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/16128-16383.pbf new file mode 100644 index 0000000..a887533 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/16128-16383.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 16128-16383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/16384-16639.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/16384-16639.pbf new file mode 100644 index 0000000..e1eceb1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/16384-16639.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 16384-16639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/16640-16895.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/16640-16895.pbf new file mode 100644 index 0000000..d4209c4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/16640-16895.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 16640-16895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/16896-17151.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/16896-17151.pbf new file mode 100644 index 0000000..f769104 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/16896-17151.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 16896-17151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/17152-17407.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/17152-17407.pbf new file mode 100644 index 0000000..7de85fe --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/17152-17407.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 17152-17407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/17408-17663.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/17408-17663.pbf new file mode 100644 index 0000000..6f2eb05 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/17408-17663.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 17408-17663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/17664-17919.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/17664-17919.pbf new file mode 100644 index 0000000..470fcfd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/17664-17919.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 17664-17919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/1792-2047.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/1792-2047.pbf new file mode 100644 index 0000000..f72a8ad --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/1792-2047.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 1792-2047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/17920-18175.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/17920-18175.pbf new file mode 100644 index 0000000..811a000 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/17920-18175.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 17920-18175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/18176-18431.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/18176-18431.pbf new file mode 100644 index 0000000..c799970 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/18176-18431.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 18176-18431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/18432-18687.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/18432-18687.pbf new file mode 100644 index 0000000..2e62272 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/18432-18687.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 18432-18687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/18688-18943.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/18688-18943.pbf new file mode 100644 index 0000000..55f33d3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/18688-18943.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 18688-18943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/18944-19199.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/18944-19199.pbf new file mode 100644 index 0000000..276c3c2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/18944-19199.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 18944-19199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/19200-19455.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/19200-19455.pbf new file mode 100644 index 0000000..96bc219 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/19200-19455.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 19200-19455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/19456-19711.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/19456-19711.pbf new file mode 100644 index 0000000..17f642f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/19456-19711.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 19456-19711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/19712-19967.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/19712-19967.pbf new file mode 100644 index 0000000..f66d081 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/19712-19967.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 19712-19967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/19968-20223.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/19968-20223.pbf new file mode 100644 index 0000000..469f142 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/19968-20223.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 19968-20223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/20224-20479.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/20224-20479.pbf new file mode 100644 index 0000000..1999957 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/20224-20479.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 20224-20479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/2048-2303.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/2048-2303.pbf new file mode 100644 index 0000000..9f5ef44 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/2048-2303.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 2048-2303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/20480-20735.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/20480-20735.pbf new file mode 100644 index 0000000..69d6076 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/20480-20735.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 20480-20735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/20736-20991.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/20736-20991.pbf new file mode 100644 index 0000000..5570d1c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/20736-20991.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 20736-20991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/20992-21247.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/20992-21247.pbf new file mode 100644 index 0000000..8fa0761 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/20992-21247.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 20992-21247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/21248-21503.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/21248-21503.pbf new file mode 100644 index 0000000..27644d6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/21248-21503.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 21248-21503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/21504-21759.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/21504-21759.pbf new file mode 100644 index 0000000..72bc8f0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/21504-21759.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 21504-21759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/21760-22015.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/21760-22015.pbf new file mode 100644 index 0000000..3c74c0f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/21760-22015.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 21760-22015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/22016-22271.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/22016-22271.pbf new file mode 100644 index 0000000..f7d2a04 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/22016-22271.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 22016-22271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/22272-22527.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/22272-22527.pbf new file mode 100644 index 0000000..f5aecdb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/22272-22527.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 22272-22527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/22528-22783.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/22528-22783.pbf new file mode 100644 index 0000000..f6816d0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/22528-22783.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 22528-22783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/22784-23039.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/22784-23039.pbf new file mode 100644 index 0000000..99874db --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/22784-23039.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 22784-23039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/2304-2559.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/2304-2559.pbf new file mode 100644 index 0000000..21bc470 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/2304-2559.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 2304-2559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/23040-23295.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/23040-23295.pbf new file mode 100644 index 0000000..c3456ad --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/23040-23295.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 23040-23295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/23296-23551.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/23296-23551.pbf new file mode 100644 index 0000000..ff91d90 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/23296-23551.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 23296-23551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/23552-23807.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/23552-23807.pbf new file mode 100644 index 0000000..5754a47 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/23552-23807.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 23552-23807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/23808-24063.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/23808-24063.pbf new file mode 100644 index 0000000..18e03b4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/23808-24063.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 23808-24063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/24064-24319.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/24064-24319.pbf new file mode 100644 index 0000000..2217ced --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/24064-24319.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 24064-24319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/24320-24575.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/24320-24575.pbf new file mode 100644 index 0000000..346af82 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/24320-24575.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 24320-24575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/24576-24831.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/24576-24831.pbf new file mode 100644 index 0000000..c826382 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/24576-24831.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 24576-24831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/24832-25087.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/24832-25087.pbf new file mode 100644 index 0000000..3369b41 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/24832-25087.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 24832-25087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/25088-25343.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/25088-25343.pbf new file mode 100644 index 0000000..af00107 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/25088-25343.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 25088-25343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/25344-25599.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/25344-25599.pbf new file mode 100644 index 0000000..66a162f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/25344-25599.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 25344-25599 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/256-511.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/256-511.pbf new file mode 100644 index 0000000..0bff339 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/256-511.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/2560-2815.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/2560-2815.pbf new file mode 100644 index 0000000..97f9c88 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/2560-2815.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 2560-2815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/25600-25855.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/25600-25855.pbf new file mode 100644 index 0000000..2f55711 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/25600-25855.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 25600-25855 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/25856-26111.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/25856-26111.pbf new file mode 100644 index 0000000..311d925 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/25856-26111.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 25856-26111 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/26112-26367.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/26112-26367.pbf new file mode 100644 index 0000000..6a00244 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/26112-26367.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 26112-26367 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/26368-26623.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/26368-26623.pbf new file mode 100644 index 0000000..e0e00c1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/26368-26623.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 26368-26623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/26624-26879.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/26624-26879.pbf new file mode 100644 index 0000000..0a7ad2a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/26624-26879.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 26624-26879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/26880-27135.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/26880-27135.pbf new file mode 100644 index 0000000..1ca845a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/26880-27135.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 26880-27135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/27136-27391.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/27136-27391.pbf new file mode 100644 index 0000000..eb05272 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/27136-27391.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 27136-27391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/27392-27647.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/27392-27647.pbf new file mode 100644 index 0000000..4376976 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/27392-27647.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 27392-27647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/27648-27903.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/27648-27903.pbf new file mode 100644 index 0000000..073b70b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/27648-27903.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 27648-27903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/27904-28159.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/27904-28159.pbf new file mode 100644 index 0000000..fda9312 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/27904-28159.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 27904-28159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/2816-3071.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/2816-3071.pbf new file mode 100644 index 0000000..51c2d76 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/2816-3071.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 2816-3071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/28160-28415.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/28160-28415.pbf new file mode 100644 index 0000000..ebec463 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/28160-28415.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 28160-28415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/28416-28671.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/28416-28671.pbf new file mode 100644 index 0000000..e930822 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/28416-28671.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 28416-28671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/28672-28927.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/28672-28927.pbf new file mode 100644 index 0000000..e9d95ce --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/28672-28927.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 28672-28927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/28928-29183.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/28928-29183.pbf new file mode 100644 index 0000000..887c9d2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/28928-29183.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 28928-29183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/29184-29439.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/29184-29439.pbf new file mode 100644 index 0000000..7915fed --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/29184-29439.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 29184-29439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/29440-29695.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/29440-29695.pbf new file mode 100644 index 0000000..e9ae7f6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/29440-29695.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 29440-29695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/29696-29951.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/29696-29951.pbf new file mode 100644 index 0000000..9776dd4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/29696-29951.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 29696-29951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/29952-30207.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/29952-30207.pbf new file mode 100644 index 0000000..51331ca --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/29952-30207.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 29952-30207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/30208-30463.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/30208-30463.pbf new file mode 100644 index 0000000..43d7dd4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/30208-30463.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 30208-30463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/30464-30719.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/30464-30719.pbf new file mode 100644 index 0000000..66953cf --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/30464-30719.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 30464-30719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/3072-3327.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/3072-3327.pbf new file mode 100644 index 0000000..b485dde --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/3072-3327.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 3072-3327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/30720-30975.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/30720-30975.pbf new file mode 100644 index 0000000..00dce24 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/30720-30975.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 30720-30975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/30976-31231.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/30976-31231.pbf new file mode 100644 index 0000000..de35f45 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/30976-31231.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 30976-31231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/31232-31487.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/31232-31487.pbf new file mode 100644 index 0000000..50cc15a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/31232-31487.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 31232-31487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/31488-31743.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/31488-31743.pbf new file mode 100644 index 0000000..db12f48 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/31488-31743.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 31488-31743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/31744-31999.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/31744-31999.pbf new file mode 100644 index 0000000..23029fb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/31744-31999.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 31744-31999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/32000-32255.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/32000-32255.pbf new file mode 100644 index 0000000..01ea9be --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/32000-32255.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 32000-32255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/32256-32511.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/32256-32511.pbf new file mode 100644 index 0000000..298a0c9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/32256-32511.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 32256-32511 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/32512-32767.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/32512-32767.pbf new file mode 100644 index 0000000..6edf2fe --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/32512-32767.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 32512-32767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/32768-33023.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/32768-33023.pbf new file mode 100644 index 0000000..3592082 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/32768-33023.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 32768-33023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/33024-33279.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/33024-33279.pbf new file mode 100644 index 0000000..9a6c78b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/33024-33279.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 33024-33279 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/3328-3583.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/3328-3583.pbf new file mode 100644 index 0000000..3363d6e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/3328-3583.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 3328-3583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/33280-33535.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/33280-33535.pbf new file mode 100644 index 0000000..95cbf8f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/33280-33535.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 33280-33535 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/33536-33791.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/33536-33791.pbf new file mode 100644 index 0000000..31bff95 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/33536-33791.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 33536-33791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/33792-34047.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/33792-34047.pbf new file mode 100644 index 0000000..2911920 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/33792-34047.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 33792-34047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/34048-34303.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/34048-34303.pbf new file mode 100644 index 0000000..6a40dc3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/34048-34303.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 34048-34303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/34304-34559.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/34304-34559.pbf new file mode 100644 index 0000000..2a1ae36 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/34304-34559.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 34304-34559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/34560-34815.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/34560-34815.pbf new file mode 100644 index 0000000..7e8015c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/34560-34815.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 34560-34815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/34816-35071.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/34816-35071.pbf new file mode 100644 index 0000000..cc12033 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/34816-35071.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 34816-35071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/35072-35327.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/35072-35327.pbf new file mode 100644 index 0000000..51cae4a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/35072-35327.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 35072-35327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/35328-35583.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/35328-35583.pbf new file mode 100644 index 0000000..599454e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/35328-35583.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 35328-35583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/35584-35839.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/35584-35839.pbf new file mode 100644 index 0000000..1dbb54b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/35584-35839.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 35584-35839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/3584-3839.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/3584-3839.pbf new file mode 100644 index 0000000..4ebb2b6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/3584-3839.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 3584-3839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/35840-36095.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/35840-36095.pbf new file mode 100644 index 0000000..87db399 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/35840-36095.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 35840-36095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/36096-36351.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/36096-36351.pbf new file mode 100644 index 0000000..9a529c9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/36096-36351.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 36096-36351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/36352-36607.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/36352-36607.pbf new file mode 100644 index 0000000..5a6f938 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/36352-36607.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 36352-36607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/36608-36863.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/36608-36863.pbf new file mode 100644 index 0000000..7df4e70 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/36608-36863.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 36608-36863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/36864-37119.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/36864-37119.pbf new file mode 100644 index 0000000..07db67f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/36864-37119.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 36864-37119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/37120-37375.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/37120-37375.pbf new file mode 100644 index 0000000..a90912d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/37120-37375.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 37120-37375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/37376-37631.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/37376-37631.pbf new file mode 100644 index 0000000..7354a9d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/37376-37631.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 37376-37631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/37632-37887.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/37632-37887.pbf new file mode 100644 index 0000000..4d89145 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/37632-37887.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 37632-37887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/37888-38143.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/37888-38143.pbf new file mode 100644 index 0000000..60d11f2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/37888-38143.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 37888-38143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/38144-38399.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/38144-38399.pbf new file mode 100644 index 0000000..b90a03f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/38144-38399.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 38144-38399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/3840-4095.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/3840-4095.pbf new file mode 100644 index 0000000..f66a413 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/3840-4095.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 3840-4095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/38400-38655.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/38400-38655.pbf new file mode 100644 index 0000000..6c6d371 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/38400-38655.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 38400-38655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/38656-38911.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/38656-38911.pbf new file mode 100644 index 0000000..f0f7d4e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/38656-38911.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 38656-38911 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/38912-39167.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/38912-39167.pbf new file mode 100644 index 0000000..892c3b5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/38912-39167.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 38912-39167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/39168-39423.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/39168-39423.pbf new file mode 100644 index 0000000..77d45f7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/39168-39423.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 39168-39423 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/39424-39679.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/39424-39679.pbf new file mode 100644 index 0000000..2d8bc55 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/39424-39679.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 39424-39679 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/39680-39935.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/39680-39935.pbf new file mode 100644 index 0000000..1cae594 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/39680-39935.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 39680-39935 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/39936-40191.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/39936-40191.pbf new file mode 100644 index 0000000..a88c9ef --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/39936-40191.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 39936-40191 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/40192-40447.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/40192-40447.pbf new file mode 100644 index 0000000..e49d1cc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/40192-40447.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 40192-40447 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/40448-40703.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/40448-40703.pbf new file mode 100644 index 0000000..93fc022 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/40448-40703.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 40448-40703 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/40704-40959.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/40704-40959.pbf new file mode 100644 index 0000000..421d7fa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/40704-40959.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 40704-40959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/4096-4351.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/4096-4351.pbf new file mode 100644 index 0000000..b0340b9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/4096-4351.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 4096-4351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/40960-41215.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/40960-41215.pbf new file mode 100644 index 0000000..9d5a701 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/40960-41215.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 40960-41215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/41216-41471.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/41216-41471.pbf new file mode 100644 index 0000000..c2d22aa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/41216-41471.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 41216-41471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/41472-41727.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/41472-41727.pbf new file mode 100644 index 0000000..5d06204 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/41472-41727.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 41472-41727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/41728-41983.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/41728-41983.pbf new file mode 100644 index 0000000..f9b1961 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/41728-41983.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 41728-41983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/41984-42239.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/41984-42239.pbf new file mode 100644 index 0000000..ba3392e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/41984-42239.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 41984-42239 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/42240-42495.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/42240-42495.pbf new file mode 100644 index 0000000..543bd75 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/42240-42495.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 42240-42495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/42496-42751.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/42496-42751.pbf new file mode 100644 index 0000000..1057613 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/42496-42751.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/42752-43007.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/42752-43007.pbf new file mode 100644 index 0000000..5f786da Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/42752-43007.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/43008-43263.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/43008-43263.pbf new file mode 100644 index 0000000..1e2cd55 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/43008-43263.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 43008-43263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/43264-43519.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/43264-43519.pbf new file mode 100644 index 0000000..670dee9 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/43264-43519.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/4352-4607.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/4352-4607.pbf new file mode 100644 index 0000000..e41870c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/4352-4607.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 4352-4607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/43520-43775.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/43520-43775.pbf new file mode 100644 index 0000000..b4bd4da --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/43520-43775.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 43520-43775 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/43776-44031.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/43776-44031.pbf new file mode 100644 index 0000000..7f6e1b1 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/43776-44031.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/44032-44287.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/44032-44287.pbf new file mode 100644 index 0000000..19a3992 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/44032-44287.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 44032-44287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/44288-44543.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/44288-44543.pbf new file mode 100644 index 0000000..a61f0ef --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/44288-44543.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 44288-44543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/44544-44799.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/44544-44799.pbf new file mode 100644 index 0000000..b189200 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/44544-44799.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 44544-44799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/44800-45055.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/44800-45055.pbf new file mode 100644 index 0000000..9172083 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/44800-45055.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 44800-45055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/45056-45311.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/45056-45311.pbf new file mode 100644 index 0000000..8a2adee --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/45056-45311.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 45056-45311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/45312-45567.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/45312-45567.pbf new file mode 100644 index 0000000..1b49a6e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/45312-45567.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 45312-45567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/45568-45823.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/45568-45823.pbf new file mode 100644 index 0000000..a4823c3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/45568-45823.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 45568-45823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/45824-46079.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/45824-46079.pbf new file mode 100644 index 0000000..33ee166 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/45824-46079.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 45824-46079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/4608-4863.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/4608-4863.pbf new file mode 100644 index 0000000..c395a75 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/4608-4863.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 4608-4863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/46080-46335.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/46080-46335.pbf new file mode 100644 index 0000000..fea983b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/46080-46335.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 46080-46335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/46336-46591.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/46336-46591.pbf new file mode 100644 index 0000000..1cddc40 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/46336-46591.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 46336-46591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/46592-46847.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/46592-46847.pbf new file mode 100644 index 0000000..5ca9c9b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/46592-46847.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 46592-46847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/46848-47103.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/46848-47103.pbf new file mode 100644 index 0000000..6cd7519 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/46848-47103.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 46848-47103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/47104-47359.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/47104-47359.pbf new file mode 100644 index 0000000..e560668 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/47104-47359.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 47104-47359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/47360-47615.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/47360-47615.pbf new file mode 100644 index 0000000..c19dea9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/47360-47615.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 47360-47615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/47616-47871.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/47616-47871.pbf new file mode 100644 index 0000000..87de915 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/47616-47871.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 47616-47871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/47872-48127.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/47872-48127.pbf new file mode 100644 index 0000000..188d2c9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/47872-48127.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 47872-48127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/48128-48383.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/48128-48383.pbf new file mode 100644 index 0000000..4a98639 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/48128-48383.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 48128-48383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/48384-48639.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/48384-48639.pbf new file mode 100644 index 0000000..2ee1deb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/48384-48639.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 48384-48639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/4864-5119.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/4864-5119.pbf new file mode 100644 index 0000000..f1bbc0b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/4864-5119.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 4864-5119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/48640-48895.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/48640-48895.pbf new file mode 100644 index 0000000..6836230 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/48640-48895.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 48640-48895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/48896-49151.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/48896-49151.pbf new file mode 100644 index 0000000..2d08277 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/48896-49151.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 48896-49151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/49152-49407.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/49152-49407.pbf new file mode 100644 index 0000000..0c6e98a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/49152-49407.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 49152-49407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/49408-49663.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/49408-49663.pbf new file mode 100644 index 0000000..2dbe866 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/49408-49663.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 49408-49663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/49664-49919.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/49664-49919.pbf new file mode 100644 index 0000000..a1d3e0a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/49664-49919.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 49664-49919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/49920-50175.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/49920-50175.pbf new file mode 100644 index 0000000..83abdc2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/49920-50175.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 49920-50175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/50176-50431.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/50176-50431.pbf new file mode 100644 index 0000000..1522f0d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/50176-50431.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 50176-50431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/50432-50687.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/50432-50687.pbf new file mode 100644 index 0000000..5c93d55 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/50432-50687.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 50432-50687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/50688-50943.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/50688-50943.pbf new file mode 100644 index 0000000..c7a040b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/50688-50943.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 50688-50943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/50944-51199.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/50944-51199.pbf new file mode 100644 index 0000000..3185d49 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/50944-51199.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 50944-51199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/512-767.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/512-767.pbf new file mode 100644 index 0000000..4c53917 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/512-767.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/5120-5375.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/5120-5375.pbf new file mode 100644 index 0000000..b88115e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/5120-5375.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 5120-5375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/51200-51455.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/51200-51455.pbf new file mode 100644 index 0000000..e159bb8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/51200-51455.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 51200-51455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/51456-51711.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/51456-51711.pbf new file mode 100644 index 0000000..344a894 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/51456-51711.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 51456-51711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/51712-51967.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/51712-51967.pbf new file mode 100644 index 0000000..c2f8355 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/51712-51967.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 51712-51967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/51968-52223.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/51968-52223.pbf new file mode 100644 index 0000000..7c2bfe2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/51968-52223.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 51968-52223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/52224-52479.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/52224-52479.pbf new file mode 100644 index 0000000..0bbe69d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/52224-52479.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 52224-52479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/52480-52735.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/52480-52735.pbf new file mode 100644 index 0000000..60c757a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/52480-52735.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 52480-52735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/52736-52991.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/52736-52991.pbf new file mode 100644 index 0000000..6cf29ee --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/52736-52991.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 52736-52991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/52992-53247.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/52992-53247.pbf new file mode 100644 index 0000000..093b95b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/52992-53247.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 52992-53247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/53248-53503.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/53248-53503.pbf new file mode 100644 index 0000000..748ba71 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/53248-53503.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 53248-53503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/53504-53759.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/53504-53759.pbf new file mode 100644 index 0000000..0fd1723 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/53504-53759.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 53504-53759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/5376-5631.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/5376-5631.pbf new file mode 100644 index 0000000..6145670 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/5376-5631.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 5376-5631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/53760-54015.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/53760-54015.pbf new file mode 100644 index 0000000..4bfc5a6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/53760-54015.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 53760-54015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/54016-54271.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/54016-54271.pbf new file mode 100644 index 0000000..e5a0b4c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/54016-54271.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 54016-54271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/54272-54527.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/54272-54527.pbf new file mode 100644 index 0000000..73d48fa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/54272-54527.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 54272-54527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/54528-54783.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/54528-54783.pbf new file mode 100644 index 0000000..0cf6eca --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/54528-54783.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 54528-54783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/54784-55039.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/54784-55039.pbf new file mode 100644 index 0000000..9e2bbb6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/54784-55039.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 54784-55039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/55040-55295.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/55040-55295.pbf new file mode 100644 index 0000000..f9e0260 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/55040-55295.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 55040-55295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/55296-55551.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/55296-55551.pbf new file mode 100644 index 0000000..12b76d2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/55296-55551.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 55296-55551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/55552-55807.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/55552-55807.pbf new file mode 100644 index 0000000..9571f86 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/55552-55807.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 55552-55807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/55808-56063.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/55808-56063.pbf new file mode 100644 index 0000000..c7487dc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/55808-56063.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 55808-56063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/56064-56319.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/56064-56319.pbf new file mode 100644 index 0000000..484d6bd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/56064-56319.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 56064-56319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/5632-5887.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/5632-5887.pbf new file mode 100644 index 0000000..a9ece78 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/5632-5887.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 5632-5887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/56320-56575.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/56320-56575.pbf new file mode 100644 index 0000000..316ce6a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/56320-56575.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 56320-56575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/56576-56831.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/56576-56831.pbf new file mode 100644 index 0000000..e3b97df --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/56576-56831.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 56576-56831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/56832-57087.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/56832-57087.pbf new file mode 100644 index 0000000..6745026 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/56832-57087.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 56832-57087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/57088-57343.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/57088-57343.pbf new file mode 100644 index 0000000..11c3b4a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/57088-57343.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 57088-57343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/57344-57599.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/57344-57599.pbf new file mode 100644 index 0000000..405daa3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/57344-57599.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 57344-57599 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/57600-57855.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/57600-57855.pbf new file mode 100644 index 0000000..05e2338 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/57600-57855.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 57600-57855 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/57856-58111.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/57856-58111.pbf new file mode 100644 index 0000000..6914b70 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/57856-58111.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 57856-58111 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/58112-58367.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/58112-58367.pbf new file mode 100644 index 0000000..903c1a3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/58112-58367.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 58112-58367 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/58368-58623.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/58368-58623.pbf new file mode 100644 index 0000000..e8c2490 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/58368-58623.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 58368-58623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/58624-58879.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/58624-58879.pbf new file mode 100644 index 0000000..8e265bb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/58624-58879.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 58624-58879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/5888-6143.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/5888-6143.pbf new file mode 100644 index 0000000..d382095 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/5888-6143.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 5888-6143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/58880-59135.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/58880-59135.pbf new file mode 100644 index 0000000..9fded37 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/58880-59135.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 58880-59135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/59136-59391.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/59136-59391.pbf new file mode 100644 index 0000000..fc2d8c5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/59136-59391.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 59136-59391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/59392-59647.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/59392-59647.pbf new file mode 100644 index 0000000..7dd053a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/59392-59647.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 59392-59647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/59648-59903.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/59648-59903.pbf new file mode 100644 index 0000000..26d7971 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/59648-59903.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 59648-59903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/59904-60159.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/59904-60159.pbf new file mode 100644 index 0000000..959a5b1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/59904-60159.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 59904-60159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/60160-60415.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/60160-60415.pbf new file mode 100644 index 0000000..b7f44c4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/60160-60415.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 60160-60415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/60416-60671.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/60416-60671.pbf new file mode 100644 index 0000000..e1491ce --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/60416-60671.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 60416-60671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/60672-60927.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/60672-60927.pbf new file mode 100644 index 0000000..c2048d8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/60672-60927.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 60672-60927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/60928-61183.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/60928-61183.pbf new file mode 100644 index 0000000..df0330f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/60928-61183.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 60928-61183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/61184-61439.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/61184-61439.pbf new file mode 100644 index 0000000..4611ed7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/61184-61439.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 61184-61439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/6144-6399.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/6144-6399.pbf new file mode 100644 index 0000000..d5ef0d3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/6144-6399.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 6144-6399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/61440-61695.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/61440-61695.pbf new file mode 100644 index 0000000..fee1414 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/61440-61695.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 61440-61695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/61696-61951.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/61696-61951.pbf new file mode 100644 index 0000000..476556b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/61696-61951.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 61696-61951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/61952-62207.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/61952-62207.pbf new file mode 100644 index 0000000..582dd5d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/61952-62207.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 61952-62207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/62208-62463.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/62208-62463.pbf new file mode 100644 index 0000000..64f7dde --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/62208-62463.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 62208-62463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/62464-62719.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/62464-62719.pbf new file mode 100644 index 0000000..be911af --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/62464-62719.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 62464-62719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/62720-62975.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/62720-62975.pbf new file mode 100644 index 0000000..28f528d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/62720-62975.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 62720-62975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/62976-63231.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/62976-63231.pbf new file mode 100644 index 0000000..70c883a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/62976-63231.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 62976-63231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/63232-63487.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/63232-63487.pbf new file mode 100644 index 0000000..1c8b9e2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/63232-63487.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 63232-63487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/63488-63743.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/63488-63743.pbf new file mode 100644 index 0000000..c9f6608 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/63488-63743.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 63488-63743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/63744-63999.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/63744-63999.pbf new file mode 100644 index 0000000..38d7d7a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/63744-63999.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 63744-63999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/6400-6655.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/6400-6655.pbf new file mode 100644 index 0000000..5e7d7cc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/6400-6655.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 6400-6655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/64000-64255.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/64000-64255.pbf new file mode 100644 index 0000000..9755c45 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/64000-64255.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 64000-64255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/64256-64511.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/64256-64511.pbf new file mode 100644 index 0000000..3d832ee Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/64256-64511.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/64512-64767.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/64512-64767.pbf new file mode 100644 index 0000000..6453856 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/64512-64767.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 64512-64767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/64768-65023.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/64768-65023.pbf new file mode 100644 index 0000000..bb800da --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/64768-65023.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 64768-65023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/65024-65279.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/65024-65279.pbf new file mode 100644 index 0000000..a93f4c1 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/65024-65279.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/65280-65535.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/65280-65535.pbf new file mode 100644 index 0000000..3693555 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/65280-65535.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/6656-6911.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/6656-6911.pbf new file mode 100644 index 0000000..c75e3f0 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/6656-6911.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/6912-7167.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/6912-7167.pbf new file mode 100644 index 0000000..3713b70 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/6912-7167.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 6912-7167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/7168-7423.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/7168-7423.pbf new file mode 100644 index 0000000..8d22ae5 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/7168-7423.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/7424-7679.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/7424-7679.pbf new file mode 100644 index 0000000..df53d8a Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/7424-7679.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/768-1023.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/768-1023.pbf new file mode 100644 index 0000000..82ad3bc Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/768-1023.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/7680-7935.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/7680-7935.pbf new file mode 100644 index 0000000..ba5a3c0 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/7680-7935.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/7936-8191.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/7936-8191.pbf new file mode 100644 index 0000000..c11fa96 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/7936-8191.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/8192-8447.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/8192-8447.pbf new file mode 100644 index 0000000..f95eadd Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/8192-8447.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/8448-8703.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/8448-8703.pbf new file mode 100644 index 0000000..4dd4dd6 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Bold/8448-8703.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/8704-8959.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/8704-8959.pbf new file mode 100644 index 0000000..782619e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/8704-8959.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 8704-8959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/8960-9215.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/8960-9215.pbf new file mode 100644 index 0000000..6f1480d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/8960-9215.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 8960-9215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/9216-9471.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/9216-9471.pbf new file mode 100644 index 0000000..55e5ac9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/9216-9471.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 9216-9471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/9472-9727.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/9472-9727.pbf new file mode 100644 index 0000000..fef3904 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/9472-9727.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 9472-9727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/9728-9983.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/9728-9983.pbf new file mode 100644 index 0000000..2ec083d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/9728-9983.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Bold 9728-9983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Bold/9984-10239.pbf b/src/assets/fonts/glyphs/Noto Sans Bold/9984-10239.pbf new file mode 100644 index 0000000..9bcb570 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Bold/9984-10239.pbf @@ -0,0 +1,4 @@ + + +Noto Sans Bold +9984-10239 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/0-255.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/0-255.pbf new file mode 100644 index 0000000..c1d96da Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/0-255.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/1024-1279.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/1024-1279.pbf new file mode 100644 index 0000000..cbf24f8 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/1024-1279.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/10240-10495.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/10240-10495.pbf new file mode 100644 index 0000000..2642581 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/10240-10495.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 10240-10495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/10496-10751.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/10496-10751.pbf new file mode 100644 index 0000000..7359094 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/10496-10751.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 10496-10751 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/10752-11007.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/10752-11007.pbf new file mode 100644 index 0000000..6b2dff3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/10752-11007.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 10752-11007 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/11008-11263.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/11008-11263.pbf new file mode 100644 index 0000000..15630af --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/11008-11263.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 11008-11263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/11264-11519.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/11264-11519.pbf new file mode 100644 index 0000000..ab248e0 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/11264-11519.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/11520-11775.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/11520-11775.pbf new file mode 100644 index 0000000..c6a5028 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/11520-11775.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/11776-12031.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/11776-12031.pbf new file mode 100644 index 0000000..3752844 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/11776-12031.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/12032-12287.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/12032-12287.pbf new file mode 100644 index 0000000..4499997 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/12032-12287.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 12032-12287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/12288-12543.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/12288-12543.pbf new file mode 100644 index 0000000..dfc8c6b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/12288-12543.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 12288-12543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/12544-12799.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/12544-12799.pbf new file mode 100644 index 0000000..97e1e6a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/12544-12799.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 12544-12799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/1280-1535.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/1280-1535.pbf new file mode 100644 index 0000000..a5f75af Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/1280-1535.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/12800-13055.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/12800-13055.pbf new file mode 100644 index 0000000..bd7df23 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/12800-13055.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 12800-13055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/13056-13311.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/13056-13311.pbf new file mode 100644 index 0000000..e2216d0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/13056-13311.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 13056-13311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/13312-13567.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/13312-13567.pbf new file mode 100644 index 0000000..487b551 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/13312-13567.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 13312-13567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/13568-13823.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/13568-13823.pbf new file mode 100644 index 0000000..5e92f83 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/13568-13823.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 13568-13823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/13824-14079.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/13824-14079.pbf new file mode 100644 index 0000000..1af0b3e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/13824-14079.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 13824-14079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/14080-14335.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/14080-14335.pbf new file mode 100644 index 0000000..7c6f26e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/14080-14335.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 14080-14335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/14336-14591.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/14336-14591.pbf new file mode 100644 index 0000000..ed8e2ee --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/14336-14591.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 14336-14591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/14592-14847.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/14592-14847.pbf new file mode 100644 index 0000000..d62698f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/14592-14847.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 14592-14847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/14848-15103.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/14848-15103.pbf new file mode 100644 index 0000000..3524eee --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/14848-15103.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 14848-15103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/15104-15359.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/15104-15359.pbf new file mode 100644 index 0000000..bd53acc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/15104-15359.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 15104-15359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/1536-1791.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/1536-1791.pbf new file mode 100644 index 0000000..7fc1456 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/1536-1791.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 1536-1791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/15360-15615.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/15360-15615.pbf new file mode 100644 index 0000000..82ebba5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/15360-15615.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 15360-15615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/15616-15871.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/15616-15871.pbf new file mode 100644 index 0000000..9aefa13 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/15616-15871.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 15616-15871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/15872-16127.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/15872-16127.pbf new file mode 100644 index 0000000..efa8d2d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/15872-16127.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 15872-16127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/16128-16383.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/16128-16383.pbf new file mode 100644 index 0000000..d24e939 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/16128-16383.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 16128-16383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/16384-16639.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/16384-16639.pbf new file mode 100644 index 0000000..732747e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/16384-16639.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 16384-16639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/16640-16895.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/16640-16895.pbf new file mode 100644 index 0000000..39a7666 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/16640-16895.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 16640-16895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/16896-17151.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/16896-17151.pbf new file mode 100644 index 0000000..0d0319b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/16896-17151.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 16896-17151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/17152-17407.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/17152-17407.pbf new file mode 100644 index 0000000..6051fc0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/17152-17407.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 17152-17407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/17408-17663.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/17408-17663.pbf new file mode 100644 index 0000000..5d4e09f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/17408-17663.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 17408-17663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/17664-17919.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/17664-17919.pbf new file mode 100644 index 0000000..43f707e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/17664-17919.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 17664-17919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/1792-2047.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/1792-2047.pbf new file mode 100644 index 0000000..d43914d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/1792-2047.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 1792-2047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/17920-18175.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/17920-18175.pbf new file mode 100644 index 0000000..da48188 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/17920-18175.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 17920-18175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/18176-18431.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/18176-18431.pbf new file mode 100644 index 0000000..2581bd7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/18176-18431.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 18176-18431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/18432-18687.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/18432-18687.pbf new file mode 100644 index 0000000..263a6f2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/18432-18687.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 18432-18687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/18688-18943.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/18688-18943.pbf new file mode 100644 index 0000000..5eb457b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/18688-18943.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 18688-18943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/18944-19199.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/18944-19199.pbf new file mode 100644 index 0000000..32c381a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/18944-19199.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 18944-19199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/19200-19455.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/19200-19455.pbf new file mode 100644 index 0000000..cce727f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/19200-19455.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 19200-19455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/19456-19711.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/19456-19711.pbf new file mode 100644 index 0000000..b473016 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/19456-19711.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 19456-19711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/19712-19967.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/19712-19967.pbf new file mode 100644 index 0000000..6582953 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/19712-19967.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 19712-19967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/19968-20223.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/19968-20223.pbf new file mode 100644 index 0000000..5adf309 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/19968-20223.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 19968-20223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/20224-20479.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/20224-20479.pbf new file mode 100644 index 0000000..f0fdfa7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/20224-20479.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 20224-20479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/2048-2303.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/2048-2303.pbf new file mode 100644 index 0000000..020e387 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/2048-2303.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 2048-2303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/20480-20735.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/20480-20735.pbf new file mode 100644 index 0000000..670517f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/20480-20735.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 20480-20735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/20736-20991.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/20736-20991.pbf new file mode 100644 index 0000000..84b878e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/20736-20991.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 20736-20991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/20992-21247.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/20992-21247.pbf new file mode 100644 index 0000000..49b476d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/20992-21247.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 20992-21247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/21248-21503.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/21248-21503.pbf new file mode 100644 index 0000000..c97f71b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/21248-21503.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 21248-21503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/21504-21759.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/21504-21759.pbf new file mode 100644 index 0000000..390dfda --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/21504-21759.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 21504-21759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/21760-22015.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/21760-22015.pbf new file mode 100644 index 0000000..848b314 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/21760-22015.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 21760-22015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/22016-22271.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/22016-22271.pbf new file mode 100644 index 0000000..dc836e4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/22016-22271.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 22016-22271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/22272-22527.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/22272-22527.pbf new file mode 100644 index 0000000..05463f7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/22272-22527.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 22272-22527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/22528-22783.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/22528-22783.pbf new file mode 100644 index 0000000..28ea2e9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/22528-22783.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 22528-22783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/22784-23039.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/22784-23039.pbf new file mode 100644 index 0000000..cb63cdd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/22784-23039.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 22784-23039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/2304-2559.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/2304-2559.pbf new file mode 100644 index 0000000..b0efa91 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/2304-2559.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 2304-2559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/23040-23295.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/23040-23295.pbf new file mode 100644 index 0000000..0fc9ec7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/23040-23295.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 23040-23295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/23296-23551.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/23296-23551.pbf new file mode 100644 index 0000000..848b131 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/23296-23551.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 23296-23551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/23552-23807.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/23552-23807.pbf new file mode 100644 index 0000000..ece31cd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/23552-23807.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 23552-23807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/23808-24063.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/23808-24063.pbf new file mode 100644 index 0000000..42c78fe --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/23808-24063.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 23808-24063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/24064-24319.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/24064-24319.pbf new file mode 100644 index 0000000..f282d4e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/24064-24319.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 24064-24319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/24320-24575.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/24320-24575.pbf new file mode 100644 index 0000000..fdb0ab6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/24320-24575.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 24320-24575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/24576-24831.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/24576-24831.pbf new file mode 100644 index 0000000..d2e2849 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/24576-24831.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 24576-24831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/24832-25087.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/24832-25087.pbf new file mode 100644 index 0000000..00e3583 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/24832-25087.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 24832-25087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/25088-25343.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/25088-25343.pbf new file mode 100644 index 0000000..049a3d4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/25088-25343.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 25088-25343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/25344-25599.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/25344-25599.pbf new file mode 100644 index 0000000..5752e32 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/25344-25599.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 25344-25599 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/256-511.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/256-511.pbf new file mode 100644 index 0000000..37410da Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/256-511.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/2560-2815.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/2560-2815.pbf new file mode 100644 index 0000000..ffef503 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/2560-2815.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 2560-2815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/25600-25855.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/25600-25855.pbf new file mode 100644 index 0000000..bdee7e0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/25600-25855.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 25600-25855 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/25856-26111.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/25856-26111.pbf new file mode 100644 index 0000000..262b77e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/25856-26111.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 25856-26111 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/26112-26367.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/26112-26367.pbf new file mode 100644 index 0000000..24bd948 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/26112-26367.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 26112-26367 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/26368-26623.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/26368-26623.pbf new file mode 100644 index 0000000..0df601f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/26368-26623.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 26368-26623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/26624-26879.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/26624-26879.pbf new file mode 100644 index 0000000..95b95fc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/26624-26879.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 26624-26879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/26880-27135.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/26880-27135.pbf new file mode 100644 index 0000000..8acaa4e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/26880-27135.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 26880-27135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/27136-27391.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/27136-27391.pbf new file mode 100644 index 0000000..298e7cd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/27136-27391.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 27136-27391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/27392-27647.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/27392-27647.pbf new file mode 100644 index 0000000..bfa12b9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/27392-27647.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 27392-27647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/27648-27903.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/27648-27903.pbf new file mode 100644 index 0000000..065b864 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/27648-27903.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 27648-27903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/27904-28159.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/27904-28159.pbf new file mode 100644 index 0000000..a76a2ee --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/27904-28159.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 27904-28159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/2816-3071.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/2816-3071.pbf new file mode 100644 index 0000000..4148d35 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/2816-3071.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 2816-3071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/28160-28415.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/28160-28415.pbf new file mode 100644 index 0000000..8b779af --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/28160-28415.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 28160-28415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/28416-28671.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/28416-28671.pbf new file mode 100644 index 0000000..113b8f9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/28416-28671.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 28416-28671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/28672-28927.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/28672-28927.pbf new file mode 100644 index 0000000..1c1076e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/28672-28927.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 28672-28927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/28928-29183.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/28928-29183.pbf new file mode 100644 index 0000000..3364699 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/28928-29183.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 28928-29183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/29184-29439.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/29184-29439.pbf new file mode 100644 index 0000000..0211047 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/29184-29439.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 29184-29439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/29440-29695.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/29440-29695.pbf new file mode 100644 index 0000000..2725f0e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/29440-29695.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 29440-29695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/29696-29951.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/29696-29951.pbf new file mode 100644 index 0000000..d4fa4ef --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/29696-29951.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 29696-29951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/29952-30207.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/29952-30207.pbf new file mode 100644 index 0000000..7754904 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/29952-30207.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 29952-30207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/30208-30463.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/30208-30463.pbf new file mode 100644 index 0000000..0ed03be --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/30208-30463.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 30208-30463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/30464-30719.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/30464-30719.pbf new file mode 100644 index 0000000..ce9b7ea --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/30464-30719.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 30464-30719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/3072-3327.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/3072-3327.pbf new file mode 100644 index 0000000..e407088 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/3072-3327.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 3072-3327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/30720-30975.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/30720-30975.pbf new file mode 100644 index 0000000..ab38523 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/30720-30975.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 30720-30975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/30976-31231.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/30976-31231.pbf new file mode 100644 index 0000000..30162da --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/30976-31231.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 30976-31231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/31232-31487.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/31232-31487.pbf new file mode 100644 index 0000000..10b829e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/31232-31487.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 31232-31487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/31488-31743.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/31488-31743.pbf new file mode 100644 index 0000000..c1a787f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/31488-31743.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 31488-31743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/31744-31999.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/31744-31999.pbf new file mode 100644 index 0000000..ec51133 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/31744-31999.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 31744-31999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/32000-32255.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/32000-32255.pbf new file mode 100644 index 0000000..3929788 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/32000-32255.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 32000-32255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/32256-32511.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/32256-32511.pbf new file mode 100644 index 0000000..d70bf14 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/32256-32511.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 32256-32511 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/32512-32767.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/32512-32767.pbf new file mode 100644 index 0000000..9e48626 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/32512-32767.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 32512-32767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/32768-33023.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/32768-33023.pbf new file mode 100644 index 0000000..84205aa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/32768-33023.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 32768-33023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/33024-33279.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/33024-33279.pbf new file mode 100644 index 0000000..dbbba9e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/33024-33279.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 33024-33279 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/3328-3583.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/3328-3583.pbf new file mode 100644 index 0000000..f10dd8f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/3328-3583.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 3328-3583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/33280-33535.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/33280-33535.pbf new file mode 100644 index 0000000..a107683 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/33280-33535.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 33280-33535 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/33536-33791.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/33536-33791.pbf new file mode 100644 index 0000000..1ae4d68 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/33536-33791.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 33536-33791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/33792-34047.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/33792-34047.pbf new file mode 100644 index 0000000..524259d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/33792-34047.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 33792-34047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/34048-34303.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/34048-34303.pbf new file mode 100644 index 0000000..4d7e02c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/34048-34303.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 34048-34303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/34304-34559.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/34304-34559.pbf new file mode 100644 index 0000000..5247938 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/34304-34559.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 34304-34559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/34560-34815.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/34560-34815.pbf new file mode 100644 index 0000000..0f30f92 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/34560-34815.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 34560-34815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/34816-35071.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/34816-35071.pbf new file mode 100644 index 0000000..af31d11 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/34816-35071.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 34816-35071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/35072-35327.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/35072-35327.pbf new file mode 100644 index 0000000..75efa1c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/35072-35327.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 35072-35327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/35328-35583.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/35328-35583.pbf new file mode 100644 index 0000000..665b33b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/35328-35583.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 35328-35583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/35584-35839.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/35584-35839.pbf new file mode 100644 index 0000000..76deda6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/35584-35839.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 35584-35839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/3584-3839.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/3584-3839.pbf new file mode 100644 index 0000000..356678c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/3584-3839.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 3584-3839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/35840-36095.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/35840-36095.pbf new file mode 100644 index 0000000..3963e04 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/35840-36095.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 35840-36095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/36096-36351.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/36096-36351.pbf new file mode 100644 index 0000000..ec80ee5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/36096-36351.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 36096-36351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/36352-36607.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/36352-36607.pbf new file mode 100644 index 0000000..6c82845 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/36352-36607.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 36352-36607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/36608-36863.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/36608-36863.pbf new file mode 100644 index 0000000..240d3cb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/36608-36863.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 36608-36863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/36864-37119.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/36864-37119.pbf new file mode 100644 index 0000000..baa1b57 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/36864-37119.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 36864-37119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/37120-37375.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/37120-37375.pbf new file mode 100644 index 0000000..c26dc91 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/37120-37375.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 37120-37375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/37376-37631.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/37376-37631.pbf new file mode 100644 index 0000000..beb2994 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/37376-37631.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 37376-37631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/37632-37887.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/37632-37887.pbf new file mode 100644 index 0000000..4e924bf --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/37632-37887.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 37632-37887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/37888-38143.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/37888-38143.pbf new file mode 100644 index 0000000..5d71065 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/37888-38143.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 37888-38143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/38144-38399.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/38144-38399.pbf new file mode 100644 index 0000000..4bc42ae --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/38144-38399.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 38144-38399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/3840-4095.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/3840-4095.pbf new file mode 100644 index 0000000..726e145 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/3840-4095.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 3840-4095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/38400-38655.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/38400-38655.pbf new file mode 100644 index 0000000..a100d9e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/38400-38655.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 38400-38655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/38656-38911.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/38656-38911.pbf new file mode 100644 index 0000000..8327a6e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/38656-38911.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 38656-38911 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/38912-39167.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/38912-39167.pbf new file mode 100644 index 0000000..b9a6ca0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/38912-39167.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 38912-39167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/39168-39423.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/39168-39423.pbf new file mode 100644 index 0000000..ec115a6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/39168-39423.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 39168-39423 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/39424-39679.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/39424-39679.pbf new file mode 100644 index 0000000..a74c614 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/39424-39679.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 39424-39679 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/39680-39935.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/39680-39935.pbf new file mode 100644 index 0000000..2dfaee8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/39680-39935.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 39680-39935 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/39936-40191.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/39936-40191.pbf new file mode 100644 index 0000000..ca3bf1f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/39936-40191.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 39936-40191 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/40192-40447.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/40192-40447.pbf new file mode 100644 index 0000000..88a2136 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/40192-40447.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 40192-40447 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/40448-40703.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/40448-40703.pbf new file mode 100644 index 0000000..6ee6bcc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/40448-40703.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 40448-40703 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/40704-40959.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/40704-40959.pbf new file mode 100644 index 0000000..0a76fd2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/40704-40959.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 40704-40959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/4096-4351.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/4096-4351.pbf new file mode 100644 index 0000000..cf08dc7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/4096-4351.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 4096-4351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/40960-41215.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/40960-41215.pbf new file mode 100644 index 0000000..a5231de --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/40960-41215.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 40960-41215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/41216-41471.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/41216-41471.pbf new file mode 100644 index 0000000..c55bc69 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/41216-41471.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 41216-41471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/41472-41727.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/41472-41727.pbf new file mode 100644 index 0000000..0c02164 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/41472-41727.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 41472-41727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/41728-41983.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/41728-41983.pbf new file mode 100644 index 0000000..a0a2028 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/41728-41983.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 41728-41983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/41984-42239.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/41984-42239.pbf new file mode 100644 index 0000000..8515111 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/41984-42239.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 41984-42239 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/42240-42495.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/42240-42495.pbf new file mode 100644 index 0000000..792c21e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/42240-42495.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 42240-42495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/42496-42751.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/42496-42751.pbf new file mode 100644 index 0000000..48f0f13 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/42496-42751.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/42752-43007.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/42752-43007.pbf new file mode 100644 index 0000000..afd167b Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/42752-43007.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/43008-43263.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/43008-43263.pbf new file mode 100644 index 0000000..1f72146 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/43008-43263.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 43008-43263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/43264-43519.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/43264-43519.pbf new file mode 100644 index 0000000..240add4 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/43264-43519.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/4352-4607.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/4352-4607.pbf new file mode 100644 index 0000000..a52c07e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/4352-4607.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 4352-4607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/43520-43775.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/43520-43775.pbf new file mode 100644 index 0000000..89219e4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/43520-43775.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 43520-43775 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/43776-44031.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/43776-44031.pbf new file mode 100644 index 0000000..6453b31 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/43776-44031.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/44032-44287.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/44032-44287.pbf new file mode 100644 index 0000000..dbceb3a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/44032-44287.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 44032-44287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/44288-44543.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/44288-44543.pbf new file mode 100644 index 0000000..112a031 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/44288-44543.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 44288-44543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/44544-44799.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/44544-44799.pbf new file mode 100644 index 0000000..90aaad4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/44544-44799.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 44544-44799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/44800-45055.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/44800-45055.pbf new file mode 100644 index 0000000..28ec3a0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/44800-45055.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 44800-45055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/45056-45311.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/45056-45311.pbf new file mode 100644 index 0000000..0d9358e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/45056-45311.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 45056-45311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/45312-45567.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/45312-45567.pbf new file mode 100644 index 0000000..42b2cd1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/45312-45567.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 45312-45567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/45568-45823.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/45568-45823.pbf new file mode 100644 index 0000000..a9128ab --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/45568-45823.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 45568-45823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/45824-46079.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/45824-46079.pbf new file mode 100644 index 0000000..456b092 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/45824-46079.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 45824-46079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/4608-4863.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/4608-4863.pbf new file mode 100644 index 0000000..d57fc34 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/4608-4863.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 4608-4863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/46080-46335.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/46080-46335.pbf new file mode 100644 index 0000000..9d08b64 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/46080-46335.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 46080-46335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/46336-46591.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/46336-46591.pbf new file mode 100644 index 0000000..c6f4bf4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/46336-46591.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 46336-46591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/46592-46847.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/46592-46847.pbf new file mode 100644 index 0000000..bb9dbb3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/46592-46847.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 46592-46847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/46848-47103.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/46848-47103.pbf new file mode 100644 index 0000000..b9e0bbe --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/46848-47103.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 46848-47103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/47104-47359.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/47104-47359.pbf new file mode 100644 index 0000000..9ce53e1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/47104-47359.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 47104-47359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/47360-47615.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/47360-47615.pbf new file mode 100644 index 0000000..27711ad --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/47360-47615.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 47360-47615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/47616-47871.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/47616-47871.pbf new file mode 100644 index 0000000..2452b83 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/47616-47871.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 47616-47871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/47872-48127.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/47872-48127.pbf new file mode 100644 index 0000000..84e7018 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/47872-48127.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 47872-48127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/48128-48383.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/48128-48383.pbf new file mode 100644 index 0000000..41f9647 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/48128-48383.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 48128-48383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/48384-48639.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/48384-48639.pbf new file mode 100644 index 0000000..bfa3466 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/48384-48639.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 48384-48639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/4864-5119.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/4864-5119.pbf new file mode 100644 index 0000000..3c1ba25 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/4864-5119.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 4864-5119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/48640-48895.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/48640-48895.pbf new file mode 100644 index 0000000..30136f5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/48640-48895.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 48640-48895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/48896-49151.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/48896-49151.pbf new file mode 100644 index 0000000..61c3032 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/48896-49151.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 48896-49151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/49152-49407.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/49152-49407.pbf new file mode 100644 index 0000000..ceed7ff --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/49152-49407.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 49152-49407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/49408-49663.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/49408-49663.pbf new file mode 100644 index 0000000..8661b6a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/49408-49663.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 49408-49663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/49664-49919.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/49664-49919.pbf new file mode 100644 index 0000000..7835d1d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/49664-49919.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 49664-49919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/49920-50175.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/49920-50175.pbf new file mode 100644 index 0000000..189b614 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/49920-50175.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 49920-50175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/50176-50431.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/50176-50431.pbf new file mode 100644 index 0000000..ffb51d4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/50176-50431.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 50176-50431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/50432-50687.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/50432-50687.pbf new file mode 100644 index 0000000..b49ee2b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/50432-50687.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 50432-50687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/50688-50943.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/50688-50943.pbf new file mode 100644 index 0000000..be4e1bf --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/50688-50943.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 50688-50943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/50944-51199.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/50944-51199.pbf new file mode 100644 index 0000000..d2aea0e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/50944-51199.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 50944-51199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/512-767.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/512-767.pbf new file mode 100644 index 0000000..8c2ff2a Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/512-767.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/5120-5375.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/5120-5375.pbf new file mode 100644 index 0000000..77808dc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/5120-5375.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 5120-5375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/51200-51455.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/51200-51455.pbf new file mode 100644 index 0000000..1f485fa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/51200-51455.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 51200-51455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/51456-51711.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/51456-51711.pbf new file mode 100644 index 0000000..5af07ac --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/51456-51711.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 51456-51711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/51712-51967.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/51712-51967.pbf new file mode 100644 index 0000000..3a229bb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/51712-51967.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 51712-51967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/51968-52223.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/51968-52223.pbf new file mode 100644 index 0000000..1dc95df --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/51968-52223.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 51968-52223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/52224-52479.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/52224-52479.pbf new file mode 100644 index 0000000..282ccd7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/52224-52479.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 52224-52479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/52480-52735.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/52480-52735.pbf new file mode 100644 index 0000000..5860abb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/52480-52735.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 52480-52735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/52736-52991.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/52736-52991.pbf new file mode 100644 index 0000000..74b1f21 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/52736-52991.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 52736-52991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/52992-53247.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/52992-53247.pbf new file mode 100644 index 0000000..61cc52f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/52992-53247.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 52992-53247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/53248-53503.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/53248-53503.pbf new file mode 100644 index 0000000..7bbffee --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/53248-53503.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 53248-53503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/53504-53759.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/53504-53759.pbf new file mode 100644 index 0000000..1b15fcf --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/53504-53759.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 53504-53759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/5376-5631.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/5376-5631.pbf new file mode 100644 index 0000000..7fc0e36 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/5376-5631.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 5376-5631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/53760-54015.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/53760-54015.pbf new file mode 100644 index 0000000..0086e9e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/53760-54015.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 53760-54015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/54016-54271.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/54016-54271.pbf new file mode 100644 index 0000000..2278eb4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/54016-54271.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 54016-54271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/54272-54527.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/54272-54527.pbf new file mode 100644 index 0000000..5db454a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/54272-54527.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 54272-54527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/54528-54783.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/54528-54783.pbf new file mode 100644 index 0000000..050414e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/54528-54783.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 54528-54783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/54784-55039.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/54784-55039.pbf new file mode 100644 index 0000000..dfee7e9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/54784-55039.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 54784-55039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/55040-55295.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/55040-55295.pbf new file mode 100644 index 0000000..82fe101 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/55040-55295.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 55040-55295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/55296-55551.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/55296-55551.pbf new file mode 100644 index 0000000..e0b008d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/55296-55551.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 55296-55551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/55552-55807.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/55552-55807.pbf new file mode 100644 index 0000000..d2a5911 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/55552-55807.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 55552-55807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/55808-56063.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/55808-56063.pbf new file mode 100644 index 0000000..edf77b0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/55808-56063.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 55808-56063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/56064-56319.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/56064-56319.pbf new file mode 100644 index 0000000..ca48801 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/56064-56319.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 56064-56319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/5632-5887.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/5632-5887.pbf new file mode 100644 index 0000000..038a7bc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/5632-5887.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 5632-5887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/56320-56575.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/56320-56575.pbf new file mode 100644 index 0000000..51ebf12 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/56320-56575.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 56320-56575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/56576-56831.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/56576-56831.pbf new file mode 100644 index 0000000..df8c017 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/56576-56831.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 56576-56831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/56832-57087.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/56832-57087.pbf new file mode 100644 index 0000000..0dccc54 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/56832-57087.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 56832-57087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/57088-57343.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/57088-57343.pbf new file mode 100644 index 0000000..b0c41f8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/57088-57343.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 57088-57343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/57344-57599.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/57344-57599.pbf new file mode 100644 index 0000000..f8ba5de --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/57344-57599.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 57344-57599 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/57600-57855.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/57600-57855.pbf new file mode 100644 index 0000000..dc8b9eb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/57600-57855.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 57600-57855 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/57856-58111.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/57856-58111.pbf new file mode 100644 index 0000000..cc803ca --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/57856-58111.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 57856-58111 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/58112-58367.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/58112-58367.pbf new file mode 100644 index 0000000..d1b0a89 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/58112-58367.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 58112-58367 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/58368-58623.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/58368-58623.pbf new file mode 100644 index 0000000..dbde33c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/58368-58623.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 58368-58623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/58624-58879.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/58624-58879.pbf new file mode 100644 index 0000000..3ea1963 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/58624-58879.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 58624-58879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/5888-6143.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/5888-6143.pbf new file mode 100644 index 0000000..01812c2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/5888-6143.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 5888-6143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/58880-59135.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/58880-59135.pbf new file mode 100644 index 0000000..d66e3ee --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/58880-59135.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 58880-59135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/59136-59391.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/59136-59391.pbf new file mode 100644 index 0000000..571d6c3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/59136-59391.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 59136-59391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/59392-59647.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/59392-59647.pbf new file mode 100644 index 0000000..d150c0c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/59392-59647.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 59392-59647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/59648-59903.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/59648-59903.pbf new file mode 100644 index 0000000..9116c24 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/59648-59903.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 59648-59903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/59904-60159.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/59904-60159.pbf new file mode 100644 index 0000000..a68f60d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/59904-60159.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 59904-60159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/60160-60415.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/60160-60415.pbf new file mode 100644 index 0000000..383ee51 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/60160-60415.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 60160-60415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/60416-60671.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/60416-60671.pbf new file mode 100644 index 0000000..f222f2e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/60416-60671.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 60416-60671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/60672-60927.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/60672-60927.pbf new file mode 100644 index 0000000..e9b7ad7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/60672-60927.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 60672-60927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/60928-61183.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/60928-61183.pbf new file mode 100644 index 0000000..db757f4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/60928-61183.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 60928-61183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/61184-61439.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/61184-61439.pbf new file mode 100644 index 0000000..56c37ec --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/61184-61439.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 61184-61439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/6144-6399.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/6144-6399.pbf new file mode 100644 index 0000000..31a4507 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/6144-6399.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 6144-6399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/61440-61695.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/61440-61695.pbf new file mode 100644 index 0000000..a27c1db --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/61440-61695.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 61440-61695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/61696-61951.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/61696-61951.pbf new file mode 100644 index 0000000..e6b88de --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/61696-61951.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 61696-61951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/61952-62207.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/61952-62207.pbf new file mode 100644 index 0000000..6e046e1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/61952-62207.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 61952-62207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/62208-62463.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/62208-62463.pbf new file mode 100644 index 0000000..4ebc4e4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/62208-62463.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 62208-62463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/62464-62719.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/62464-62719.pbf new file mode 100644 index 0000000..2293257 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/62464-62719.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 62464-62719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/62720-62975.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/62720-62975.pbf new file mode 100644 index 0000000..578d425 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/62720-62975.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 62720-62975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/62976-63231.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/62976-63231.pbf new file mode 100644 index 0000000..f80c97b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/62976-63231.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 62976-63231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/63232-63487.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/63232-63487.pbf new file mode 100644 index 0000000..dcc6d09 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/63232-63487.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 63232-63487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/63488-63743.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/63488-63743.pbf new file mode 100644 index 0000000..65506aa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/63488-63743.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 63488-63743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/63744-63999.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/63744-63999.pbf new file mode 100644 index 0000000..b488e8b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/63744-63999.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 63744-63999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/6400-6655.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/6400-6655.pbf new file mode 100644 index 0000000..c7deb95 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/6400-6655.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 6400-6655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/64000-64255.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/64000-64255.pbf new file mode 100644 index 0000000..0fb48d8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/64000-64255.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 64000-64255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/64256-64511.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/64256-64511.pbf new file mode 100644 index 0000000..04383ea Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/64256-64511.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/64512-64767.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/64512-64767.pbf new file mode 100644 index 0000000..c2d4562 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/64512-64767.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 64512-64767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/64768-65023.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/64768-65023.pbf new file mode 100644 index 0000000..e0f2e5b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/64768-65023.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 64768-65023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/65024-65279.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/65024-65279.pbf new file mode 100644 index 0000000..fba1fac Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/65024-65279.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/65280-65535.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/65280-65535.pbf new file mode 100644 index 0000000..fcaeef9 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/65280-65535.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/6656-6911.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/6656-6911.pbf new file mode 100644 index 0000000..a905da4 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/6656-6911.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/6912-7167.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/6912-7167.pbf new file mode 100644 index 0000000..82fb745 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/6912-7167.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 6912-7167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/7168-7423.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/7168-7423.pbf new file mode 100644 index 0000000..419d43e Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/7168-7423.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/7424-7679.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/7424-7679.pbf new file mode 100644 index 0000000..2d6c138 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/7424-7679.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/768-1023.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/768-1023.pbf new file mode 100644 index 0000000..7cea618 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/768-1023.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/7680-7935.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/7680-7935.pbf new file mode 100644 index 0000000..87910cb Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/7680-7935.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/7936-8191.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/7936-8191.pbf new file mode 100644 index 0000000..cceba91 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/7936-8191.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/8192-8447.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/8192-8447.pbf new file mode 100644 index 0000000..edb9534 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/8192-8447.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/8448-8703.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/8448-8703.pbf new file mode 100644 index 0000000..603062f Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Italic/8448-8703.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/8704-8959.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/8704-8959.pbf new file mode 100644 index 0000000..708a973 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/8704-8959.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 8704-8959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/8960-9215.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/8960-9215.pbf new file mode 100644 index 0000000..513e190 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/8960-9215.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 8960-9215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/9216-9471.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/9216-9471.pbf new file mode 100644 index 0000000..8e3a2ad --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/9216-9471.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 9216-9471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/9472-9727.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/9472-9727.pbf new file mode 100644 index 0000000..0e1be6e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/9472-9727.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 9472-9727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/9728-9983.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/9728-9983.pbf new file mode 100644 index 0000000..89ddea3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/9728-9983.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Italic 9728-9983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Italic/9984-10239.pbf b/src/assets/fonts/glyphs/Noto Sans Italic/9984-10239.pbf new file mode 100644 index 0000000..9cecf28 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Italic/9984-10239.pbf @@ -0,0 +1,4 @@ + + +Noto Sans Italic +9984-10239 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/0-255.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/0-255.pbf new file mode 100644 index 0000000..693ea82 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/0-255.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/1024-1279.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/1024-1279.pbf new file mode 100644 index 0000000..9edb4b8 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/1024-1279.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/10240-10495.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/10240-10495.pbf new file mode 100644 index 0000000..d2d5e44 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/10240-10495.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 10240-10495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/10496-10751.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/10496-10751.pbf new file mode 100644 index 0000000..d6ba34a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/10496-10751.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 10496-10751 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/10752-11007.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/10752-11007.pbf new file mode 100644 index 0000000..8db94d9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/10752-11007.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 10752-11007 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/11008-11263.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/11008-11263.pbf new file mode 100644 index 0000000..d1fcf3d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/11008-11263.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 11008-11263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/11264-11519.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/11264-11519.pbf new file mode 100644 index 0000000..0ace3cd Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/11264-11519.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/11520-11775.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/11520-11775.pbf new file mode 100644 index 0000000..1501117 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/11520-11775.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/11776-12031.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/11776-12031.pbf new file mode 100644 index 0000000..3108c22 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/11776-12031.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/12032-12287.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/12032-12287.pbf new file mode 100644 index 0000000..156a66b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/12032-12287.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 12032-12287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/12288-12543.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/12288-12543.pbf new file mode 100644 index 0000000..f0f721a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/12288-12543.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 12288-12543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/12544-12799.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/12544-12799.pbf new file mode 100644 index 0000000..9263778 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/12544-12799.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 12544-12799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/1280-1535.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/1280-1535.pbf new file mode 100644 index 0000000..d2760ad Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/1280-1535.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/12800-13055.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/12800-13055.pbf new file mode 100644 index 0000000..ac25d7a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/12800-13055.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 12800-13055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/13056-13311.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/13056-13311.pbf new file mode 100644 index 0000000..13e418b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/13056-13311.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 13056-13311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/13312-13567.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/13312-13567.pbf new file mode 100644 index 0000000..ff13e03 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/13312-13567.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 13312-13567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/13568-13823.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/13568-13823.pbf new file mode 100644 index 0000000..86278c1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/13568-13823.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 13568-13823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/13824-14079.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/13824-14079.pbf new file mode 100644 index 0000000..70b0ac2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/13824-14079.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 13824-14079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/14080-14335.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/14080-14335.pbf new file mode 100644 index 0000000..d35a712 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/14080-14335.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 14080-14335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/14336-14591.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/14336-14591.pbf new file mode 100644 index 0000000..45909b1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/14336-14591.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 14336-14591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/14592-14847.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/14592-14847.pbf new file mode 100644 index 0000000..793de65 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/14592-14847.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 14592-14847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/14848-15103.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/14848-15103.pbf new file mode 100644 index 0000000..87b9650 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/14848-15103.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 14848-15103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/15104-15359.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/15104-15359.pbf new file mode 100644 index 0000000..787fce8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/15104-15359.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 15104-15359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/1536-1791.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/1536-1791.pbf new file mode 100644 index 0000000..2b91f88 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/1536-1791.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 1536-1791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/15360-15615.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/15360-15615.pbf new file mode 100644 index 0000000..21f1664 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/15360-15615.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 15360-15615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/15616-15871.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/15616-15871.pbf new file mode 100644 index 0000000..d678d2e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/15616-15871.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 15616-15871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/15872-16127.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/15872-16127.pbf new file mode 100644 index 0000000..f1f4074 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/15872-16127.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 15872-16127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/16128-16383.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/16128-16383.pbf new file mode 100644 index 0000000..9656a9e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/16128-16383.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 16128-16383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/16384-16639.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/16384-16639.pbf new file mode 100644 index 0000000..e0e011e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/16384-16639.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 16384-16639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/16640-16895.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/16640-16895.pbf new file mode 100644 index 0000000..8c39286 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/16640-16895.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 16640-16895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/16896-17151.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/16896-17151.pbf new file mode 100644 index 0000000..5b96f8b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/16896-17151.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 16896-17151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/17152-17407.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/17152-17407.pbf new file mode 100644 index 0000000..e5704d2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/17152-17407.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 17152-17407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/17408-17663.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/17408-17663.pbf new file mode 100644 index 0000000..2f01888 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/17408-17663.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 17408-17663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/17664-17919.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/17664-17919.pbf new file mode 100644 index 0000000..22b7ccc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/17664-17919.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 17664-17919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/1792-2047.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/1792-2047.pbf new file mode 100644 index 0000000..377c252 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/1792-2047.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 1792-2047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/17920-18175.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/17920-18175.pbf new file mode 100644 index 0000000..ad08e6b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/17920-18175.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 17920-18175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/18176-18431.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/18176-18431.pbf new file mode 100644 index 0000000..9b43ff2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/18176-18431.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 18176-18431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/18432-18687.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/18432-18687.pbf new file mode 100644 index 0000000..26fef1d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/18432-18687.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 18432-18687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/18688-18943.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/18688-18943.pbf new file mode 100644 index 0000000..0bfe6bf --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/18688-18943.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 18688-18943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/18944-19199.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/18944-19199.pbf new file mode 100644 index 0000000..36cce12 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/18944-19199.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 18944-19199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/19200-19455.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/19200-19455.pbf new file mode 100644 index 0000000..d9a9c89 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/19200-19455.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 19200-19455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/19456-19711.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/19456-19711.pbf new file mode 100644 index 0000000..09a4173 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/19456-19711.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 19456-19711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/19712-19967.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/19712-19967.pbf new file mode 100644 index 0000000..e39d17d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/19712-19967.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 19712-19967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/19968-20223.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/19968-20223.pbf new file mode 100644 index 0000000..1806932 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/19968-20223.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 19968-20223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/20224-20479.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/20224-20479.pbf new file mode 100644 index 0000000..a3cacd5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/20224-20479.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 20224-20479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/2048-2303.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/2048-2303.pbf new file mode 100644 index 0000000..9450f75 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/2048-2303.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 2048-2303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/20480-20735.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/20480-20735.pbf new file mode 100644 index 0000000..981bbad --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/20480-20735.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 20480-20735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/20736-20991.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/20736-20991.pbf new file mode 100644 index 0000000..a8c43e4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/20736-20991.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 20736-20991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/20992-21247.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/20992-21247.pbf new file mode 100644 index 0000000..189dc16 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/20992-21247.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 20992-21247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/21248-21503.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/21248-21503.pbf new file mode 100644 index 0000000..ef8507e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/21248-21503.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 21248-21503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/21504-21759.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/21504-21759.pbf new file mode 100644 index 0000000..26674a5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/21504-21759.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 21504-21759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/21760-22015.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/21760-22015.pbf new file mode 100644 index 0000000..ebdc959 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/21760-22015.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 21760-22015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/22016-22271.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/22016-22271.pbf new file mode 100644 index 0000000..4b4a1c8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/22016-22271.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 22016-22271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/22272-22527.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/22272-22527.pbf new file mode 100644 index 0000000..583a683 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/22272-22527.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 22272-22527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/22528-22783.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/22528-22783.pbf new file mode 100644 index 0000000..5137eac --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/22528-22783.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 22528-22783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/22784-23039.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/22784-23039.pbf new file mode 100644 index 0000000..81e817b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/22784-23039.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 22784-23039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/2304-2559.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/2304-2559.pbf new file mode 100644 index 0000000..6061839 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/2304-2559.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 2304-2559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/23040-23295.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/23040-23295.pbf new file mode 100644 index 0000000..55d5ed6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/23040-23295.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 23040-23295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/23296-23551.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/23296-23551.pbf new file mode 100644 index 0000000..b96081c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/23296-23551.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 23296-23551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/23552-23807.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/23552-23807.pbf new file mode 100644 index 0000000..e1833d7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/23552-23807.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 23552-23807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/23808-24063.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/23808-24063.pbf new file mode 100644 index 0000000..e00969f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/23808-24063.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 23808-24063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/24064-24319.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/24064-24319.pbf new file mode 100644 index 0000000..a65734e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/24064-24319.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 24064-24319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/24320-24575.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/24320-24575.pbf new file mode 100644 index 0000000..58c02a6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/24320-24575.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 24320-24575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/24576-24831.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/24576-24831.pbf new file mode 100644 index 0000000..99cab08 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/24576-24831.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 24576-24831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/24832-25087.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/24832-25087.pbf new file mode 100644 index 0000000..bcdacb3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/24832-25087.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 24832-25087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/25088-25343.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/25088-25343.pbf new file mode 100644 index 0000000..44eeeb1 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/25088-25343.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 25088-25343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/25344-25599.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/25344-25599.pbf new file mode 100644 index 0000000..2fd29db --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/25344-25599.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 25344-25599 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/256-511.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/256-511.pbf new file mode 100644 index 0000000..6ae5c18 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/256-511.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/2560-2815.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/2560-2815.pbf new file mode 100644 index 0000000..33ad2ea --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/2560-2815.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 2560-2815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/25600-25855.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/25600-25855.pbf new file mode 100644 index 0000000..c5606c9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/25600-25855.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 25600-25855 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/25856-26111.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/25856-26111.pbf new file mode 100644 index 0000000..80b6eed --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/25856-26111.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 25856-26111 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/26112-26367.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/26112-26367.pbf new file mode 100644 index 0000000..05521ae --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/26112-26367.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 26112-26367 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/26368-26623.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/26368-26623.pbf new file mode 100644 index 0000000..e751e55 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/26368-26623.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 26368-26623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/26624-26879.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/26624-26879.pbf new file mode 100644 index 0000000..a4cbbfd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/26624-26879.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 26624-26879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/26880-27135.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/26880-27135.pbf new file mode 100644 index 0000000..5ddf830 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/26880-27135.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 26880-27135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/27136-27391.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/27136-27391.pbf new file mode 100644 index 0000000..734a48b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/27136-27391.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 27136-27391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/27392-27647.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/27392-27647.pbf new file mode 100644 index 0000000..d29b5e5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/27392-27647.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 27392-27647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/27648-27903.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/27648-27903.pbf new file mode 100644 index 0000000..e5e92ac --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/27648-27903.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 27648-27903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/27904-28159.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/27904-28159.pbf new file mode 100644 index 0000000..5605e7a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/27904-28159.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 27904-28159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/2816-3071.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/2816-3071.pbf new file mode 100644 index 0000000..44a8fd2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/2816-3071.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 2816-3071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/28160-28415.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/28160-28415.pbf new file mode 100644 index 0000000..301c121 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/28160-28415.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 28160-28415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/28416-28671.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/28416-28671.pbf new file mode 100644 index 0000000..78d3adc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/28416-28671.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 28416-28671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/28672-28927.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/28672-28927.pbf new file mode 100644 index 0000000..15fc099 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/28672-28927.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 28672-28927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/28928-29183.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/28928-29183.pbf new file mode 100644 index 0000000..9d3ba3d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/28928-29183.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 28928-29183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/29184-29439.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/29184-29439.pbf new file mode 100644 index 0000000..019dffb --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/29184-29439.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 29184-29439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/29440-29695.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/29440-29695.pbf new file mode 100644 index 0000000..01d1484 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/29440-29695.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 29440-29695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/29696-29951.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/29696-29951.pbf new file mode 100644 index 0000000..63bbdb6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/29696-29951.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 29696-29951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/29952-30207.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/29952-30207.pbf new file mode 100644 index 0000000..091956e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/29952-30207.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 29952-30207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/30208-30463.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/30208-30463.pbf new file mode 100644 index 0000000..61cc776 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/30208-30463.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 30208-30463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/30464-30719.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/30464-30719.pbf new file mode 100644 index 0000000..9bc462f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/30464-30719.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 30464-30719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/3072-3327.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/3072-3327.pbf new file mode 100644 index 0000000..c3feb45 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/3072-3327.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 3072-3327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/30720-30975.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/30720-30975.pbf new file mode 100644 index 0000000..f07aa94 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/30720-30975.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 30720-30975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/30976-31231.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/30976-31231.pbf new file mode 100644 index 0000000..99baacc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/30976-31231.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 30976-31231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/31232-31487.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/31232-31487.pbf new file mode 100644 index 0000000..df0da1b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/31232-31487.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 31232-31487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/31488-31743.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/31488-31743.pbf new file mode 100644 index 0000000..8ae2b38 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/31488-31743.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 31488-31743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/31744-31999.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/31744-31999.pbf new file mode 100644 index 0000000..a4e5eea --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/31744-31999.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 31744-31999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/32000-32255.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/32000-32255.pbf new file mode 100644 index 0000000..4408b27 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/32000-32255.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 32000-32255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/32256-32511.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/32256-32511.pbf new file mode 100644 index 0000000..31dcbf0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/32256-32511.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 32256-32511 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/32512-32767.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/32512-32767.pbf new file mode 100644 index 0000000..945a749 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/32512-32767.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 32512-32767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/32768-33023.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/32768-33023.pbf new file mode 100644 index 0000000..bbd2675 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/32768-33023.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 32768-33023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/33024-33279.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/33024-33279.pbf new file mode 100644 index 0000000..f213ece --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/33024-33279.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 33024-33279 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/3328-3583.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/3328-3583.pbf new file mode 100644 index 0000000..4446b19 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/3328-3583.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 3328-3583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/33280-33535.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/33280-33535.pbf new file mode 100644 index 0000000..274cbfe --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/33280-33535.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 33280-33535 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/33536-33791.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/33536-33791.pbf new file mode 100644 index 0000000..20fdc05 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/33536-33791.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 33536-33791 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/33792-34047.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/33792-34047.pbf new file mode 100644 index 0000000..89d3287 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/33792-34047.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 33792-34047 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/34048-34303.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/34048-34303.pbf new file mode 100644 index 0000000..6c8a469 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/34048-34303.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 34048-34303 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/34304-34559.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/34304-34559.pbf new file mode 100644 index 0000000..82b5ccf --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/34304-34559.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 34304-34559 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/34560-34815.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/34560-34815.pbf new file mode 100644 index 0000000..4966f17 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/34560-34815.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 34560-34815 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/34816-35071.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/34816-35071.pbf new file mode 100644 index 0000000..42a1a37 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/34816-35071.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 34816-35071 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/35072-35327.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/35072-35327.pbf new file mode 100644 index 0000000..74adc73 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/35072-35327.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 35072-35327 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/35328-35583.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/35328-35583.pbf new file mode 100644 index 0000000..6f89359 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/35328-35583.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 35328-35583 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/35584-35839.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/35584-35839.pbf new file mode 100644 index 0000000..14dd1f0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/35584-35839.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 35584-35839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/3584-3839.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/3584-3839.pbf new file mode 100644 index 0000000..7cdbca5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/3584-3839.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 3584-3839 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/35840-36095.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/35840-36095.pbf new file mode 100644 index 0000000..155313b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/35840-36095.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 35840-36095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/36096-36351.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/36096-36351.pbf new file mode 100644 index 0000000..4f6f949 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/36096-36351.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 36096-36351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/36352-36607.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/36352-36607.pbf new file mode 100644 index 0000000..1274e2a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/36352-36607.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 36352-36607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/36608-36863.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/36608-36863.pbf new file mode 100644 index 0000000..89b6027 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/36608-36863.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 36608-36863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/36864-37119.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/36864-37119.pbf new file mode 100644 index 0000000..422920e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/36864-37119.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 36864-37119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/37120-37375.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/37120-37375.pbf new file mode 100644 index 0000000..8a484cc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/37120-37375.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 37120-37375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/37376-37631.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/37376-37631.pbf new file mode 100644 index 0000000..a249485 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/37376-37631.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 37376-37631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/37632-37887.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/37632-37887.pbf new file mode 100644 index 0000000..ba3751d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/37632-37887.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 37632-37887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/37888-38143.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/37888-38143.pbf new file mode 100644 index 0000000..08f8388 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/37888-38143.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 37888-38143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/38144-38399.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/38144-38399.pbf new file mode 100644 index 0000000..856bef2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/38144-38399.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 38144-38399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/3840-4095.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/3840-4095.pbf new file mode 100644 index 0000000..60c3821 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/3840-4095.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 3840-4095 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/38400-38655.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/38400-38655.pbf new file mode 100644 index 0000000..13a58d3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/38400-38655.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 38400-38655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/38656-38911.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/38656-38911.pbf new file mode 100644 index 0000000..dce693f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/38656-38911.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 38656-38911 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/38912-39167.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/38912-39167.pbf new file mode 100644 index 0000000..d51ad3e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/38912-39167.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 38912-39167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/39168-39423.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/39168-39423.pbf new file mode 100644 index 0000000..e12d8e2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/39168-39423.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 39168-39423 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/39424-39679.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/39424-39679.pbf new file mode 100644 index 0000000..4b46ea4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/39424-39679.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 39424-39679 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/39680-39935.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/39680-39935.pbf new file mode 100644 index 0000000..8a39eb5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/39680-39935.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 39680-39935 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/39936-40191.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/39936-40191.pbf new file mode 100644 index 0000000..0990ace --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/39936-40191.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 39936-40191 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/40192-40447.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/40192-40447.pbf new file mode 100644 index 0000000..9f5bbaa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/40192-40447.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 40192-40447 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/40448-40703.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/40448-40703.pbf new file mode 100644 index 0000000..ead7da4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/40448-40703.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 40448-40703 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/40704-40959.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/40704-40959.pbf new file mode 100644 index 0000000..99253c3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/40704-40959.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 40704-40959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/4096-4351.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/4096-4351.pbf new file mode 100644 index 0000000..75480af --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/4096-4351.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 4096-4351 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/40960-41215.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/40960-41215.pbf new file mode 100644 index 0000000..f4f9f96 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/40960-41215.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 40960-41215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/41216-41471.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/41216-41471.pbf new file mode 100644 index 0000000..bee774c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/41216-41471.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 41216-41471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/41472-41727.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/41472-41727.pbf new file mode 100644 index 0000000..e1cc595 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/41472-41727.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 41472-41727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/41728-41983.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/41728-41983.pbf new file mode 100644 index 0000000..f248763 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/41728-41983.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 41728-41983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/41984-42239.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/41984-42239.pbf new file mode 100644 index 0000000..5dec3a0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/41984-42239.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 41984-42239 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/42240-42495.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/42240-42495.pbf new file mode 100644 index 0000000..6fdfc14 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/42240-42495.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 42240-42495 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/42496-42751.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/42496-42751.pbf new file mode 100644 index 0000000..f2eeb86 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/42496-42751.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/42752-43007.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/42752-43007.pbf new file mode 100644 index 0000000..4ba6493 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/42752-43007.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/43008-43263.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/43008-43263.pbf new file mode 100644 index 0000000..f68c752 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/43008-43263.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 43008-43263 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/43264-43519.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/43264-43519.pbf new file mode 100644 index 0000000..9d8b980 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/43264-43519.pbf @@ -0,0 +1,4 @@ + +Ä +Noto Sans Regular 43264-43519¡®Ò#8JYequyxtnbVF48Qevƒ•™˜”Œ€saL3Le~‘¡¬µ¹·´ªžy`G`y’«½ÊÔÑÒÔǺ§tZp¦¿Ð¿¶±²·ÂÓº¡†i|š·Ò¸¤—‘’™¨¾Î°’t~³³¦‹yqr{’­³±•vr‰““Žy_RSf‘““„k\msspbL29RfrssiV + (0#8 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/4352-4607.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/4352-4607.pbf new file mode 100644 index 0000000..5a6e0ec --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/4352-4607.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 4352-4607 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/43520-43775.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/43520-43775.pbf new file mode 100644 index 0000000..e5b29e5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/43520-43775.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 43520-43775 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/43776-44031.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/43776-44031.pbf new file mode 100644 index 0000000..e8ade05 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/43776-44031.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/44032-44287.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/44032-44287.pbf new file mode 100644 index 0000000..5725d87 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/44032-44287.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 44032-44287 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/44288-44543.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/44288-44543.pbf new file mode 100644 index 0000000..f8eaf91 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/44288-44543.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 44288-44543 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/44544-44799.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/44544-44799.pbf new file mode 100644 index 0000000..b857745 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/44544-44799.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 44544-44799 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/44800-45055.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/44800-45055.pbf new file mode 100644 index 0000000..f00ad6c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/44800-45055.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 44800-45055 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/45056-45311.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/45056-45311.pbf new file mode 100644 index 0000000..e112dcf --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/45056-45311.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 45056-45311 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/45312-45567.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/45312-45567.pbf new file mode 100644 index 0000000..cf692a4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/45312-45567.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 45312-45567 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/45568-45823.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/45568-45823.pbf new file mode 100644 index 0000000..b02f039 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/45568-45823.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 45568-45823 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/45824-46079.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/45824-46079.pbf new file mode 100644 index 0000000..7a10106 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/45824-46079.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 45824-46079 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/4608-4863.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/4608-4863.pbf new file mode 100644 index 0000000..bb1efb9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/4608-4863.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 4608-4863 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/46080-46335.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/46080-46335.pbf new file mode 100644 index 0000000..fa8ccf6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/46080-46335.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 46080-46335 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/46336-46591.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/46336-46591.pbf new file mode 100644 index 0000000..06d42f6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/46336-46591.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 46336-46591 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/46592-46847.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/46592-46847.pbf new file mode 100644 index 0000000..3c847a4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/46592-46847.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 46592-46847 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/46848-47103.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/46848-47103.pbf new file mode 100644 index 0000000..0b74878 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/46848-47103.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 46848-47103 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/47104-47359.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/47104-47359.pbf new file mode 100644 index 0000000..263ee26 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/47104-47359.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 47104-47359 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/47360-47615.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/47360-47615.pbf new file mode 100644 index 0000000..33a8669 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/47360-47615.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 47360-47615 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/47616-47871.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/47616-47871.pbf new file mode 100644 index 0000000..1cd1877 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/47616-47871.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 47616-47871 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/47872-48127.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/47872-48127.pbf new file mode 100644 index 0000000..61f8417 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/47872-48127.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 47872-48127 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/48128-48383.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/48128-48383.pbf new file mode 100644 index 0000000..ee33172 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/48128-48383.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 48128-48383 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/48384-48639.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/48384-48639.pbf new file mode 100644 index 0000000..366067d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/48384-48639.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 48384-48639 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/4864-5119.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/4864-5119.pbf new file mode 100644 index 0000000..8879dec --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/4864-5119.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 4864-5119 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/48640-48895.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/48640-48895.pbf new file mode 100644 index 0000000..76244d3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/48640-48895.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 48640-48895 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/48896-49151.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/48896-49151.pbf new file mode 100644 index 0000000..d4d1204 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/48896-49151.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 48896-49151 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/49152-49407.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/49152-49407.pbf new file mode 100644 index 0000000..6a09463 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/49152-49407.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 49152-49407 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/49408-49663.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/49408-49663.pbf new file mode 100644 index 0000000..72732fa --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/49408-49663.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 49408-49663 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/49664-49919.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/49664-49919.pbf new file mode 100644 index 0000000..09151e2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/49664-49919.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 49664-49919 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/49920-50175.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/49920-50175.pbf new file mode 100644 index 0000000..ac24bb3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/49920-50175.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 49920-50175 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/50176-50431.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/50176-50431.pbf new file mode 100644 index 0000000..caf0f80 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/50176-50431.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 50176-50431 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/50432-50687.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/50432-50687.pbf new file mode 100644 index 0000000..4abcef0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/50432-50687.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 50432-50687 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/50688-50943.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/50688-50943.pbf new file mode 100644 index 0000000..cd22694 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/50688-50943.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 50688-50943 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/50944-51199.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/50944-51199.pbf new file mode 100644 index 0000000..17a0b1b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/50944-51199.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 50944-51199 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/512-767.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/512-767.pbf new file mode 100644 index 0000000..48b08b9 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/512-767.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/5120-5375.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/5120-5375.pbf new file mode 100644 index 0000000..bc9447b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/5120-5375.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 5120-5375 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/51200-51455.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/51200-51455.pbf new file mode 100644 index 0000000..43409bd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/51200-51455.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 51200-51455 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/51456-51711.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/51456-51711.pbf new file mode 100644 index 0000000..9ab26fd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/51456-51711.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 51456-51711 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/51712-51967.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/51712-51967.pbf new file mode 100644 index 0000000..0fc2760 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/51712-51967.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 51712-51967 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/51968-52223.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/51968-52223.pbf new file mode 100644 index 0000000..3a29c41 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/51968-52223.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 51968-52223 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/52224-52479.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/52224-52479.pbf new file mode 100644 index 0000000..81af9b2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/52224-52479.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 52224-52479 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/52480-52735.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/52480-52735.pbf new file mode 100644 index 0000000..958296b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/52480-52735.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 52480-52735 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/52736-52991.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/52736-52991.pbf new file mode 100644 index 0000000..5d729f4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/52736-52991.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 52736-52991 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/52992-53247.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/52992-53247.pbf new file mode 100644 index 0000000..c091818 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/52992-53247.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 52992-53247 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/53248-53503.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/53248-53503.pbf new file mode 100644 index 0000000..97a2c9a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/53248-53503.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 53248-53503 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/53504-53759.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/53504-53759.pbf new file mode 100644 index 0000000..4e1bd62 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/53504-53759.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 53504-53759 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/5376-5631.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/5376-5631.pbf new file mode 100644 index 0000000..deed8a5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/5376-5631.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 5376-5631 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/53760-54015.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/53760-54015.pbf new file mode 100644 index 0000000..b706b3f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/53760-54015.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 53760-54015 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/54016-54271.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/54016-54271.pbf new file mode 100644 index 0000000..4425612 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/54016-54271.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 54016-54271 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/54272-54527.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/54272-54527.pbf new file mode 100644 index 0000000..e9b4782 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/54272-54527.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 54272-54527 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/54528-54783.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/54528-54783.pbf new file mode 100644 index 0000000..2c6866e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/54528-54783.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 54528-54783 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/54784-55039.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/54784-55039.pbf new file mode 100644 index 0000000..09decd5 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/54784-55039.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 54784-55039 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/55040-55295.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/55040-55295.pbf new file mode 100644 index 0000000..5781ddc --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/55040-55295.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 55040-55295 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/55296-55551.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/55296-55551.pbf new file mode 100644 index 0000000..c40557a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/55296-55551.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 55296-55551 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/55552-55807.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/55552-55807.pbf new file mode 100644 index 0000000..a824998 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/55552-55807.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 55552-55807 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/55808-56063.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/55808-56063.pbf new file mode 100644 index 0000000..ad0953f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/55808-56063.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 55808-56063 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/56064-56319.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/56064-56319.pbf new file mode 100644 index 0000000..f3ee3a7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/56064-56319.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 56064-56319 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/5632-5887.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/5632-5887.pbf new file mode 100644 index 0000000..b840be7 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/5632-5887.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 5632-5887 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/56320-56575.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/56320-56575.pbf new file mode 100644 index 0000000..f32394b --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/56320-56575.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 56320-56575 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/56576-56831.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/56576-56831.pbf new file mode 100644 index 0000000..3e30578 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/56576-56831.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 56576-56831 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/56832-57087.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/56832-57087.pbf new file mode 100644 index 0000000..fff651c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/56832-57087.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 56832-57087 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/57088-57343.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/57088-57343.pbf new file mode 100644 index 0000000..571a2ae --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/57088-57343.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 57088-57343 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/57344-57599.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/57344-57599.pbf new file mode 100644 index 0000000..b1bf936 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/57344-57599.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 57344-57599 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/57600-57855.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/57600-57855.pbf new file mode 100644 index 0000000..ce10f31 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/57600-57855.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 57600-57855 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/57856-58111.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/57856-58111.pbf new file mode 100644 index 0000000..a9dbbd3 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/57856-58111.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 57856-58111 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/58112-58367.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/58112-58367.pbf new file mode 100644 index 0000000..1ac4de0 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/58112-58367.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 58112-58367 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/58368-58623.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/58368-58623.pbf new file mode 100644 index 0000000..ffcc72f --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/58368-58623.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 58368-58623 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/58624-58879.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/58624-58879.pbf new file mode 100644 index 0000000..7422334 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/58624-58879.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 58624-58879 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/5888-6143.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/5888-6143.pbf new file mode 100644 index 0000000..fd39091 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/5888-6143.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 5888-6143 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/58880-59135.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/58880-59135.pbf new file mode 100644 index 0000000..604e3a8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/58880-59135.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 58880-59135 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/59136-59391.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/59136-59391.pbf new file mode 100644 index 0000000..acff212 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/59136-59391.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 59136-59391 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/59392-59647.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/59392-59647.pbf new file mode 100644 index 0000000..34bb633 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/59392-59647.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 59392-59647 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/59648-59903.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/59648-59903.pbf new file mode 100644 index 0000000..fb8a908 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/59648-59903.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 59648-59903 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/59904-60159.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/59904-60159.pbf new file mode 100644 index 0000000..5a04ed2 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/59904-60159.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 59904-60159 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/60160-60415.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/60160-60415.pbf new file mode 100644 index 0000000..3636be4 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/60160-60415.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 60160-60415 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/60416-60671.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/60416-60671.pbf new file mode 100644 index 0000000..35edd93 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/60416-60671.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 60416-60671 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/60672-60927.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/60672-60927.pbf new file mode 100644 index 0000000..d368efd --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/60672-60927.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 60672-60927 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/60928-61183.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/60928-61183.pbf new file mode 100644 index 0000000..2b33182 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/60928-61183.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 60928-61183 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/61184-61439.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/61184-61439.pbf new file mode 100644 index 0000000..a79f1b8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/61184-61439.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 61184-61439 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/6144-6399.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/6144-6399.pbf new file mode 100644 index 0000000..a20fbec --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/6144-6399.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 6144-6399 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/61440-61695.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/61440-61695.pbf new file mode 100644 index 0000000..acf96f6 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/61440-61695.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 61440-61695 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/61696-61951.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/61696-61951.pbf new file mode 100644 index 0000000..be08733 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/61696-61951.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 61696-61951 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/61952-62207.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/61952-62207.pbf new file mode 100644 index 0000000..22d6fef --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/61952-62207.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 61952-62207 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/62208-62463.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/62208-62463.pbf new file mode 100644 index 0000000..55ef180 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/62208-62463.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 62208-62463 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/62464-62719.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/62464-62719.pbf new file mode 100644 index 0000000..3736862 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/62464-62719.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 62464-62719 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/62720-62975.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/62720-62975.pbf new file mode 100644 index 0000000..d4cc129 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/62720-62975.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 62720-62975 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/62976-63231.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/62976-63231.pbf new file mode 100644 index 0000000..90e4c14 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/62976-63231.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 62976-63231 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/63232-63487.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/63232-63487.pbf new file mode 100644 index 0000000..f4f305e --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/63232-63487.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 63232-63487 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/63488-63743.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/63488-63743.pbf new file mode 100644 index 0000000..e5dd112 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/63488-63743.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 63488-63743 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/63744-63999.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/63744-63999.pbf new file mode 100644 index 0000000..a9b7b3c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/63744-63999.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 63744-63999 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/6400-6655.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/6400-6655.pbf new file mode 100644 index 0000000..5d33602 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/6400-6655.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 6400-6655 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/64000-64255.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/64000-64255.pbf new file mode 100644 index 0000000..115427a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/64000-64255.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 64000-64255 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/64256-64511.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/64256-64511.pbf new file mode 100644 index 0000000..379c4b3 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/64256-64511.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/64512-64767.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/64512-64767.pbf new file mode 100644 index 0000000..bffdeb8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/64512-64767.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 64512-64767 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/64768-65023.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/64768-65023.pbf new file mode 100644 index 0000000..97c60ec --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/64768-65023.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 64768-65023 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/65024-65279.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/65024-65279.pbf new file mode 100644 index 0000000..2bd6c02 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/65024-65279.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/65280-65535.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/65280-65535.pbf new file mode 100644 index 0000000..1cbf497 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/65280-65535.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/6656-6911.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/6656-6911.pbf new file mode 100644 index 0000000..eb12b76 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/6656-6911.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/6912-7167.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/6912-7167.pbf new file mode 100644 index 0000000..f72818d --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/6912-7167.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 6912-7167 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/7168-7423.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/7168-7423.pbf new file mode 100644 index 0000000..55f449a Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/7168-7423.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/7424-7679.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/7424-7679.pbf new file mode 100644 index 0000000..4352bea Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/7424-7679.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/768-1023.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/768-1023.pbf new file mode 100644 index 0000000..8a502ad Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/768-1023.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/7680-7935.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/7680-7935.pbf new file mode 100644 index 0000000..5747c50 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/7680-7935.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/7936-8191.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/7936-8191.pbf new file mode 100644 index 0000000..d811b1b Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/7936-8191.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/8192-8447.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/8192-8447.pbf new file mode 100644 index 0000000..5463253 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/8192-8447.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/8448-8703.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/8448-8703.pbf new file mode 100644 index 0000000..dce0912 Binary files /dev/null and b/src/assets/fonts/glyphs/Noto Sans Regular/8448-8703.pbf differ diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/8704-8959.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/8704-8959.pbf new file mode 100644 index 0000000..1216662 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/8704-8959.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 8704-8959 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/8960-9215.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/8960-9215.pbf new file mode 100644 index 0000000..f51c27c --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/8960-9215.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 8960-9215 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/9216-9471.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/9216-9471.pbf new file mode 100644 index 0000000..7f29cd9 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/9216-9471.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 9216-9471 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/9472-9727.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/9472-9727.pbf new file mode 100644 index 0000000..49cb928 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/9472-9727.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 9472-9727 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/9728-9983.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/9728-9983.pbf new file mode 100644 index 0000000..627466a --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/9728-9983.pbf @@ -0,0 +1,3 @@ + + +Noto Sans Regular 9728-9983 \ No newline at end of file diff --git a/src/assets/fonts/glyphs/Noto Sans Regular/9984-10239.pbf b/src/assets/fonts/glyphs/Noto Sans Regular/9984-10239.pbf new file mode 100644 index 0000000..b3d74d8 --- /dev/null +++ b/src/assets/fonts/glyphs/Noto Sans Regular/9984-10239.pbf @@ -0,0 +1,4 @@ + + +Noto Sans Regular +9984-10239 \ No newline at end of file diff --git a/src/assets/fonts/materialicons.woff2 b/src/assets/fonts/materialicons.woff2 new file mode 100644 index 0000000..b283233 Binary files /dev/null and b/src/assets/fonts/materialicons.woff2 differ diff --git a/src/assets/icons/marker1.png b/src/assets/icons/marker1.png new file mode 100644 index 0000000..cc1d0d6 Binary files /dev/null and b/src/assets/icons/marker1.png differ diff --git a/src/assets/icons/raingauge.png b/src/assets/icons/raingauge.png new file mode 100644 index 0000000..ebb4398 Binary files /dev/null and b/src/assets/icons/raingauge.png differ diff --git a/src/assets/icons/spin.gif b/src/assets/icons/spin.gif new file mode 100644 index 0000000..2602532 Binary files /dev/null and b/src/assets/icons/spin.gif differ diff --git a/src/assets/icons/weather_station.png b/src/assets/icons/weather_station.png new file mode 100644 index 0000000..d3bb989 Binary files /dev/null and b/src/assets/icons/weather_station.png differ diff --git a/src/assets/icons/well.png b/src/assets/icons/well.png new file mode 100644 index 0000000..477114d Binary files /dev/null and b/src/assets/icons/well.png differ diff --git a/src/assets/images/background.png b/src/assets/images/background.png new file mode 100644 index 0000000..52c7921 Binary files /dev/null and b/src/assets/images/background.png differ diff --git a/src/assets/mapbox-styles/osm-light.json b/src/assets/mapbox-styles/osm-light.json new file mode 100644 index 0000000..2c21a67 --- /dev/null +++ b/src/assets/mapbox-styles/osm-light.json @@ -0,0 +1,4953 @@ +{ + "version": 8, + "name": "OSM Bright", + "metadata": { + "mapbox:type": "template", + "mapbox:groups": { + "1444849364238.8171": { + "collapsed": false, + "name": "Buildings" + }, + "1444849354174.1904": { + "collapsed": true, + "name": "Tunnels" + }, + "1444849388993.3071": { + "collapsed": false, + "name": "Land" + }, + "1444849242106.713": { + "collapsed": false, + "name": "Places" + }, + "1444849382550.77": { + "collapsed": false, + "name": "Water" + }, + "1444849345966.4436": { + "collapsed": false, + "name": "Roads" + }, + "1444849334699.1902": { + "collapsed": true, + "name": "Bridges" + } + }, + "mapbox:autocomposite": false, + "openmaptiles:version": "3.x", + "openmaptiles:mapbox:owner": "openmaptiles", + "openmaptiles:mapbox:source:url": "mapbox://openmaptiles.4qljc88t" + }, + "sources": { + "openmaptiles": { + "type": "vector", + "url": "https://api.maptiler.com/data/v3.json?key=RiS4gsgZPZqeeMlIyxFo" + } + }, + "sprite": "https://openmaptiles.github.io/osm-bright-gl-style/sprite", + "glyphs": "/assets/fonts/glyphs/{fontstack}/{range}.pbf", + "layers": [ + { + "id": "background", + "type": "background", + "paint": { + "background-color": "#f8f4f0" + } + }, + { + "id": "landcover-glacier", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + "subclass", + "glacier" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 0, + 0.9 + ], + [ + 10, + 0.3 + ] + ] + } + } + }, + { + "id": "landuse-residential", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "residential" + ], + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [ + 12, + "hsla(30, 19%, 90%, 0.4)" + ], + [ + 16, + "hsla(30, 19%, 90%, 0.2)" + ] + ] + } + } + }, + { + "id": "landuse-commercial", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "==", + "class", + "commercial" + ] + ], + "paint": { + "fill-color": "hsla(0, 60%, 87%, 0.23)" + } + }, + { + "id": "landuse-industrial", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "==", + "class", + "industrial" + ] + ], + "paint": { + "fill-color": "hsla(49, 100%, 88%, 0.34)" + } + }, + { + "id": "park", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "park", + "filter": [ + "==", + "$type", + "Polygon" + ], + "paint": { + "fill-color": "#d8e8c8", + "fill-opacity": { + "base": 1.8, + "stops": [ + [ + 9, + 0.5 + ], + [ + 12, + 0.2 + ] + ] + } + } + }, + { + "id": "park-outline", + "type": "line", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "park", + "filter": [ + "==", + "$type", + "Polygon" + ], + "layout": {}, + "paint": { + "line-color": { + "base": 1, + "stops": [ + [ + 6, + "hsla(96, 40%, 49%, 0.36)" + ], + [ + 8, + "hsla(96, 40%, 49%, 0.66)" + ] + ] + }, + "line-dasharray": [ + 3, + 3 + ] + } + }, + { + "id": "landuse-cemetery", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "cemetery" + ], + "paint": { + "fill-color": "#e0e4dd" + } + }, + { + "id": "landuse-hospital", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "hospital" + ], + "paint": { + "fill-color": "#fde" + } + }, + { + "id": "landuse-school", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "school" + ], + "paint": { + "fill-color": "#f0e8f8" + } + }, + { + "id": "landuse-railway", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landuse", + "filter": [ + "==", + "class", + "railway" + ], + "paint": { + "fill-color": "hsla(30, 19%, 90%, 0.4)" + } + }, + { + "id": "landcover-wood", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + "class", + "wood" + ], + "paint": { + "fill-color": "#6a4", + "fill-opacity": 0.1, + "fill-outline-color": "hsla(0, 0%, 0%, 0.03)", + "fill-antialias": { + "base": 1, + "stops": [ + [ + 0, + false + ], + [ + 9, + true + ] + ] + } + } + }, + { + "id": "landcover-grass", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + "class", + "grass" + ], + "paint": { + "fill-color": "#d8e8c8", + "fill-opacity": 1 + } + }, + { + "id": "landcover-grass-park", + "type": "fill", + "metadata": { + "mapbox:group": "1444849388993.3071" + }, + "source": "openmaptiles", + "source-layer": "park", + "filter": [ + "==", + "class", + "public_park" + ], + "paint": { + "fill-color": "#d8e8c8", + "fill-opacity": 0.8 + } + }, + { + "id": "waterway_tunnel", + "filter": [ + "all", + [ + "in", + "class", + "river", + "stream", + "canal" + ], + [ + "==", + "brunnel", + "tunnel" + ] + ], + "type": "line", + "source": "openmaptiles", + "source-layer": "waterway", + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 6 + ] + ] + }, + "line-dasharray": [ + 2, + 4 + ] + }, + "minzoom": 14 + }, + { + "id": "waterway-other", + "type": "line", + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "!in", + "class", + "canal", + "river", + "stream" + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 2 + ] + ] + } + } + }, + { + "id": "waterway-stream-canal", + "type": "line", + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + [ + "in", + "class", + "canal", + "stream" + ], + [ + "!=", + "brunnel", + "tunnel" + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.3, + "stops": [ + [ + 13, + 0.5 + ], + [ + 20, + 6 + ] + ] + } + } + }, + { + "id": "waterway-river", + "type": "line", + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "source": "openmaptiles", + "source-layer": "waterway", + "filter": [ + "all", + [ + "==", + "class", + "river" + ], + [ + "!=", + "brunnel", + "tunnel" + ] + ], + "layout": { + "line-cap": "round" + }, + "paint": { + "line-color": "#a0c8f0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 10, + 0.8 + ], + [ + 20, + 6 + ] + ] + } + } + }, + { + "id": "water-offset", + "type": "fill", + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "source": "openmaptiles", + "source-layer": "water", + "maxzoom": 8, + "filter": [ + "==", + "$type", + "Polygon" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-opacity": 1, + "fill-color": "#a0c8f0", + "fill-translate": { + "base": 1, + "stops": [ + [ + 6, + [ + 2, + 0 + ] + ], + [ + 8, + [ + 0, + 0 + ] + ] + ] + } + } + }, + { + "id": "water", + "type": "fill", + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "source": "openmaptiles", + "source-layer": "water", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsl(210, 67%, 85%)" + } + }, + { + "id": "water-pattern", + "type": "fill", + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "source": "openmaptiles", + "source-layer": "water", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-translate": [ + 0, + 2.5 + ], + "fill-pattern": "wave" + } + }, + { + "id": "landcover-ice-shelf", + "type": "fill", + "metadata": { + "mapbox:group": "1444849382550.77" + }, + "source": "openmaptiles", + "source-layer": "landcover", + "filter": [ + "==", + "subclass", + "ice_shelf" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "#fff", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 0, + 0.9 + ], + [ + 10, + 0.3 + ] + ] + } + } + }, + { + "id": "building", + "type": "fill", + "metadata": { + "mapbox:group": "1444849364238.8171" + }, + "source": "openmaptiles", + "source-layer": "building", + "paint": { + "fill-color": { + "base": 1, + "stops": [ + [ + 15.5, + "#f2eae2" + ], + [ + 16, + "#dfdbd7" + ] + ] + }, + "fill-antialias": true + } + }, + { + "id": "building-top", + "type": "fill", + "metadata": { + "mapbox:group": "1444849364238.8171" + }, + "source": "openmaptiles", + "source-layer": "building", + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-translate": { + "base": 1, + "stops": [ + [ + 14, + [ + 0, + 0 + ] + ], + [ + 16, + [ + -2, + -2 + ] + ] + ] + }, + "fill-outline-color": "#dfdbd7", + "fill-color": "#f2eae2", + "fill-opacity": { + "base": 1, + "stops": [ + [ + 13, + 0 + ], + [ + 16, + 1 + ] + ] + } + } + }, + { + "id": "tunnel-service-track-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "service", + "track" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#cfcdca", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1 + ], + [ + 16, + 4 + ], + [ + 20, + 11 + ] + ] + } + } + }, + { + "id": "tunnel-minor-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "minor" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#cfcdca", + "line-opacity": { + "stops": [ + [ + 12, + 0 + ], + [ + 12.5, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 0.5 + ], + [ + 13, + 1 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + } + }, + { + "id": "tunnel-secondary-tertiary-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 17 + ] + ] + } + } + }, + { + "id": "tunnel-trunk-primary-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + } + }, + { + "id": "tunnel-motorway-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-dasharray": [ + 0.5, + 0.25 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + } + }, + { + "id": "tunnel-path", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "path" + ] + ] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [ + 1.5, + 0.75 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + } + } + }, + { + "id": "tunnel-service-track", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "service", + "track" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15.5, + 0 + ], + [ + 16, + 2 + ], + [ + 20, + 7.5 + ] + ] + } + } + }, + { + "id": "tunnel-minor", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "minor_road" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 13.5, + 0 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + } + }, + { + "id": "tunnel-secondary-tertiary", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff4c6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 10 + ] + ] + } + } + }, + { + "id": "tunnel-trunk-primary", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fff4c6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "tunnel-motorway", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#ffdaa6", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "tunnel-railway", + "type": "line", + "metadata": { + "mapbox:group": "1444849354174.1904" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "tunnel" + ], + [ + "==", + "class", + "rail" + ] + ], + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + }, + "line-dasharray": [ + 2, + 2 + ] + } + }, + { + "id": "ferry", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "in", + "class", + "ferry" + ] + ], + "layout": { + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(108, 159, 182, 1)", + "line-width": 1.1, + "line-dasharray": [ + 2, + 2 + ] + } + }, + { + "id": "aeroway-taxiway-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 12, + "filter": [ + "all", + [ + "in", + "class", + "taxiway" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 2 + ], + [ + 17, + 12 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "aeroway-runway-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 12, + "filter": [ + "all", + [ + "in", + "class", + "runway" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(153, 153, 153, 1)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 5 + ], + [ + 17, + 55 + ] + ] + }, + "line-opacity": 1 + } + }, + { + "id": "aeroway-area", + "type": "fill", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + [ + "==", + "$type", + "Polygon" + ], + [ + "in", + "class", + "runway", + "taxiway" + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-opacity": { + "base": 1, + "stops": [ + [ + 13, + 0 + ], + [ + 14, + 1 + ] + ] + }, + "fill-color": "rgba(255, 255, 255, 1)" + } + }, + { + "id": "aeroway-taxiway", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + [ + "in", + "class", + "taxiway" + ], + [ + "==", + "$type", + "LineString" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 1 + ], + [ + 17, + 10 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 11, + 0 + ], + [ + 12, + 1 + ] + ] + } + } + }, + { + "id": "aeroway-runway", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "aeroway", + "minzoom": 4, + "filter": [ + "all", + [ + "in", + "class", + "runway" + ], + [ + "==", + "$type", + "LineString" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "rgba(255, 255, 255, 1)", + "line-width": { + "base": 1.5, + "stops": [ + [ + 11, + 4 + ], + [ + 17, + 50 + ] + ] + }, + "line-opacity": { + "base": 1, + "stops": [ + [ + 11, + 0 + ], + [ + 12, + 1 + ] + ] + } + } + }, + { + "id": "highway-area", + "type": "fill", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "==", + "$type", + "Polygon" + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "fill-color": "hsla(0, 0%, 89%, 0.56)", + "fill-outline-color": "#cfcdca", + "fill-opacity": 0.9, + "fill-antialias": false + } + }, + { + "id": "highway-motorway-link-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + } + }, + { + "id": "highway-link-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + } + }, + { + "id": "highway-minor-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!=", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "minor", + "service", + "track" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#cfcdca", + "line-opacity": { + "stops": [ + [ + 12, + 0 + ], + [ + 12.5, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 0.5 + ], + [ + 13, + 1 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + } + }, + { + "id": "highway-secondary-tertiary-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 17 + ] + ] + } + } + }, + { + "id": "highway-primary-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary" + ] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": { + "stops": [ + [ + 7, + 0 + ], + [ + 8, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 7, + 0 + ], + [ + 8, + 0.6 + ], + [ + 9, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + } + }, + { + "id": "highway-trunk-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "trunk" + ] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": { + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 1 + ] + ] + }, + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + } + }, + { + "id": "highway-motorway-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 4, + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ], + "layout": { + "line-cap": "butt", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 4, + 0 + ], + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + }, + "line-opacity": { + "stops": [ + [ + 4, + 0 + ], + [ + 5, + 1 + ] + ] + } + } + }, + { + "id": "highway-path", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "path" + ] + ] + ], + "paint": { + "line-color": "#cba", + "line-dasharray": [ + 1.5, + 0.75 + ], + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + } + } + }, + { + "id": "highway-motorway-link", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 12, + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + } + }, + { + "id": "highway-link", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + } + }, + { + "id": "highway-minor", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!=", + "brunnel", + "tunnel" + ], + [ + "in", + "class", + "minor", + "service", + "track" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "#fff", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 13.5, + 0 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + } + }, + { + "id": "highway-secondary-tertiary", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 8, + 0.5 + ], + [ + 20, + 13 + ] + ] + } + } + }, + { + "id": "highway-primary", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "primary" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 8.5, + 0 + ], + [ + 9, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "highway-trunk", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "in", + "class", + "trunk" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "highway-motorway", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 5, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "motorway" + ] + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round", + "visibility": "visible" + }, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "railway-transit", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "transit" + ], + [ + "!in", + "brunnel", + "tunnel" + ] + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 20, + 1 + ] + ] + } + } + }, + { + "id": "railway-transit-hatching", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "transit" + ], + [ + "!in", + "brunnel", + "tunnel" + ] + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 2 + ], + [ + 20, + 6 + ] + ] + } + } + }, + { + "id": "railway-service", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "rail" + ], + [ + "has", + "service" + ] + ] + ], + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.77)", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 20, + 1 + ] + ] + } + } + }, + { + "id": "railway-service-hatching", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "class", + "rail" + ], + [ + "has", + "service" + ] + ] + ], + "layout": { + "visibility": "visible" + }, + "paint": { + "line-color": "hsla(0, 0%, 73%, 0.68)", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 2 + ], + [ + 20, + 6 + ] + ] + } + } + }, + { + "id": "railway", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!has", + "service" + ], + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "rail" + ] + ] + ], + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + } + }, + { + "id": "railway-hatching", + "type": "line", + "metadata": { + "mapbox:group": "1444849345966.4436" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "!has", + "service" + ], + [ + "!in", + "brunnel", + "bridge", + "tunnel" + ], + [ + "==", + "class", + "rail" + ] + ] + ], + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 3 + ], + [ + 20, + 8 + ] + ] + } + } + }, + { + "id": "bridge-motorway-link-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + } + }, + { + "id": "bridge-link-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 12, + 1 + ], + [ + 13, + 3 + ], + [ + 14, + 4 + ], + [ + 20, + 15 + ] + ] + } + } + }, + { + "id": "bridge-secondary-tertiary-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-opacity": 1, + "line-width": { + "base": 1.2, + "stops": [ + [ + 8, + 1.5 + ], + [ + 20, + 28 + ] + ] + } + } + }, + { + "id": "bridge-trunk-primary-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "hsl(28, 76%, 67%)", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 26 + ] + ] + } + } + }, + { + "id": "bridge-motorway-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#e9ac77", + "line-width": { + "base": 1.2, + "stops": [ + [ + 5, + 0.4 + ], + [ + 6, + 0.6 + ], + [ + 7, + 1.5 + ], + [ + 20, + 22 + ] + ] + } + } + }, + { + "id": "bridge-path-casing", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "path" + ] + ] + ], + "paint": { + "line-color": "#f8f4f0", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "bridge-path", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "path" + ] + ] + ], + "paint": { + "line-color": "#cba", + "line-width": { + "base": 1.2, + "stops": [ + [ + 15, + 1.2 + ], + [ + 20, + 4 + ] + ] + }, + "line-dasharray": [ + 1.5, + 0.75 + ] + } + }, + { + "id": "bridge-motorway-link", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway_link" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + } + }, + { + "id": "bridge-link", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary_link", + "secondary_link", + "tertiary_link", + "trunk_link" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 12.5, + 0 + ], + [ + 13, + 1.5 + ], + [ + 14, + 2.5 + ], + [ + 20, + 11.5 + ] + ] + } + } + }, + { + "id": "bridge-secondary-tertiary", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "secondary", + "tertiary" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 20 + ] + ] + } + } + }, + { + "id": "bridge-trunk-primary", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "in", + "class", + "primary", + "trunk" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fea", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "bridge-motorway", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "motorway" + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#fc8", + "line-width": { + "base": 1.2, + "stops": [ + [ + 6.5, + 0 + ], + [ + 7, + 0.5 + ], + [ + 20, + 18 + ] + ] + } + } + }, + { + "id": "bridge-railway", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "rail" + ] + ], + "paint": { + "line-color": "#bbb", + "line-width": { + "base": 1.4, + "stops": [ + [ + 14, + 0.4 + ], + [ + 15, + 0.75 + ], + [ + 20, + 2 + ] + ] + } + } + }, + { + "id": "bridge-railway-hatching", + "type": "line", + "metadata": { + "mapbox:group": "1444849334699.1902" + }, + "source": "openmaptiles", + "source-layer": "transportation", + "filter": [ + "all", + [ + "==", + "brunnel", + "bridge" + ], + [ + "==", + "class", + "rail" + ] + ], + "paint": { + "line-color": "#bbb", + "line-dasharray": [ + 0.2, + 8 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 14.5, + 0 + ], + [ + 15, + 3 + ], + [ + 20, + 8 + ] + ] + } + } + }, + { + "id": "cablecar", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "==", + "class", + "cable_car" + ], + "layout": { + "visibility": "visible", + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-width": { + "base": 1, + "stops": [ + [ + 11, + 1 + ], + [ + 19, + 2.5 + ] + ] + } + } + }, + { + "id": "cablecar-dash", + "type": "line", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 13, + "filter": [ + "==", + "class", + "cable_car" + ], + "layout": { + "visibility": "visible", + "line-cap": "round" + }, + "paint": { + "line-color": "hsl(0, 0%, 70%)", + "line-width": { + "base": 1, + "stops": [ + [ + 11, + 3 + ], + [ + 19, + 5.5 + ] + ] + }, + "line-dasharray": [ + 2, + 3 + ] + } + }, + { + "id": "boundary-land-level-4", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + ">=", + "admin_level", + 4 + ], + [ + "<=", + "admin_level", + 8 + ], + [ + "!=", + "maritime", + 1 + ] + ], + "layout": { + "line-join": "round" + }, + "paint": { + "line-color": "#9e9cab", + "line-dasharray": [ + 3, + 1, + 1, + 1 + ], + "line-width": { + "base": 1.4, + "stops": [ + [ + 4, + 0.4 + ], + [ + 5, + 1 + ], + [ + 12, + 3 + ] + ] + } + } + }, + { + "id": "boundary-land-level-2", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "==", + "admin_level", + 2 + ], + [ + "!=", + "maritime", + 1 + ], + [ + "!=", + "disputed", + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(248, 7%, 66%)", + "line-width": { + "base": 1, + "stops": [ + [ + 0, + 0.6 + ], + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 8 + ] + ] + } + } + }, + { + "id": "boundary-land-disputed", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "!=", + "maritime", + 1 + ], + [ + "==", + "disputed", + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "hsl(248, 7%, 70%)", + "line-dasharray": [ + 1, + 3 + ], + "line-width": { + "base": 1, + "stops": [ + [ + 0, + 0.6 + ], + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 8 + ] + ] + } + } + }, + { + "id": "boundary-water", + "type": "line", + "source": "openmaptiles", + "source-layer": "boundary", + "filter": [ + "all", + [ + "in", + "admin_level", + 2, + 4 + ], + [ + "==", + "maritime", + 1 + ] + ], + "layout": { + "line-cap": "round", + "line-join": "round" + }, + "paint": { + "line-color": "rgba(154, 189, 214, 1)", + "line-width": { + "base": 1, + "stops": [ + [ + 0, + 0.6 + ], + [ + 4, + 1.4 + ], + [ + 5, + 2 + ], + [ + 12, + 8 + ] + ] + }, + "line-opacity": { + "stops": [ + [ + 6, + 0.6 + ], + [ + 10, + 1 + ] + ] + } + } + }, + { + "id": "waterway-name", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "waterway", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "has", + "name" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Italic" + ], + "text-size": 14, + "text-field": "{name:latin} {name:nonlatin}", + "text-max-width": 5, + "text-rotation-alignment": "map", + "symbol-placement": "line", + "text-letter-spacing": 0.2, + "symbol-spacing": 350 + }, + "paint": { + "text-color": "#74aee9", + "text-halo-width": 1.5, + "text-halo-color": "rgba(255,255,255,0.7)" + } + }, + { + "id": "water-name-lakeline", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": [ + "==", + "$type", + "LineString" + ], + "layout": { + "text-font": [ + "Noto Sans Italic" + ], + "text-size": 14, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-max-width": 5, + "text-rotation-alignment": "map", + "symbol-placement": "line", + "symbol-spacing": 350, + "text-letter-spacing": 0.2 + }, + "paint": { + "text-color": "#74aee9", + "text-halo-width": 1.5, + "text-halo-color": "rgba(255,255,255,0.7)" + } + }, + { + "id": "water-name-ocean", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "==", + "class", + "ocean" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Italic" + ], + "text-size": 14, + "text-field": "{name:latin}", + "text-max-width": 5, + "text-rotation-alignment": "map", + "symbol-placement": "point", + "symbol-spacing": 350, + "text-letter-spacing": 0.2 + }, + "paint": { + "text-color": "#74aee9", + "text-halo-width": 1.5, + "text-halo-color": "rgba(255,255,255,0.7)" + } + }, + { + "id": "water-name-other", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "water_name", + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "!in", + "class", + "ocean" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Italic" + ], + "text-size": { + "stops": [ + [ + 0, + 10 + ], + [ + 6, + 14 + ] + ] + }, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-max-width": 5, + "text-rotation-alignment": "map", + "symbol-placement": "point", + "symbol-spacing": 350, + "text-letter-spacing": 0.2, + "visibility": "visible" + }, + "paint": { + "text-color": "#74aee9", + "text-halo-width": 1.5, + "text-halo-color": "rgba(255,255,255,0.7)" + } + }, + { + "id": "poi-level-3", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 16, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + ">=", + "rank", + 25 + ] + ], + "layout": { + "text-padding": 2, + "text-font": [ + "Noto Sans Regular" + ], + "text-anchor": "top", + "icon-image": "{class}_11", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12, + "text-max-width": 9 + }, + "paint": { + "text-halo-blur": 0.5, + "text-color": "#666", + "text-halo-width": 1, + "text-halo-color": "#ffffff" + } + }, + { + "id": "poi-level-2", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "<=", + "rank", + 24 + ], + [ + ">=", + "rank", + 15 + ] + ], + "layout": { + "text-padding": 2, + "text-font": [ + "Noto Sans Regular" + ], + "text-anchor": "top", + "icon-image": "{class}_11", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12, + "text-max-width": 9 + }, + "paint": { + "text-halo-blur": 0.5, + "text-color": "#666", + "text-halo-width": 1, + "text-halo-color": "#ffffff" + } + }, + { + "id": "poi-level-1", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 14, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "<=", + "rank", + 14 + ], + [ + "has", + "name" + ] + ], + "layout": { + "text-padding": 2, + "text-font": [ + "Noto Sans Regular" + ], + "text-anchor": "top", + "icon-image": "{class}_11", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12, + "text-max-width": 9 + }, + "paint": { + "text-halo-blur": 0.5, + "text-color": "#666", + "text-halo-width": 1, + "text-halo-color": "#ffffff" + } + }, + { + "id": "poi-railway", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "poi", + "minzoom": 13, + "filter": [ + "all", + [ + "==", + "$type", + "Point" + ], + [ + "has", + "name" + ], + [ + "==", + "class", + "railway" + ], + [ + "==", + "subclass", + "station" + ] + ], + "layout": { + "text-padding": 2, + "text-font": [ + "Noto Sans Regular" + ], + "text-anchor": "top", + "icon-image": "{class}_11", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12, + "text-max-width": 9, + "icon-optional": false, + "icon-ignore-placement": false, + "icon-allow-overlap": false, + "text-ignore-placement": false, + "text-allow-overlap": false, + "text-optional": true + }, + "paint": { + "text-halo-blur": 0.5, + "text-color": "#666", + "text-halo-width": 1, + "text-halo-color": "#ffffff" + } + }, + { + "id": "road_oneway", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + "oneway", + 1 + ], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": "oneway", + "symbol-spacing": 75, + "icon-padding": 2, + "icon-rotation-alignment": "map", + "icon-rotate": 90, + "icon-size": { + "stops": [ + [ + 15, + 0.5 + ], + [ + 19, + 1 + ] + ] + } + }, + "paint": { + "icon-opacity": 0.5 + } + }, + { + "id": "road_oneway_opposite", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + "oneway", + -1 + ], + [ + "in", + "class", + "motorway", + "trunk", + "primary", + "secondary", + "tertiary", + "minor", + "service" + ] + ], + "layout": { + "symbol-placement": "line", + "icon-image": "oneway", + "symbol-spacing": 75, + "icon-padding": 2, + "icon-rotation-alignment": "map", + "icon-rotate": -90, + "icon-size": { + "stops": [ + [ + 15, + 0.5 + ], + [ + 19, + 1 + ] + ] + } + }, + "paint": { + "icon-opacity": 0.5 + } + }, + { + "id": "highway-name-path", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15.5, + "filter": [ + "==", + "class", + "path" + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 14, + 13 + ] + ] + }, + "text-font": [ + "Noto Sans Regular" + ], + "text-field": "{name:latin} {name:nonlatin}", + "symbol-placement": "line", + "text-rotation-alignment": "map" + }, + "paint": { + "text-halo-color": "#f8f4f0", + "text-color": "hsl(30, 23%, 62%)", + "text-halo-width": 0.5 + } + }, + { + "id": "highway-name-minor", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 15, + "filter": [ + "all", + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "class", + "minor", + "service", + "track" + ] + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 14, + 13 + ] + ] + }, + "text-font": [ + "Noto Sans Regular" + ], + "text-field": "{name:latin} {name:nonlatin}", + "symbol-placement": "line", + "text-rotation-alignment": "map" + }, + "paint": { + "text-halo-blur": 0.5, + "text-color": "#765", + "text-halo-width": 1 + } + }, + { + "id": "highway-name-major", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 12.2, + "filter": [ + "in", + "class", + "primary", + "secondary", + "tertiary", + "trunk" + ], + "layout": { + "text-size": { + "base": 1, + "stops": [ + [ + 13, + 12 + ], + [ + 14, + 13 + ] + ] + }, + "text-font": [ + "Noto Sans Regular" + ], + "text-field": "{name:latin} {name:nonlatin}", + "symbol-placement": "line", + "text-rotation-alignment": "map" + }, + "paint": { + "text-halo-blur": 0.5, + "text-color": "#765", + "text-halo-width": 1 + } + }, + { + "id": "highway-shield", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 8, + "filter": [ + "all", + [ + "<=", + "ref_length", + 6 + ], + [ + "==", + "$type", + "LineString" + ], + [ + "!in", + "network", + "us-interstate", + "us-highway", + "us-state" + ] + ], + "layout": { + "text-size": 10, + "icon-image": "road_{ref_length}", + "icon-rotation-alignment": "viewport", + "symbol-spacing": 200, + "text-font": [ + "Noto Sans Regular" + ], + "symbol-placement": { + "base": 1, + "stops": [ + [ + 10, + "point" + ], + [ + 11, + "line" + ] + ] + }, + "text-rotation-alignment": "viewport", + "icon-size": 1, + "text-field": "{ref}" + }, + "paint": {} + }, + { + "id": "highway-shield-us-interstate", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 7, + "filter": [ + "all", + [ + "<=", + "ref_length", + 6 + ], + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "network", + "us-interstate" + ] + ], + "layout": { + "text-size": 10, + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "symbol-spacing": 200, + "text-font": [ + "Noto Sans Regular" + ], + "symbol-placement": { + "base": 1, + "stops": [ + [ + 7, + "point" + ], + [ + 7, + "line" + ], + [ + 8, + "line" + ] + ] + }, + "text-rotation-alignment": "viewport", + "icon-size": 1, + "text-field": "{ref}" + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)" + } + }, + { + "id": "highway-shield-us-other", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "transportation_name", + "minzoom": 9, + "filter": [ + "all", + [ + "<=", + "ref_length", + 6 + ], + [ + "==", + "$type", + "LineString" + ], + [ + "in", + "network", + "us-highway", + "us-state" + ] + ], + "layout": { + "text-size": 10, + "icon-image": "{network}_{ref_length}", + "icon-rotation-alignment": "viewport", + "symbol-spacing": 200, + "text-font": [ + "Noto Sans Regular" + ], + "symbol-placement": { + "base": 1, + "stops": [ + [ + 10, + "point" + ], + [ + 11, + "line" + ] + ] + }, + "text-rotation-alignment": "viewport", + "icon-size": 1, + "text-field": "{ref}" + }, + "paint": { + "text-color": "rgba(0, 0, 0, 1)" + } + }, + { + "id": "airport-label-major", + "type": "symbol", + "source": "openmaptiles", + "source-layer": "aerodrome_label", + "minzoom": 10, + "filter": [ + "all", + [ + "has", + "iata" + ] + ], + "layout": { + "text-padding": 2, + "text-font": [ + "Noto Sans Regular" + ], + "text-anchor": "top", + "icon-image": "airport_11", + "text-field": "{name:latin}\n{name:nonlatin}", + "text-offset": [ + 0, + 0.6 + ], + "text-size": 12, + "text-max-width": 9, + "visibility": "visible", + "icon-size": 1, + "text-optional": true + }, + "paint": { + "text-halo-blur": 0.5, + "text-color": "#666", + "text-halo-width": 1, + "text-halo-color": "#ffffff" + } + }, + { + "id": "place-other", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "!in", + "class", + "city", + "town", + "village", + "country", + "continent" + ], + "layout": { + "text-letter-spacing": 0.1, + "text-size": { + "base": 1.2, + "stops": [ + [ + 12, + 10 + ], + [ + 15, + 14 + ] + ] + }, + "text-font": [ + "Noto Sans Bold" + ], + "text-field": "{name:latin}\n{name:nonlatin}", + "text-transform": "uppercase", + "text-max-width": 9, + "visibility": "visible" + }, + "paint": { + "text-color": "#633", + "text-halo-width": 1.2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-village", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "==", + "class", + "village" + ], + "layout": { + "text-font": [ + "Noto Sans Regular" + ], + "text-size": { + "base": 1.2, + "stops": [ + [ + 10, + 12 + ], + [ + 15, + 22 + ] + ] + }, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-max-width": 8, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-width": 1.2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-town", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "==", + "class", + "town" + ], + "layout": { + "text-font": [ + "Noto Sans Regular" + ], + "text-size": { + "base": 1.2, + "stops": [ + [ + 10, + 14 + ], + [ + 15, + 24 + ] + ] + }, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-max-width": 8, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-width": 1.2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-city", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "!=", + "capital", + 2 + ], + [ + "==", + "class", + "city" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Regular" + ], + "text-size": { + "base": 1.2, + "stops": [ + [ + 7, + 14 + ], + [ + 11, + 24 + ] + ] + }, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-max-width": 8, + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-width": 1.2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-city-capital", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "==", + "capital", + 2 + ], + [ + "==", + "class", + "city" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Regular" + ], + "text-size": { + "base": 1.2, + "stops": [ + [ + 7, + 14 + ], + [ + 11, + 24 + ] + ] + }, + "text-field": "{name:latin}\n{name:nonlatin}", + "text-max-width": 8, + "icon-image": "star_11", + "text-offset": [ + 0.4, + 0 + ], + "icon-size": 0.8, + "text-anchor": "left", + "visibility": "visible" + }, + "paint": { + "text-color": "#333", + "text-halo-width": 1.2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-country-other", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + ">=", + "rank", + 3 + ], + [ + "!has", + "iso_a2" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Italic" + ], + "text-field": "{name:latin}", + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 7, + 17 + ] + ] + }, + "text-transform": "uppercase", + "text-max-width": 6.25, + "visibility": "visible" + }, + "paint": { + "text-halo-blur": 1, + "text-color": "#334", + "text-halo-width": 2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-country-3", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + ">=", + "rank", + 3 + ], + [ + "has", + "iso_a2" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Bold" + ], + "text-field": "{name:latin}", + "text-size": { + "stops": [ + [ + 3, + 11 + ], + [ + 7, + 17 + ] + ] + }, + "text-transform": "uppercase", + "text-max-width": 6.25, + "visibility": "visible" + }, + "paint": { + "text-halo-blur": 1, + "text-color": "#334", + "text-halo-width": 2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-country-2", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + "==", + "rank", + 2 + ], + [ + "has", + "iso_a2" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Bold" + ], + "text-field": "{name:latin}", + "text-size": { + "stops": [ + [ + 2, + 11 + ], + [ + 5, + 17 + ] + ] + }, + "text-transform": "uppercase", + "text-max-width": 6.25, + "visibility": "visible" + }, + "paint": { + "text-halo-blur": 1, + "text-color": "#334", + "text-halo-width": 2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-country-1", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "filter": [ + "all", + [ + "==", + "class", + "country" + ], + [ + "==", + "rank", + 1 + ], + [ + "has", + "iso_a2" + ] + ], + "layout": { + "text-font": [ + "Noto Sans Bold" + ], + "text-field": "{name:latin}", + "text-size": { + "stops": [ + [ + 1, + 11 + ], + [ + 4, + 17 + ] + ] + }, + "text-transform": "uppercase", + "text-max-width": 6.25, + "visibility": "visible" + }, + "paint": { + "text-halo-blur": 1, + "text-color": "#334", + "text-halo-width": 2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + }, + { + "id": "place-continent", + "type": "symbol", + "metadata": { + "mapbox:group": "1444849242106.713" + }, + "source": "openmaptiles", + "source-layer": "place", + "maxzoom": 1, + "filter": [ + "==", + "class", + "continent" + ], + "layout": { + "text-font": [ + "Noto Sans Bold" + ], + "text-field": "{name:latin}", + "text-size": 14, + "text-max-width": 6.25, + "text-transform": "uppercase", + "visibility": "visible" + }, + "paint": { + "text-halo-blur": 1, + "text-color": "#334", + "text-halo-width": 2, + "text-halo-color": "rgba(255,255,255,0.8)" + } + } + ], + "id": "osm-bright" +} diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 0000000..3612073 --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 0000000..b7f639a --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,8 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +export const environment = { + production: false +}; diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000..1b983b4 Binary files /dev/null and b/src/favicon.ico differ diff --git a/src/gisaf-icons.css b/src/gisaf-icons.css new file mode 100644 index 0000000..f1f164f --- /dev/null +++ b/src/gisaf-icons.css @@ -0,0 +1,27 @@ +@font-face { + font-family: 'GisafSymbols'; + src: url('/assets/fonts/GisafSymbols.ttf') format('TrueType'); + font-weight: normal; + font-style: normal; +} + +.gisaf,.gisaf-medium,.gisaf-intext,.gisaf-short,.gisaf-tall,.gisaf-grande,.gisaf-venti { + font-family: 'GisafSymbols', sans-serif; + display: inline-block; + font-weight: normal; + text-decoration: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.gisaf-intext { font-size: 1.5em; } + +.gisaf-short { font-size: small; } +.gisaf-tall { font-size: large; } +.gisaf-grande { font-size: 32px; } +.gisaf-venti { font-size: 64px; } + +.gisaf-live { font-size: 1em; } \ No newline at end of file diff --git a/src/icons.css b/src/icons.css new file mode 100644 index 0000000..866d6f5 --- /dev/null +++ b/src/icons.css @@ -0,0 +1,23 @@ +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: local('Material Icons'), local('MaterialIcons-Regular'), url(/assets/fonts/materialicons.woff2) format('woff2'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; +} diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..e127c81 --- /dev/null +++ b/src/index.html @@ -0,0 +1,33 @@ + + + + + Gisaf + + + + + + + +
    + +
    +
    + + \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..91ec6da --- /dev/null +++ b/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 0000000..6ae6df3 --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,28 @@ + + + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; + +// Add global to window, assigning the value of window itself. +(window as any).global = window; diff --git a/src/styles.css b/src/styles.css new file mode 100644 index 0000000..0edcd4f --- /dev/null +++ b/src/styles.css @@ -0,0 +1,69 @@ +/* Master Styles */ + +@import '@angular/material/prebuilt-themes/pink-bluegrey.css'; + +html, body { + box-sizing: border-box; + height: 100%; + margin: 0; +} + +body { + margin: 0; + overflow: hidden; + font-size: 80%; + font-family: Arial, Helvetica, sans-serif; +} + +.mat-mdc-raised-button, .mat-mdc-button { + padding: 0 5px ! important; + min-width: 68px ! important; +} + +#top-toolbar { + padding: 0; +} + +nav a:hover { + color: #efe00b; +} + +nav a.active { + color: #efe00b; +} + +.notif-error { + background-color: rgb(185, 30, 30); + color: rgb(255, 255, 255); +} + +.fill-space { + flex: 1 1 auto; +} + +[hidden] { display: none !important;} + +.mat-mdc-card-header-text { + width: 100% +} + +.noselect { + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Safari */ + -khtml-user-select: none; /* Konqueror HTML */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; /* Non-prefixed version, currently + supported by Chrome and Opera */ +} + +/* XXX: Mapbox-gl canvas, should be in gisaf-mapbox/gisaf-mapbax.component.css */ +.boxdraw { + background: rgba(56,135,190,0.1); + border: 2px solid #3887be; + position: absolute; + top: 0; + left: 0; + width: 0; + height: 0; +} \ No newline at end of file diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 0000000..ed7e259 --- /dev/null +++ b/src/test.ts @@ -0,0 +1,29 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +// Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. +declare const __karma__: any; + +// Prevent Karma from running prematurely. +__karma__.loaded = function () {}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting(), { + teardown: { destroyAfterEach: false } +} +); +// Finally, start Karma to run the tests. +__karma__.start(); diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json new file mode 100644 index 0000000..c1c97c7 --- /dev/null +++ b/src/tsconfig.app.json @@ -0,0 +1,12 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "types": [] + }, + "files": [ + "main.ts", + "polyfills.ts" + ] +} diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json new file mode 100644 index 0000000..fe8bdf7 --- /dev/null +++ b/src/tsconfig.spec.json @@ -0,0 +1,19 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} \ No newline at end of file diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 0000000..ef5c7bd --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,5 @@ +/* SystemJS module definition */ +declare var module: NodeModule; +interface NodeModule { + id: string; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..25783f8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "importHelpers": true, + "module": "es2020", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "experimentalDecorators": true, + "target": "ES2022", + "typeRoots": [ + "node_modules/@types", + "@types" + ], + "lib": [ + "es6", + "dom", + "esnext.asynciterable" + ], + "allowSyntheticDefaultImports": true, + "useDefineForClassFields": false + }, + "angularCompilerOptions": { + "strictTemplates": true + } +} \ No newline at end of file diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..9c4f00c --- /dev/null +++ b/tslint.json @@ -0,0 +1,142 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs", + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "no-output-on-prefix": true, + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +}